[llvm] r287379 - [LoopSimplify] Preserve LCSSA when removing edges from unreachable blocks.
Michael Zolotukhin via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 18 13:01:12 PST 2016
Author: mzolotukhin
Date: Fri Nov 18 15:01:12 2016
New Revision: 287379
URL: http://llvm.org/viewvc/llvm-project?rev=287379&view=rev
Log:
[LoopSimplify] Preserve LCSSA when removing edges from unreachable blocks.
This fixes PR30454.
Added:
llvm/trunk/test/Transforms/LoopSimplify/pr30454.ll
Modified:
llvm/trunk/include/llvm/Transforms/Utils/Local.h
llvm/trunk/lib/Transforms/Utils/Local.cpp
llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
Modified: llvm/trunk/include/llvm/Transforms/Utils/Local.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/Local.h?rev=287379&r1=287378&r2=287379&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/Local.h (original)
+++ llvm/trunk/include/llvm/Transforms/Utils/Local.h Fri Nov 18 15:01:12 2016
@@ -312,7 +312,8 @@ unsigned removeAllNonTerminatorAndEHPadI
/// Insert an unreachable instruction before the specified
/// instruction, making it and the rest of the code in the block dead.
-unsigned changeToUnreachable(Instruction *I, bool UseLLVMTrap);
+unsigned changeToUnreachable(Instruction *I, bool UseLLVMTrap,
+ bool PreserveLCSSA = false);
/// Convert the CallInst to InvokeInst with the specified unwind edge basic
/// block. This also splits the basic block where CI is located, because
Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=287379&r1=287378&r2=287379&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/Local.cpp Fri Nov 18 15:01:12 2016
@@ -1369,12 +1369,13 @@ unsigned llvm::removeAllNonTerminatorAnd
return NumDeadInst;
}
-unsigned llvm::changeToUnreachable(Instruction *I, bool UseLLVMTrap) {
+unsigned llvm::changeToUnreachable(Instruction *I, bool UseLLVMTrap,
+ bool PreserveLCSSA) {
BasicBlock *BB = I->getParent();
// Loop over all of the successors, removing BB's entry from any PHI
// nodes.
for (BasicBlock *Successor : successors(BB))
- Successor->removePredecessor(BB);
+ Successor->removePredecessor(BB, PreserveLCSSA);
// Insert a call to llvm.trap right before this. This turns the undefined
// behavior into a hard fail instead of falling through into random code.
Modified: llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp?rev=287379&r1=287378&r2=287379&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp Fri Nov 18 15:01:12 2016
@@ -530,7 +530,7 @@ ReprocessLoop:
// Zap the dead pred's terminator and replace it with unreachable.
TerminatorInst *TI = P->getTerminator();
- changeToUnreachable(TI, /*UseLLVMTrap=*/false);
+ changeToUnreachable(TI, /*UseLLVMTrap=*/false, PreserveLCSSA);
Changed = true;
}
}
Added: llvm/trunk/test/Transforms/LoopSimplify/pr30454.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplify/pr30454.ll?rev=287379&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopSimplify/pr30454.ll (added)
+++ llvm/trunk/test/Transforms/LoopSimplify/pr30454.ll Fri Nov 18 15:01:12 2016
@@ -0,0 +1,32 @@
+; RUN: opt < %s -lcssa -licm -S | FileCheck %s
+; PR30454
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare i8 @bar()
+
+; Test that we preserve LCSSA form when removing edges from unreachable blocks.
+; CHECK-LABEL: @foo
+define void @foo() {
+entry:
+ br label %for.cond
+
+for.cond:
+ %x = phi i8 [ undef, %entry ], [ %y, %for.latch ]
+ br i1 undef, label %for.latch, label %exit
+
+; CHECK: unreachable.bb:
+; CHECK-NEXT: unreachable
+unreachable.bb:
+ br i1 undef, label %exit, label %for.latch
+
+for.latch:
+ %y = call i8 @bar()
+ br label %for.cond
+
+; CHECK: exit:
+; CHECK-NEXT: %x.lcssa = phi i8 [ %x, %for.cond ]
+exit:
+ %z = zext i8 %x to i32
+ ret void
+}
More information about the llvm-commits
mailing list