forked from OSchip/llvm-project
[InstCombine] Consider more cases where SimplifyDemandedUseBits does not convert AShr to LShr.
There are cases where AShr have better chance to be optimized than LShr, especially when the demanded bits are not known to be Zero, and also known to be similar to the sign bit. Differential Revision: https://reviews.llvm.org/D36936 llvm-svn: 311773
This commit is contained in:
parent
6cc8317c38
commit
22178dd33b
|
@ -521,9 +521,12 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
|||
if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Depth + 1))
|
||||
return I;
|
||||
|
||||
unsigned SignBits = ComputeNumSignBits(I->getOperand(0), Depth + 1, CxtI);
|
||||
|
||||
assert(!Known.hasConflict() && "Bits known to be one AND zero?");
|
||||
// Compute the new bits that are at the top now.
|
||||
APInt HighBits(APInt::getHighBitsSet(BitWidth, ShiftAmt));
|
||||
// Compute the new bits that are at the top now plus sign bits.
|
||||
APInt HighBits(APInt::getHighBitsSet(
|
||||
BitWidth, std::min(SignBits + ShiftAmt - 1, BitWidth)));
|
||||
Known.Zero.lshrInPlace(ShiftAmt);
|
||||
Known.One.lshrInPlace(ShiftAmt);
|
||||
|
||||
|
|
|
@ -89,6 +89,23 @@ define i32 @test6(i64 %A) {
|
|||
ret i32 %D
|
||||
}
|
||||
|
||||
; Test case where 'ashr' demanded bits does not contain any of the high bits,
|
||||
; but does contain sign bits, where the sign bit is not known to be zero.
|
||||
define i16 @ashr_mul_sign_bits(i8 %X, i8 %Y) {
|
||||
; CHECK-LABEL: @ashr_mul_sign_bits(
|
||||
; CHECK-NEXT: [[A:%.*]] = sext i8 %X to i16
|
||||
; CHECK-NEXT: [[B:%.*]] = sext i8 %Y to i16
|
||||
; CHECK-NEXT: [[C:%.*]] = mul nsw i16 [[A]], [[B]]
|
||||
; CHECK-NEXT: [[D:%.*]] = ashr i16 [[C]], 3
|
||||
; CHECK-NEXT: ret i16 [[D]]
|
||||
%A = sext i8 %X to i32
|
||||
%B = sext i8 %Y to i32
|
||||
%C = mul i32 %A, %B
|
||||
%D = ashr i32 %C, 3
|
||||
%E = trunc i32 %D to i16
|
||||
ret i16 %E
|
||||
}
|
||||
|
||||
define i16 @ashr_mul(i8 %X, i8 %Y) {
|
||||
; CHECK-LABEL: @ashr_mul(
|
||||
; CHECK-NEXT: [[A:%.*]] = sext i8 %X to i16
|
||||
|
|
Loading…
Reference in New Issue