1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 11:33:24 +02:00

[ARM] icmp %x, -C can be lowered to a simple ADDS or CMN

Tell TargetTransformInfo about this so ConstantHoisting is informed.

llvm-svn: 281043
This commit is contained in:
James Molloy 2016-09-09 13:35:28 +00:00
parent 6a38b83df2
commit 0a82fb6419
2 changed files with 45 additions and 0 deletions

View File

@ -73,6 +73,17 @@ int ARMTTIImpl::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
// Conversion to BIC is free, and means we can use ~Imm instead.
return std::min(getIntImmCost(Imm, Ty), getIntImmCost(~Imm, Ty));
if (Opcode == Instruction::ICmp && Imm.isNegative() &&
Ty->getIntegerBitWidth() == 32) {
int64_t NegImm = -Imm.getSExtValue();
if (ST->isThumb2() && NegImm < 1<<12)
// icmp X, #-C -> cmn X, #C
return 0;
if (ST->isThumb() && NegImm < 1<<8)
// icmp X, #-C -> adds X, #C
return 0;
}
return getIntImmCost(Imm, Ty);
}

View File

@ -37,3 +37,37 @@ ret:
ret void
}
; CHECK: Function: test_icmp_neg
; CHECK-NOT: Collect constant
define void @test_icmp_neg(i1 %cond, i32 %arg, i32 %arg2) {
entry:
%a = icmp ne i32 %arg, -5
call void @g2(i1 %a)
br i1 %cond, label %true, label %ret
true:
%b = icmp ne i32 %arg2, -5
call void @g2(i1 %b)
br label %ret
ret:
ret void
}
declare void @g2(i1)
; CHECK: Function: test_icmp_neg2
; CHECK: Hoist constant (i32 -500) to BB entry
define void @test_icmp_neg2(i1 %cond, i32 %arg, i32 %arg2) {
entry:
%a = icmp ne i32 %arg, -500
call void @g2(i1 %a)
br i1 %cond, label %true, label %ret
true:
%b = icmp ne i32 %arg2, -500
call void @g2(i1 %b)
br label %ret
ret:
ret void
}