[llvm] r307215 - [GlobalOpt] Remove unreachable blocks before optimizing a function.

Davide Italiano via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 5 15:28:29 PDT 2017


Author: davide
Date: Wed Jul  5 15:28:28 2017
New Revision: 307215

URL: http://llvm.org/viewvc/llvm-project?rev=307215&view=rev
Log:
[GlobalOpt] Remove unreachable blocks before optimizing a function.

LLVM's definition of dominance allows instructions that are cyclic
in unreachable blocks, e.g.:

  %pat = select i1 %condition, @global, i16* %pat

because any instruction dominates an instruction in a block that's
not reachable from entry.
So, remove unreachable blocks from the function, because a) there's
no point in analyzing them and b) GlobalOpt should otherwise grow
some more complicated logic to break these cycles.

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

Added:
    llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll
Modified:
    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp

Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=307215&r1=307214&r2=307215&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Wed Jul  5 15:28:28 2017
@@ -2026,6 +2026,24 @@ OptimizeFunctions(Module &M, TargetLibra
       continue;
     }
 
+    // LLVM's definition of dominance allows instructions that are cyclic
+    // in unreachable blocks, e.g.:
+    // %pat = select i1 %condition, @global, i16* %pat
+    // because any instruction dominates an instruction in a block that's
+    // not reachable from entry.
+    // So, remove unreachable blocks from the function, because a) there's
+    // no point in analyzing them and b) GlobalOpt should otherwise grow
+    // some more complicated logic to break these cycles.
+    // Removing unreachable blocks might invalidate the dominator so we
+    // recalculate it.
+    if (!F->isDeclaration()) {
+      if (removeUnreachableBlocks(*F)) {
+        auto &DT = LookupDomTree(*F);
+        DT.recalculate(*F);
+        Changed = true;
+      }
+    }
+
     Changed |= processGlobal(*F, TLI, LookupDomTree);
 
     if (!F->hasLocalLinkage())

Added: llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll?rev=307215&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll (added)
+++ llvm/trunk/test/Transforms/GlobalOpt/pr33686.ll Wed Jul  5 15:28:28 2017
@@ -0,0 +1,17 @@
+; RUN: opt -S -globalopt %s | FileCheck %s
+
+; CHECK-LABEL: define void @beth
+; CHECK-NEXT:   entry:
+; CHECK-NEXT:   ret void
+; CHEC-NEXT:  }
+
+ at glob = external global i16, align 1
+
+define void @beth() {
+entry:
+  ret void
+
+notreachable:
+  %patatino = select i1 undef, i16* @glob, i16* %patatino
+  br label %notreachable
+}




More information about the llvm-commits mailing list