[PATCH] D40639: Bail out of a SimplifyCFG switch table opt at undef values.

Jesper Antonsson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 1 06:19:43 PST 2017


JesperAntonsson updated this revision to Diff 125124.
JesperAntonsson added a comment.

The testcase could fail on other targets, since the label names could become different.  Therefore, the checks were relaxed, since the test really only needs to verify that it doesn't crash and emits some code.


https://reviews.llvm.org/D40639

Files:
  lib/Transforms/Utils/SimplifyCFG.cpp
  test/Transforms/SimplifyCFG/switch_undef.ll


Index: test/Transforms/SimplifyCFG/switch_undef.ll
===================================================================
--- /dev/null
+++ test/Transforms/SimplifyCFG/switch_undef.ll
@@ -0,0 +1,23 @@
+; RUN: opt %s -keep-loops=false -switch-to-lookup=true -simplifycfg -S | FileCheck %s
+
+define void @f6() #0 {
+; CHECK-LABEL: entry:
+
+entry:
+  br label %for.cond.i
+
+for.cond.i:                                       ; preds = %f1.exit.i, %entry
+  switch i16 undef, label %f1.exit.i [
+    i16 -1, label %cond.false.i3.i
+    i16 1, label %cond.false.i3.i
+    i16 0, label %cond.false.i3.i
+  ]
+
+cond.false.i3.i:                                  ; preds = %for.cond.i, %for.cond.i, %for.cond.i
+  br label %f1.exit.i
+
+f1.exit.i:                                        ; preds = %cond.false.i3.i, %for.cond.i
+  %cond.i4.i = phi i16 [ undef, %cond.false.i3.i ], [ 1, %for.cond.i ]
+  %tobool7.i = icmp ne i16 %cond.i4.i, 0
+  br label %for.cond.i
+}
Index: lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- lib/Transforms/Utils/SimplifyCFG.cpp
+++ lib/Transforms/Utils/SimplifyCFG.cpp
@@ -5174,7 +5174,7 @@
   for (auto ValuePair : Values) {
     Constant *CaseConst = ConstantExpr::getICmp(CmpInst->getPredicate(),
                                                 ValuePair.second, CmpOp1, true);
-    if (!CaseConst || CaseConst == DefaultConst)
+    if (!CaseConst || CaseConst == DefaultConst || isa<UndefValue>(CaseConst))
       return;
     assert((CaseConst == TrueConst || CaseConst == FalseConst) &&
            "Expect true or false as compare result.");


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40639.125124.patch
Type: text/x-patch
Size: 1634 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171201/94035971/attachment.bin>


More information about the llvm-commits mailing list