1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00

[InstCombine] foldAddWithConstant(): don't deal with non-immediate constants

All of the code that handles general constant here (other than the more
restrictive APInt-dealing code) expects that it is an immediate,
because otherwise we won't actually fold the constants, and increase
instruction count. And it isn't obvious why we'd be okay with
increasing the number of constant expressions,
those still will have to be run..

But after 2829094a8e252d04f13aabdf6f416c42a06af695
this could also cause endless combine loops.
So actually properly restrict this code to immediates.
This commit is contained in:
Roman Lebedev 2021-04-07 19:46:30 +03:00
parent 7d1726e81c
commit 3d5a1f14f3
2 changed files with 12 additions and 1 deletions

View File

@ -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))

View File

@ -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
}