mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-23 12:11:58 +00:00
[InstCombine] use m_APInt for div --> ashr fold
The APInt matcher works with splat vectors, so we get this fold for vectors too. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273897 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0c5a6a8955
commit
d96514bcfe
@ -1143,14 +1143,12 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
|
||||
if (match(Op1, m_AllOnes()))
|
||||
return BinaryOperator::CreateNeg(Op0);
|
||||
|
||||
if (ConstantInt *RHS = dyn_cast<ConstantInt>(Op1)) {
|
||||
// sdiv X, C --> ashr exact X, log2(C)
|
||||
if (I.isExact() && RHS->getValue().isNonNegative() &&
|
||||
RHS->getValue().isPowerOf2()) {
|
||||
Value *ShAmt = llvm::ConstantInt::get(RHS->getType(),
|
||||
RHS->getValue().exactLogBase2());
|
||||
return BinaryOperator::CreateExactAShr(Op0, ShAmt, I.getName());
|
||||
}
|
||||
// sdiv exact X, C --> ashr exact X, log2(C)
|
||||
const APInt *Op1C;
|
||||
if (match(Op1, m_APInt(Op1C)) && I.isExact() && Op1C->isNonNegative() &&
|
||||
Op1C->isPowerOf2()) {
|
||||
Value *ShAmt = ConstantInt::get(Op1->getType(), Op1C->exactLogBase2());
|
||||
return BinaryOperator::CreateExactAShr(Op0, ShAmt, I.getName());
|
||||
}
|
||||
|
||||
if (Constant *RHS = dyn_cast<Constant>(Op1)) {
|
||||
|
@ -19,6 +19,15 @@ define i32 @sdiv2(i32 %x) {
|
||||
ret i32 %y
|
||||
}
|
||||
|
||||
define <2 x i32> @sdiv2_vec(<2 x i32> %x) {
|
||||
; CHECK-LABEL: @sdiv2_vec(
|
||||
; CHECK-NEXT: [[Y:%.*]] = ashr exact <2 x i32> %x, <i32 7, i32 7>
|
||||
; CHECK-NEXT: ret <2 x i32> [[Y]]
|
||||
;
|
||||
%y = sdiv exact <2 x i32> %x, <i32 128, i32 128>
|
||||
ret <2 x i32> %y
|
||||
}
|
||||
|
||||
define i32 @sdiv3(i32 %x) {
|
||||
; CHECK-LABEL: @sdiv3(
|
||||
; CHECK-NEXT: [[Y:%.*]] = srem i32 %x, 3
|
||||
|
Loading…
x
Reference in New Issue
Block a user