[PATCH] D25466: [InstCombine] Fix constexpr issue in select combining
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 11 04:18:07 PDT 2016
RKSimon created this revision.
RKSimon added reviewers: majnemer, bogner, andreadb, spatel.
RKSimon added a subscriber: llvm-commits.
RKSimon set the repository for this revision to rL LLVM.
As discussed by Andrea on PR30486, we have an unsafe cast to an Instruction type in the select combine which doesn't take into account that it could be a ConstantExpr instead.
Repository:
rL LLVM
https://reviews.llvm.org/D25466
Files:
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/switch-constant-expr.ll
Index: test/Transforms/InstCombine/switch-constant-expr.ll
===================================================================
--- test/Transforms/InstCombine/switch-constant-expr.ll
+++ test/Transforms/InstCombine/switch-constant-expr.ll
@@ -0,0 +1,17 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+ at g = global i32 0
+
+; PR30486
+define i32 @func() {
+; CHECK-LABEL: @func(
+; CHECK-NEXT: switch i32 ptrtoint (i32* @g to i32), label %x [
+; CHECK-NEXT: ]
+; CHECK: x:
+; CHECK-NEXT: ret i32 0
+;
+ switch i32 add (i32 ptrtoint (i32* @g to i32), i32 -1), label %x []
+x:
+ ret i32 0
+}
Index: lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- lib/Transforms/InstCombine/InstructionCombining.cpp
+++ lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2271,9 +2271,9 @@
SI.getContext(), C.getCaseValue()->getValue().trunc(NewWidth)));
}
+ Value *Op0 = nullptr;
ConstantInt *AddRHS = nullptr;
- if (match(Cond, m_Add(m_Value(), m_ConstantInt(AddRHS)))) {
- Instruction *I = cast<Instruction>(Cond);
+ if (match(Cond, m_Add(m_Value(Op0), m_ConstantInt(AddRHS)))) {
// Change 'switch (X+4) case 1:' into 'switch (X) case -3'.
for (SwitchInst::CaseIt i = SI.case_begin(), e = SI.case_end(); i != e;
++i) {
@@ -2289,8 +2289,9 @@
"Result of expression should be constant");
i.setValue(cast<ConstantInt>(NewCaseVal));
}
- SI.setCondition(I->getOperand(0));
- Worklist.Add(I);
+ SI.setCondition(Op0);
+ if (auto *CondI = dyn_cast<Instruction>(Cond))
+ Worklist.Add(CondI);
return &SI;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25466.74230.patch
Type: text/x-patch
Size: 1793 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161011/d37d9911/attachment.bin>
More information about the llvm-commits
mailing list