forked from OSchip/llvm-project
Compute demanded bits for icmp instructions
Instead of bailing out when we see an icmp, we can instead at least say that if the upper bits of both operands are known zero, they are not demanded. This doesn't help with signed comparisons, but it's at least better than bailing out. llvm-svn: 249687
This commit is contained in:
parent
bcd7f0ac98
commit
e9d50dc9f7
|
@ -242,6 +242,13 @@ void DemandedBits::determineLiveOperandBits(
|
|||
if (OperandNo != 0)
|
||||
AB = AOut;
|
||||
break;
|
||||
case Instruction::ICmp:
|
||||
// Count the number of leading zeroes in each operand.
|
||||
ComputeKnownBits(BitWidth, I, UserI->getOperand(1));
|
||||
auto NumLeadingZeroes = std::min(KnownZero.countLeadingOnes(),
|
||||
KnownZero2.countLeadingOnes());
|
||||
AB = ~APInt::getHighBitsSet(BitWidth, NumLeadingZeroes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,3 +10,25 @@ define i8 @test_mul(i32 %a, i32 %b) {
|
|||
%3 = trunc i32 %2 to i8
|
||||
ret i8 %3
|
||||
}
|
||||
|
||||
; CHECK-LABEL: 'test_icmp1'
|
||||
; CHECK-DAG: DemandedBits: 0x1 for %3 = icmp eq i32 %1, %2
|
||||
; CHECK-DAG: DemandedBits: 0xFFF for %1 = and i32 %a, 255
|
||||
; CHECK-DAG: DemandedBits: 0xFFF for %2 = shl i32 %1, 4
|
||||
define i1 @test_icmp1(i32 %a, i32 %b) {
|
||||
%1 = and i32 %a, 255
|
||||
%2 = shl i32 %1, 4
|
||||
%3 = icmp eq i32 %1, %2
|
||||
ret i1 %3
|
||||
}
|
||||
|
||||
; CHECK-LABEL: 'test_icmp2'
|
||||
; CHECK-DAG: DemandedBits: 0x1 for %3 = icmp eq i32 %1, %2
|
||||
; CHECK-DAG: DemandedBits: 0xFF for %1 = and i32 %a, 255
|
||||
; CHECK-DAG: DemandedBits: 0xF for %2 = ashr i32 %1, 4
|
||||
define i1 @test_icmp2(i32 %a, i32 %b) {
|
||||
%1 = and i32 %a, 255
|
||||
%2 = ashr i32 %1, 4
|
||||
%3 = icmp eq i32 %1, %2
|
||||
ret i1 %3
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue