-
Notifications
You must be signed in to change notification settings - Fork 11k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[GlobalISel]: Simplify udiv lowering by determining known zeros #89678
Conversation
@llvm/pr-subscribers-llvm-globalisel Author: AtariDreams (AtariDreams) ChangesFull diff: https://github.com/llvm/llvm-project/pull/89678.diff 2 Files Affected:
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index c5ee354f13b7b4..2b300b63399427 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -5069,6 +5069,8 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
const unsigned EltBits = ScalarTy.getScalarSizeInBits();
LLT ShiftAmtTy = getTargetLowering().getPreferredShiftAmountTy(Ty);
LLT ScalarShiftAmtTy = ShiftAmtTy.getScalarType();
+ unsigned KnownLeadingZeros =
+ KB ? KB->getKnownBits(LHS).countMinLeadingZeros() : 0;
auto &MIB = Builder;
bool UseNPQ = false;
@@ -5087,7 +5089,7 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
// TODO: Use undef values for divisor of 1.
if (!Divisor.isOne()) {
UnsignedDivisionByConstantInfo magics =
- UnsignedDivisionByConstantInfo::get(Divisor);
+ UnsignedDivisionByConstantInfo::get(Divisor, KnownLeadingZeros);
Magic = std::move(magics.Magic);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll b/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll
index 9a525151ca328b..c97a00ccdd4557 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll
@@ -243,3 +243,29 @@ define <8 x i16> @pr38477(<8 x i16> %a0) {
%1 = udiv <8 x i16> %a0, <i16 1, i16 119, i16 73, i16 -111, i16 -3, i16 118, i16 32, i16 31>
ret <8 x i16> %1
}
+
+define i32 @udiv_div_by_180(i32 %x)
+; SDAG-LABEL: udiv_div_by_180:
+; SDAG: // %bb.0:
+; SDAG-NEXT: mov w8, #5826 // =0x16c2
+; SDAG-NEXT: and w9, w0, #0xff
+; SDAG-NEXT: movk w8, #364, lsl #16
+; SDAG-NEXT: umull x8, w9, w8
+; SDAG-NEXT: lsr x0, x8, #32
+; SDAG-NEXT: // kill: def $w0 killed $w0 killed $x0
+; SDAG-NEXT: ret
+;
+; GISEL-LABEL: udiv_div_by_180:
+; GISEL: // %bb.0:
+; GISEL-NEXT: uxtb w8, w0
+; GISEL-NEXT: mov w9, #5826 // =0x16c2
+; GISEL-NEXT: movk w9, #364, lsl #16
+; GISEL-NEXT: umull x8, w8, w9
+; GISEL-NEXT: lsr x0, x8, #32
+; GISEL-NEXT: // kill: def $w0 killed $w0 killed $x0
+; GISEL-NEXT: ret
+{
+ %truncate = and i32 %x, 255
+ %udiv = udiv i32 %truncate, 180
+ ret i32 %udiv
+}
|
@llvm/pr-subscribers-backend-aarch64 Author: AtariDreams (AtariDreams) ChangesFull diff: https://github.com/llvm/llvm-project/pull/89678.diff 2 Files Affected:
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index c5ee354f13b7b4..2b300b63399427 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -5069,6 +5069,8 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
const unsigned EltBits = ScalarTy.getScalarSizeInBits();
LLT ShiftAmtTy = getTargetLowering().getPreferredShiftAmountTy(Ty);
LLT ScalarShiftAmtTy = ShiftAmtTy.getScalarType();
+ unsigned KnownLeadingZeros =
+ KB ? KB->getKnownBits(LHS).countMinLeadingZeros() : 0;
auto &MIB = Builder;
bool UseNPQ = false;
@@ -5087,7 +5089,7 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
// TODO: Use undef values for divisor of 1.
if (!Divisor.isOne()) {
UnsignedDivisionByConstantInfo magics =
- UnsignedDivisionByConstantInfo::get(Divisor);
+ UnsignedDivisionByConstantInfo::get(Divisor, KnownLeadingZeros);
Magic = std::move(magics.Magic);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll b/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll
index 9a525151ca328b..c97a00ccdd4557 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-udiv.ll
@@ -243,3 +243,29 @@ define <8 x i16> @pr38477(<8 x i16> %a0) {
%1 = udiv <8 x i16> %a0, <i16 1, i16 119, i16 73, i16 -111, i16 -3, i16 118, i16 32, i16 31>
ret <8 x i16> %1
}
+
+define i32 @udiv_div_by_180(i32 %x)
+; SDAG-LABEL: udiv_div_by_180:
+; SDAG: // %bb.0:
+; SDAG-NEXT: mov w8, #5826 // =0x16c2
+; SDAG-NEXT: and w9, w0, #0xff
+; SDAG-NEXT: movk w8, #364, lsl #16
+; SDAG-NEXT: umull x8, w9, w8
+; SDAG-NEXT: lsr x0, x8, #32
+; SDAG-NEXT: // kill: def $w0 killed $w0 killed $x0
+; SDAG-NEXT: ret
+;
+; GISEL-LABEL: udiv_div_by_180:
+; GISEL: // %bb.0:
+; GISEL-NEXT: uxtb w8, w0
+; GISEL-NEXT: mov w9, #5826 // =0x16c2
+; GISEL-NEXT: movk w9, #364, lsl #16
+; GISEL-NEXT: umull x8, w8, w9
+; GISEL-NEXT: lsr x0, x8, #32
+; GISEL-NEXT: // kill: def $w0 killed $w0 killed $x0
+; GISEL-NEXT: ret
+{
+ %truncate = and i32 %x, 255
+ %udiv = udiv i32 %truncate, 180
+ ret i32 %udiv
+}
|
98199be
to
4b3f579
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
00ddfa3
to
b599b0d
Compare
@AtariDreams why do you keep force-pushing? It makes it hard for reviewers to know what has changed since the last time they looked at the PR. |
Failed tests and I reran them to ensure everything is good. |
b599b0d
to
daae3e8
Compare
A simple way to do such things is to utilize |
787d961
to
11c7ba2
Compare
11c7ba2
to
4cb7b54
Compare
No description provided.