diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index 9632f5194..09314452f 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -10,6 +10,9 @@ #include #include +#include +#include + #include #include "Type.h" @@ -264,6 +267,11 @@ std::unique_ptr Compiler::compile(bytesConstRef bytecode) dump(); } + llvm::FunctionPassManager fpManager(module.get()); + fpManager.add(llvm::createLowerSwitchPass()); + fpManager.doInitialization(); + fpManager.run(*m_mainFunc); + return module; } diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index af5f96ac7..6363f6d72 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -2,6 +2,7 @@ #include "ExecutionEngine.h" #include +#include #include #include @@ -72,7 +73,13 @@ int ExecutionEngine::run(std::unique_ptr _module, u256& _gas, ExtV if (!exec) BOOST_THROW_EXCEPTION(Exception() << errinfo_comment(errorMsg)); _module.release(); // Successfully created llvm::ExecutionEngine takes ownership of the module + + auto finalizationStartTime = std::chrono::high_resolution_clock::now(); exec->finalizeObject(); + auto finalizationEndTime = std::chrono::high_resolution_clock::now(); + std::cerr << "*** Module finalization time: " + << std::chrono::duration_cast(finalizationEndTime - finalizationStartTime).count() + << std::endl; // Create fake ExtVM interface if (!_ext) @@ -107,9 +114,17 @@ int ExecutionEngine::run(std::unique_ptr _module, u256& _gas, ExtV auto r = setjmp(buf); if (r == 0) { + auto executionStartTime = std::chrono::high_resolution_clock::now(); + rt_jmpBuf = &buf; auto result = exec->runFunction(entryFunc, {}); returnCode = static_cast(result.IntVal.getZExtValue()); + + auto executionEndTime = std::chrono::high_resolution_clock::now(); + std::cerr << "*** Execution time: " + << std::chrono::duration_cast(executionEndTime - executionStartTime).count() + << std::endl; + } else returnCode = static_cast(r);