[PATCH] D62560: Fix a crash when the default of a switch is removed
Andy Kaylor via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 29 14:39:06 PDT 2019
andrew.w.kaylor updated this revision to Diff 202058.
andrew.w.kaylor added a comment.
Updated test case
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62560/new/
https://reviews.llvm.org/D62560
Files:
lib/Transforms/Utils/LowerSwitch.cpp
test/Transforms/LowerSwitch/condition-phi-unreachable-default.ll
Index: test/Transforms/LowerSwitch/condition-phi-unreachable-default.ll
===================================================================
--- /dev/null
+++ 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
Index: lib/Transforms/Utils/LowerSwitch.cpp
===================================================================
--- lib/Transforms/Utils/LowerSwitch.cpp
+++ 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62560.202058.patch
Type: text/x-patch
Size: 1968 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190529/4d43e574/attachment.bin>
More information about the llvm-commits
mailing list