[PATCH] D51280: [CloneFunction] Constant fold terminators before checking single predecessor
Mikael Holmén via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 28 05:41:08 PDT 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL340820: [CloneFunction] Constant fold terminators before checking single predecessor (authored by uabelho, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D51280?vs=162835&id=162837#toc
Repository:
rL LLVM
https://reviews.llvm.org/D51280
Files:
llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
llvm/trunk/test/Transforms/Inline/infinite-loop-two-predecessors.ll
Index: llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
+++ llvm/trunk/lib/Transforms/Utils/CloneFunction.cpp
@@ -636,6 +636,22 @@
Function::iterator Begin = cast<BasicBlock>(VMap[StartingBB])->getIterator();
Function::iterator I = Begin;
while (I != NewFunc->end()) {
+ // We need to simplify conditional branches and switches with a constant
+ // operand. We try to prune these out when cloning, but if the
+ // simplification required looking through PHI nodes, those are only
+ // available after forming the full basic block. That may leave some here,
+ // and we still want to prune the dead code as early as possible.
+ //
+ // Do the folding before we check if the block is dead since we want code
+ // like
+ // bb:
+ // br i1 undef, label %bb, label %bb
+ // to be simplified to
+ // bb:
+ // br label %bb
+ // before we call I->getSinglePredecessor().
+ ConstantFoldTerminator(&*I);
+
// Check if this block has become dead during inlining or other
// simplifications. Note that the first block will appear dead, as it has
// not yet been wired up properly.
@@ -646,13 +662,6 @@
continue;
}
- // We need to simplify conditional branches and switches with a constant
- // operand. We try to prune these out when cloning, but if the
- // simplification required looking through PHI nodes, those are only
- // available after forming the full basic block. That may leave some here,
- // and we still want to prune the dead code as early as possible.
- ConstantFoldTerminator(&*I);
-
BranchInst *BI = dyn_cast<BranchInst>(I->getTerminator());
if (!BI || BI->isConditional()) { ++I; continue; }
Index: llvm/trunk/test/Transforms/Inline/infinite-loop-two-predecessors.ll
===================================================================
--- llvm/trunk/test/Transforms/Inline/infinite-loop-two-predecessors.ll
+++ llvm/trunk/test/Transforms/Inline/infinite-loop-two-predecessors.ll
@@ -0,0 +1,32 @@
+; RUN: opt -S -o - %s -inline | FileCheck %s
+
+define void @f1() {
+bb.0:
+ br i1 false, label %bb.2, label %bb.1
+
+bb.1: ; preds = %bb.0
+ br label %bb.2
+
+bb.2: ; preds = %bb.0, %bb.1
+ %tmp0 = phi i1 [ true, %bb.1 ], [ false, %bb.0 ]
+ br i1 %tmp0, label %bb.4, label %bb.3
+
+bb.3: ; preds = %bb.3, %bb.3
+ br i1 undef, label %bb.3, label %bb.3
+
+bb.4: ; preds = %bb.2
+ ret void
+}
+
+define void @f2() {
+bb.0:
+ call void @f1()
+ ret void
+}
+
+; f1 should be inlined into f2 and simplified/collapsed to nothing.
+
+; CHECK-LABEL: define void @f2() {
+; CHECK-NEXT: bb.0:
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51280.162837.patch
Type: text/x-patch
Size: 2963 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180828/9e9228b4/attachment.bin>
More information about the llvm-commits
mailing list