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

Reply via email to