mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-03-07 11:59:09 +00:00
[DemandedBits] Fix computation of demanded bits for ICmps
The computation of ICmp demanded bits is independent of the individual operand being evaluated. We simply return a mask consisting of the minimum leading zeroes of both operands. We were incorrectly passing "I" to ComputeKnownBits - this should be "UserI->getOperand(0)". In cases where we were evaluating the 1th operand, we were taking the minimum leading zeroes of it and itself. This should fix PR26266. llvm-svn: 258690
This commit is contained in:
parent
847379aa25
commit
fe66a6200d
@ -244,7 +244,7 @@ void DemandedBits::determineLiveOperandBits(
|
||||
break;
|
||||
case Instruction::ICmp:
|
||||
// Count the number of leading zeroes in each operand.
|
||||
ComputeKnownBits(BitWidth, I, UserI->getOperand(1));
|
||||
ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));
|
||||
auto NumLeadingZeroes = std::min(KnownZero.countLeadingOnes(),
|
||||
KnownZero2.countLeadingOnes());
|
||||
AB = ~APInt::getHighBitsSet(BitWidth, NumLeadingZeroes);
|
||||
|
@ -24,11 +24,20 @@ define i1 @test_icmp1(i32 %a, i32 %b) {
|
||||
|
||||
; 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
|
||||
; CHECK-DAG: DemandedBits: 0xFFF for %1 = and i32 %a, 255
|
||||
; CHECK-DAG: DemandedBits: 0xFF 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
|
||||
}
|
||||
|
||||
; CHECK-LABEL: 'test_icmp3'
|
||||
; CHECK-DAG: DemandedBits: 0xFFFFFFFF for %1 = and i32 %a, 255
|
||||
; CHECK-DAG: DemandedBits: 0x1 for %2 = icmp eq i32 -1, %1
|
||||
define i1 @test_icmp3(i32 %a) {
|
||||
%1 = and i32 %a, 255
|
||||
%2 = icmp eq i32 -1, %1
|
||||
ret i1 %2
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user