Title: [158482] trunk/Source/_javascript_Core
- Revision
- 158482
- Author
- fpi...@apple.com
- Date
- 2013-11-01 19:24:51 -0700 (Fri, 01 Nov 2013)
Log Message
FTL should use a simple optimization pipeline by default
https://bugs.webkit.org/show_bug.cgi?id=123638
Reviewed by Geoffrey Garen.
20% speed-up on imagine-gaussian-blur, when combined with --ftlUsesStackmaps=true.
* ftl/FTLCompile.cpp:
(JSC::FTL::compile):
* runtime/Options.h:
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (158481 => 158482)
--- trunk/Source/_javascript_Core/ChangeLog 2013-11-02 02:23:00 UTC (rev 158481)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-11-02 02:24:51 UTC (rev 158482)
@@ -1,3 +1,16 @@
+2013-11-01 Filip Pizlo <fpi...@apple.com>
+
+ FTL should use a simple optimization pipeline by default
+ https://bugs.webkit.org/show_bug.cgi?id=123638
+
+ Reviewed by Geoffrey Garen.
+
+ 20% speed-up on imagine-gaussian-blur, when combined with --ftlUsesStackmaps=true.
+
+ * ftl/FTLCompile.cpp:
+ (JSC::FTL::compile):
+ * runtime/Options.h:
+
2013-11-01 Andreas Kling <akl...@apple.com>
Neuter WTF_MAKE_FAST_ALLOCATED in GLOBAL_FASTMALLOC_NEW builds.
Modified: trunk/Source/_javascript_Core/ftl/FTLCompile.cpp (158481 => 158482)
--- trunk/Source/_javascript_Core/ftl/FTLCompile.cpp 2013-11-02 02:23:00 UTC (rev 158481)
+++ trunk/Source/_javascript_Core/ftl/FTLCompile.cpp 2013-11-02 02:24:51 UTC (rev 158482)
@@ -260,34 +260,51 @@
CRASH();
}
- LLVMPassManagerBuilderRef passBuilder = llvm->PassManagerBuilderCreate();
- llvm->PassManagerBuilderSetOptLevel(passBuilder, Options::llvmOptimizationLevel());
- llvm->PassManagerBuilderSetSizeLevel(passBuilder, Options::llvmSizeLevel());
+ LLVMPassManagerRef functionPasses = 0;
+ LLVMPassManagerRef modulePasses;
- LLVMPassManagerRef functionPasses = llvm->CreateFunctionPassManagerForModule(state.module);
- LLVMPassManagerRef modulePasses = llvm->CreatePassManager();
-
- llvm->AddTargetData(llvm->GetExecutionEngineTargetData(engine), modulePasses);
-
- llvm->PassManagerBuilderPopulateFunctionPassManager(passBuilder, functionPasses);
- llvm->PassManagerBuilderPopulateModulePassManager(passBuilder, modulePasses);
-
- llvm->PassManagerBuilderDispose(passBuilder);
+ if (Options::llvmSimpleOpt()) {
+ modulePasses = llvm->CreatePassManager();
+ llvm->AddTargetData(llvm->GetExecutionEngineTargetData(engine), modulePasses);
+ llvm->AddPromoteMemoryToRegisterPass(modulePasses);
+ llvm->AddConstantPropagationPass(modulePasses);
+ llvm->AddInstructionCombiningPass(modulePasses);
+ llvm->AddBasicAliasAnalysisPass(modulePasses);
+ llvm->AddTypeBasedAliasAnalysisPass(modulePasses);
+ llvm->AddGVNPass(modulePasses);
+ llvm->AddCFGSimplificationPass(modulePasses);
+ llvm->RunPassManager(modulePasses, state.module);
+ } else {
+ LLVMPassManagerBuilderRef passBuilder = llvm->PassManagerBuilderCreate();
+ llvm->PassManagerBuilderSetOptLevel(passBuilder, Options::llvmOptimizationLevel());
+ llvm->PassManagerBuilderSetSizeLevel(passBuilder, Options::llvmSizeLevel());
+
+ functionPasses = llvm->CreateFunctionPassManagerForModule(state.module);
+ modulePasses = llvm->CreatePassManager();
+
+ llvm->AddTargetData(llvm->GetExecutionEngineTargetData(engine), modulePasses);
+
+ llvm->PassManagerBuilderPopulateFunctionPassManager(passBuilder, functionPasses);
+ llvm->PassManagerBuilderPopulateModulePassManager(passBuilder, modulePasses);
+
+ llvm->PassManagerBuilderDispose(passBuilder);
+
+ llvm->InitializeFunctionPassManager(functionPasses);
+ for (LValue function = llvm->GetFirstFunction(state.module); function; function = llvm->GetNextFunction(function))
+ llvm->RunFunctionPassManager(functionPasses, function);
+ llvm->FinalizeFunctionPassManager(functionPasses);
+
+ llvm->RunPassManager(modulePasses, state.module);
+ }
- llvm->InitializeFunctionPassManager(functionPasses);
- for (LValue function = llvm->GetFirstFunction(state.module); function; function = llvm->GetNextFunction(function))
- llvm->RunFunctionPassManager(functionPasses, function);
- llvm->FinalizeFunctionPassManager(functionPasses);
-
- llvm->RunPassManager(modulePasses, state.module);
-
if (DFG::shouldShowDisassembly() || DFG::verboseCompilationEnabled())
state.dumpState("after optimization");
// FIXME: Need to add support for the case where JIT memory allocation failed.
// https://bugs.webkit.org/show_bug.cgi?id=113620
state.generatedFunction = reinterpret_cast<GeneratedFunction>(llvm->GetPointerToGlobal(engine, state.function));
- llvm->DisposePassManager(functionPasses);
+ if (functionPasses)
+ llvm->DisposePassManager(functionPasses);
llvm->DisposePassManager(modulePasses);
llvm->DisposeExecutionEngine(engine);
Modified: trunk/Source/_javascript_Core/runtime/Options.h (158481 => 158482)
--- trunk/Source/_javascript_Core/runtime/Options.h 2013-11-02 02:23:00 UTC (rev 158481)
+++ trunk/Source/_javascript_Core/runtime/Options.h 2013-11-02 02:24:51 UTC (rev 158482)
@@ -131,6 +131,7 @@
v(bool, dumpLLVMIR, false) \
v(bool, llvmAlwaysFailsBeforeCompile, false) \
v(bool, llvmAlwaysFailsBeforeLink, false) \
+ v(bool, llvmSimpleOpt, true) \
v(unsigned, llvmBackendOptimizationLevel, 2) \
v(unsigned, llvmOptimizationLevel, 2) \
v(unsigned, llvmSizeLevel, 0) \
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes