diff --git a/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 7b33e29c59d..70caf2fdf83 100644 --- a/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -864,7 +864,7 @@ static Instruction *foldNoWrapAdd(BinaryOperator &Add, Instruction *InstCombinerImpl::foldAddWithConstant(BinaryOperator &Add) { Value *Op0 = Add.getOperand(0), *Op1 = Add.getOperand(1); Constant *Op1C; - if (!match(Op1, m_Constant(Op1C))) + if (!match(Op1, m_ImmConstant(Op1C))) return nullptr; if (Instruction *NV = foldBinOpIntoSelectOrPhi(Add)) diff --git a/test/Transforms/InstCombine/sub-from-sub.ll b/test/Transforms/InstCombine/sub-from-sub.ll index 0669efe2dd0..636b8518f08 100644 --- a/test/Transforms/InstCombine/sub-from-sub.ll +++ b/test/Transforms/InstCombine/sub-from-sub.ll @@ -202,3 +202,14 @@ define i32 @constantexpr2(i32 %x, i8* %y) unnamed_addr { %r = sub i32 ptrtoint (i8* @g1 to i32), %i0 ret i32 %r } + +define i64 @pr49870(i64 %x) { +; CHECK-LABEL: @pr49870( +; CHECK-NEXT: [[I0:%.*]] = xor i64 [[X:%.*]], -1 +; CHECK-NEXT: [[R:%.*]] = add i64 [[I0]], ptrtoint (i8* @g0 to i64) +; CHECK-NEXT: ret i64 [[R]] +; + %i0 = xor i64 %x, -1 + %r = add i64 %i0, ptrtoint (i8* @g0 to i64) + ret i64 %r +}