]> granicus.if.org Git - llvm/commitdiff
[PassManager] Run global optimizations after the inliner.
authorDavide Italiano <davide@freebsd.org>
Thu, 5 Oct 2017 18:06:37 +0000 (18:06 +0000)
committerDavide Italiano <davide@freebsd.org>
Thu, 5 Oct 2017 18:06:37 +0000 (18:06 +0000)
The inliner performs some kind of dead code elimination as it goes,
but there are cases that are not really caught by it. We might
at some point consider teaching the inliner about them, but it
is OK for now to run GlobalOpt + GlobalDCE in tandem as their
benefits generally outweight the cost, making the whole pipeline
faster.

This fixes PR34652.

Differential Revision: https://reviews.llvm.org/D38154

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314997 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/PassManagerBuilder.cpp
test/CodeGen/AMDGPU/early-inline.ll
test/Other/pass-pipelines.ll

index d23892292c32f755d8f3e0e69f2e40ad35924ab7..1a17508d2b233a76e2f1dafe3592a92afe4609de 100644 (file)
@@ -489,9 +489,11 @@ void PassManagerBuilder::populateModulePassManager(
   // Start of CallGraph SCC passes.
   if (!DisableUnitAtATime)
     MPM.add(createPruneEHPass()); // Remove dead EH info
+  bool RunInliner = false;
   if (Inliner) {
     MPM.add(Inliner);
     Inliner = nullptr;
+    RunInliner = true;
   }
   if (!DisableUnitAtATime)
     MPM.add(createPostOrderFunctionAttrsLegacyPass());
@@ -505,6 +507,18 @@ void PassManagerBuilder::populateModulePassManager(
   // pass manager that we are specifically trying to avoid. To prevent this
   // we must insert a no-op module pass to reset the pass manager.
   MPM.add(createBarrierNoopPass());
+
+  // The inliner performs some kind of dead code elimination as it goes,
+  // but there are cases that are not really caught by it. We might
+  // at some point consider teaching the inliner about them, but it
+  // is OK for now to run GlobalOpt + GlobalDCE in tandem as their
+  // benefits generally outweight the cost, making the whole pipeline
+  // faster.
+  if (RunInliner) {
+    MPM.add(createGlobalOptimizerPass());
+    MPM.add(createGlobalDCEPass());
+  }
+
   if (RunPartialInlining)
     MPM.add(createPartialInliningPass());
 
index c871d54bec7ed623c1c6ab3730da85c5d9c8bc72..a4f970ee238a8ffc3d362da2d3bd681290ad40eb 100644 (file)
@@ -1,6 +1,5 @@
 ; RUN: opt -mtriple=amdgcn-- -O1 -S -inline-threshold=1 -amdgpu-early-inline-all %s | FileCheck %s
 
-; CHECK: @c_alias
 @c_alias = alias i32 (i32), i32 (i32)* @callee
 
 define i32 @callee(i32 %x) {
@@ -17,6 +16,7 @@ entry:
 ; CHECK: mul i32
 ; CHECK-NOT: call i32
 
+; CHECK: define i32 @c_alias
 define amdgpu_kernel void @caller(i32 %x) {
 entry:
   %res = call i32 @callee(i32 %x)
index d47c02ee7a4691c9b71074742eed2b08ede9dc48..9ecfc4f6201e3c12c3c6ecb50599215bb2aafac2 100644 (file)
@@ -56,6 +56,8 @@
 ; a barrier pass.
 ; CHECK-O2: A No-Op Barrier Pass
 ; Reduce the size of the IR ASAP after the inliner.
+; CHECK-O2-NEXT: Global Variable Optimizer
+; CHECK-O2: Dead Global Elimination
 ; CHECK-O2-NEXT: Eliminate Available Externally
 ; Inferring function attribute should be right after the CGSCC pipeline, before
 ; any other optimizations/analyses.