[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