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(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(NewCaseVal)); } - SI.setCondition(I->getOperand(0)); - Worklist.Add(I); + SI.setCondition(Op0); + if (auto *CondI = dyn_cast(Cond)) + Worklist.Add(CondI); return &SI; } 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 + +@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 +}