mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-12 22:30:12 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311773 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
33badf7093
commit
513af851dd
@ -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…
x
Reference in New Issue
Block a user