diff options
| author | Geoff Berry <gberry@codeaurora.org> | 2016-12-14 19:38:22 +0000 |
|---|---|---|
| committer | Geoff Berry <gberry@codeaurora.org> | 2016-12-14 19:38:22 +0000 |
| commit | ca11a1e14769187a8111f3a4086221b657167656 (patch) | |
| tree | 2d572d1e70d41405fa707f830854371dfbd88508 /llvm | |
| parent | 09558cb8a46e7b72f0da67241d7d4b01ee8fa025 (diff) | |
| download | bcm5719-llvm-ca11a1e14769187a8111f3a4086221b657167656.tar.gz bcm5719-llvm-ca11a1e14769187a8111f3a4086221b657167656.zip | |
[GVNHoist] Move GVNHoist to function simplification part of pipeline.
Summary:
Move GVNHoist to later in the optimization pipeline, specifically, to
the function simplification part of the pipeline. The new pipeline
location allows GVNHoist to run on a function after its callees have
been inlined but before the function has been considered for inlining
into its callers, exposing more opportunities for hoisting.
Performance results on AArch64 kryo:
Improvements:
Benchmarks/CoyoteBench/fftbench -24.952%
spec2006/bzip2 -4.071%
internal bmark -3.177%
Benchmarks/PAQ8p/paq8p -1.754%
spec2000/perlbmk -1.328%
spec2006/h264ref -1.140%
Regressions:
internal bmark +1.818%
Benchmarks/mafft/pairlocalalign +1.084%
Reviewers: sebpop, dberlin, hiraditya
Subscribers: aemerson, mehdi_amini, mcrosier, llvm-commits
Differential Revision: https://reviews.llvm.org/D27722
llvm-svn: 289696
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/GVNHoist/hoist-inline.ll | 38 |
2 files changed, 40 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 254a7461980..5c26c665405 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -249,8 +249,6 @@ void PassManagerBuilder::populateFunctionPassManager( FPM.add(createCFGSimplificationPass()); FPM.add(createSROAPass()); FPM.add(createEarlyCSEPass()); - if(EnableGVNHoist) - FPM.add(createGVNHoistPass()); FPM.add(createLowerExpectIntrinsicPass()); } @@ -295,6 +293,8 @@ void PassManagerBuilder::addFunctionSimplificationPasses( // Break up aggregate allocas, using SSAUpdater. MPM.add(createSROAPass()); MPM.add(createEarlyCSEPass()); // Catch trivial redundancies + if(EnableGVNHoist) + MPM.add(createGVNHoistPass()); // Speculative execution if the target has divergent branches; otherwise nop. MPM.add(createSpeculativeExecutionIfHasBranchDivergencePass()); MPM.add(createJumpThreadingPass()); // Thread jumps. diff --git a/llvm/test/Transforms/GVNHoist/hoist-inline.ll b/llvm/test/Transforms/GVNHoist/hoist-inline.ll new file mode 100644 index 00000000000..7d761486ab1 --- /dev/null +++ b/llvm/test/Transforms/GVNHoist/hoist-inline.ll @@ -0,0 +1,38 @@ +; RUN: opt -S -O2 < %s | FileCheck %s + +; Check that the inlined loads are hoisted. +; CHECK-LABEL: define i32 @fun( +; CHECK-LABEL: entry: +; CHECK: load i32, i32* @A +; CHECK: if.then: + +@A = external global i32 +@B = external global i32 +@C = external global i32 + +define i32 @loadA() { + %a = load i32, i32* @A + ret i32 %a +} + +define i32 @fun(i1 %c) { +entry: + br i1 %c, label %if.then, label %if.else + +if.then: + store i32 1, i32* @B + %call1 = call i32 @loadA() + store i32 2, i32* @C + br label %if.endif + +if.else: + store i32 2, i32* @C + %call2 = call i32 @loadA() + store i32 1, i32* @B + br label %if.endif + +if.endif: + %ret = phi i32 [ %call1, %if.then ], [ %call2, %if.else ] + ret i32 %ret +} + |

