[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
Thu Nov 30 01:09:03 PST 2017


JesperAntonsson created this revision.

A true or false result is expected from a comparison, but it seems the possibility of undef was overlooked, which could lead to a failed assert. This is fixed by this patch by bailing out if we encounter undef.

      

The bug is old and the assert has been there since the end of 2014, so it seems this is unusual enough to forego optimization.


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,27 @@
+; RUN: opt %s -keep-loops=false -switch-to-lookup=true -simplifycfg -S | FileCheck %s
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @f6() #0 {
+; CHECK-LABEL: entry:
+; CHECK-NEXT:  br label %f1.exit.i
+; CHECK-LABEL: f1.exit.i:
+
+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.124880.patch
Type: text/x-patch
Size: 1743 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171130/bd08ceb7/attachment.bin>


More information about the llvm-commits mailing list