[llvm] r319537 - Bail out of a SimplifyCFG switch table opt at undef values.
Mikael Holmen via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 1 04:30:50 PST 2017
Author: uabelho
Date: Fri Dec 1 04:30:49 2017
New Revision: 319537
URL: http://llvm.org/viewvc/llvm-project?rev=319537&view=rev
Log:
Bail out of a SimplifyCFG switch table opt at undef values.
Summary:
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.
Patch by: JesperAntonsson
Reviewers: spatel, eeckstein, hans
Reviewed By: hans
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D40639
Added:
llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll
Modified:
llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=319537&r1=319536&r2=319537&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Fri Dec 1 04:30:49 2017
@@ -5174,7 +5174,7 @@ static void reuseTableCompare(
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.");
Added: llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll?rev=319537&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll (added)
+++ llvm/trunk/test/Transforms/SimplifyCFG/switch_undef.ll Fri Dec 1 04:30:49 2017
@@ -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
+}
More information about the llvm-commits
mailing list