[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