[llvm] r331933 - [InstCombine] Teach SimplifyDemandedBits that udiv doesn't demand low dividend bits that are zero in the divisor
Benjamin Kramer via llvm-commits
llvm-commits at lists.llvm.org
Wed May 9 15:27:34 PDT 2018
Author: d0k
Date: Wed May 9 15:27:34 2018
New Revision: 331933
URL: http://llvm.org/viewvc/llvm-project?rev=331933&view=rev
Log:
[InstCombine] Teach SimplifyDemandedBits that udiv doesn't demand low dividend bits that are zero in the divisor
This is safe as long as the udiv is not exact. The pattern is not common in
C++ code, but comes up all the time in code generated by XLA's GPU backend.
Differential Revision: https://reviews.llvm.org/D46647
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp?rev=331933&r1=331932&r2=331933&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Wed May 9 15:27:34 2018
@@ -545,6 +545,22 @@ Value *InstCombiner::SimplifyDemandedUse
}
break;
}
+ case Instruction::UDiv: {
+ // UDiv doesn't demand low bits that are zero in the divisor.
+ const APInt *SA;
+ if (match(I->getOperand(1), m_APInt(SA))) {
+ // If the shift is exact, then it does demand the low bits.
+ if (cast<UDivOperator>(I)->isExact())
+ break;
+
+ // FIXME: Take the demanded mask of the result into account.
+ APInt DemandedMaskIn =
+ APInt::getHighBitsSet(BitWidth, BitWidth - SA->countTrailingZeros());
+ if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Depth + 1))
+ return I;
+ }
+ break;
+ }
case Instruction::SRem:
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
// X % -1 demands all the bits because we don't want to introduce
Modified: llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll?rev=331933&r1=331932&r2=331933&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/udiv-simplify.ll Wed May 9 15:27:34 2018
@@ -83,3 +83,24 @@ define i177 @ossfuzz_4857(i177 %X, i177
store i1 %C9, i1* undef
ret i177 %B1
}
+
+define i32 @udiv_demanded(i32 %a) {
+; CHECK-LABEL: @udiv_demanded(
+; CHECK-NEXT: [[U:%.*]] = udiv i32 [[A:%.*]], 12
+; CHECK-NEXT: ret i32 [[U]]
+;
+ %o = or i32 %a, 3
+ %u = udiv i32 %o, 12
+ ret i32 %u
+}
+
+define i32 @udiv_exact_demanded(i32 %a) {
+; CHECK-LABEL: @udiv_exact_demanded(
+; CHECK-NEXT: [[O:%.*]] = and i32 [[A:%.*]], -3
+; CHECK-NEXT: [[U:%.*]] = udiv exact i32 [[O]], 12
+; CHECK-NEXT: ret i32 [[U]]
+;
+ %o = and i32 %a, -3
+ %u = udiv exact i32 %o, 12
+ ret i32 %u
+}
More information about the llvm-commits
mailing list