mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-25 00:33:15 +00:00
InstCombine: Propagate exact in (udiv (lshr X,C1),C2) -> (udiv x,C1<<C2)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222620 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e915b4b7c8
commit
218fe23f41
@ -997,9 +997,14 @@ Instruction *InstCombiner::visitUDiv(BinaryOperator &I) {
|
||||
match(Op1, m_APInt(C2))) {
|
||||
bool Overflow;
|
||||
APInt C2ShlC1 = C2->ushl_ov(*C1, Overflow);
|
||||
if (!Overflow)
|
||||
return BinaryOperator::CreateUDiv(
|
||||
if (!Overflow) {
|
||||
bool IsExact = I.isExact() && match(Op0, m_Exact(m_Value()));
|
||||
BinaryOperator *BO = BinaryOperator::CreateUDiv(
|
||||
X, ConstantInt::get(X->getType(), C2ShlC1));
|
||||
if (IsExact)
|
||||
BO->setIsExact();
|
||||
return BO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -286,3 +286,12 @@ define i32 @test32(i32 %a, i32 %b) {
|
||||
; CHECK-NEXT: %[[div:.*]] = udiv i32 %a, %[[shr]]
|
||||
; CHECK-NEXT: ret i32
|
||||
}
|
||||
|
||||
define <2 x i64> @test33(<2 x i64> %x) nounwind {
|
||||
%shr = lshr exact <2 x i64> %x, <i64 5, i64 5>
|
||||
%div = udiv exact <2 x i64> %shr, <i64 6, i64 6>
|
||||
ret <2 x i64> %div
|
||||
; CHECK-LABEL: @test33(
|
||||
; CHECK-NEXT: udiv exact <2 x i64> %x, <i64 192, i64 192>
|
||||
; CHECK-NEXT: ret <2 x i64>
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user