[llvm] r335616 - [InstSimplify] fold srem with sext bool divisor

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 26 08:32:54 PDT 2018


Author: spatel
Date: Tue Jun 26 08:32:54 2018
New Revision: 335616

URL: http://llvm.org/viewvc/llvm-project?rev=335616&view=rev
Log:
[InstSimplify] fold srem with sext bool divisor

Modified:
    llvm/trunk/lib/Analysis/InstructionSimplify.cpp
    llvm/trunk/test/Transforms/InstSimplify/rem.ll

Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=335616&r1=335615&r2=335616&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Tue Jun 26 08:32:54 2018
@@ -1099,6 +1099,12 @@ Value *llvm::SimplifyUDivInst(Value *Op0
 /// If not, this returns null.
 static Value *SimplifySRemInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
                                unsigned MaxRecurse) {
+  // If the divisor is 0, the result is undefined, so assume the divisor is -1.
+  // srem Op0, (sext i1 X) --> srem Op0, -1 --> 0
+  Value *X;
+  if (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1))
+    return ConstantInt::getNullValue(Op0->getType());
+
   return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse);
 }
 

Modified: llvm/trunk/test/Transforms/InstSimplify/rem.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/rem.ll?rev=335616&r1=335615&r2=335616&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstSimplify/rem.ll (original)
+++ llvm/trunk/test/Transforms/InstSimplify/rem.ll Tue Jun 26 08:32:54 2018
@@ -309,9 +309,7 @@ define i32 @rem10(i32 %x, i32 %y) {
 
 define i32 @srem_with_sext_bool_divisor(i1 %x, i32 %y) {
 ; CHECK-LABEL: @srem_with_sext_bool_divisor(
-; CHECK-NEXT:    [[S:%.*]] = sext i1 [[X:%.*]] to i32
-; CHECK-NEXT:    [[R:%.*]] = srem i32 [[Y:%.*]], [[S]]
-; CHECK-NEXT:    ret i32 [[R]]
+; CHECK-NEXT:    ret i32 0
 ;
   %s = sext i1 %x to i32
   %r = srem i32 %y, %s
@@ -320,9 +318,7 @@ define i32 @srem_with_sext_bool_divisor(
 
 define <2 x i32> @srem_with_sext_bool_divisor_vec(<2 x i1> %x, <2 x i32> %y) {
 ; CHECK-LABEL: @srem_with_sext_bool_divisor_vec(
-; CHECK-NEXT:    [[S:%.*]] = sext <2 x i1> [[X:%.*]] to <2 x i32>
-; CHECK-NEXT:    [[R:%.*]] = srem <2 x i32> [[Y:%.*]], [[S]]
-; CHECK-NEXT:    ret <2 x i32> [[R]]
+; CHECK-NEXT:    ret <2 x i32> zeroinitializer
 ;
   %s = sext <2 x i1> %x to <2 x i32>
   %r = srem <2 x i32> %y, %s




More information about the llvm-commits mailing list