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;
}
}
%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
+}