Merging r258690:

------------------------------------------------------------------------
r258690 | jamesm | 2016-01-25 14:49:36 +0000 (Mon, 25 Jan 2016) | 7 lines

[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: 258805
This commit is contained in:
James Molloy
2016-01-26 13:30:49 +00:00
parent 7c038df44d
commit aae924affd
3 changed files with 14 additions and 5 deletions

View File

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

View File

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

View File

@@ -72,7 +72,7 @@ else
fi
svn log -c $rev http://llvm.org/svn/llvm-project/$proj/trunk >> $tempfile 2>&1
cd $proj.src
#cd $proj.src
echo "# Updating tree"
svn up
@@ -81,7 +81,7 @@ if [ $revert = "yes" ]; then
svn merge -c -$rev . || exit 1
else
echo "# Merging r$rev into $proj locally"
svn merge -c $rev https://llvm.org/svn/llvm-project/$proj/trunk . || exit 1
svn merge -c $rev https://jamesm@llvm.org/svn/llvm-project/$proj/trunk . || exit 1
fi
echo