[PATCH] D62560: Fix a crash when the default of a switch is removed
Phabricator via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 3 10:51:40 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL362427: Fix a crash when the default of a switch is removed (authored by akaylor, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D62560?vs=202058&id=202755#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62560/new/
https://reviews.llvm.org/D62560
Files:
llvm/trunk/lib/Transforms/Utils/LowerSwitch.cpp
llvm/trunk/test/Transforms/LowerSwitch/condition-phi-unreachable-default.ll
Index: llvm/trunk/lib/Transforms/Utils/LowerSwitch.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/LowerSwitch.cpp
+++ llvm/trunk/lib/Transforms/Utils/LowerSwitch.cpp
@@ -584,6 +584,11 @@
PopSucc->removePredecessor(OrigBlock);
return;
}
+
+ // If the condition was a PHI node with the switch block as a predecessor
+ // removing predecessors may have caused the condition to be erased.
+ // Getting the condition value again here protects against that.
+ Val = SI->getCondition();
}
// Create a new, empty default block so that the new hierarchy of
Index: llvm/trunk/test/Transforms/LowerSwitch/condition-phi-unreachable-default.ll
===================================================================
--- llvm/trunk/test/Transforms/LowerSwitch/condition-phi-unreachable-default.ll
+++ llvm/trunk/test/Transforms/LowerSwitch/condition-phi-unreachable-default.ll
@@ -0,0 +1,36 @@
+; RUN: opt < %s -lowerswitch -S | FileCheck %s
+
+; This test verifies -lowerswitch does not crash when an removing an
+; unreachable default branch causes a PHI node used as the switch
+; condition to be erased.
+
+define void @f() local_unnamed_addr {
+entry:
+ br label %sw.epilog
+
+sw.epilog: ; preds = %sw.epilog.outer, %for.body
+ %i = phi i32 [ undef, %for.body ], [ 0, %entry ]
+ br i1 undef, label %for.body, label %for.end
+
+for.body: ; preds = %sw.epilog
+ switch i32 %i, label %sw.epilog [
+ i32 0, label %sw.epilog.outer.backedge.loopexit
+ i32 1, label %sw.epilog.outer.backedge
+ ]
+
+sw.epilog.outer.backedge.loopexit: ; preds = %for.body
+ br label %for.end
+
+sw.epilog.outer.backedge: ; preds = %for.body
+ unreachable
+
+for.end: ; preds = %sw.epilog
+ ret void
+}
+
+; The phi and the switch should both be eliminated.
+; CHECK: @f()
+; CHECK: sw.epilog:
+; CHECK-NOT: phi
+; CHECK: for.body:
+; CHECK-NOT: switch
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62560.202755.patch
Type: text/x-patch
Size: 2089 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190603/4519b2fc/attachment-0001.bin>
More information about the llvm-commits
mailing list