diff options
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 6 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstSimplify/rem.ll | 8 |
2 files changed, 8 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 4f5bed91dcc..4a80558dd1b 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -1099,6 +1099,12 @@ Value *llvm::SimplifyUDivInst(Value *Op0, Value *Op1, const SimplifyQuery &Q) { /// 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); } diff --git a/llvm/test/Transforms/InstSimplify/rem.ll b/llvm/test/Transforms/InstSimplify/rem.ll index 54a7b5bfcae..e18ff567414 100644 --- a/llvm/test/Transforms/InstSimplify/rem.ll +++ b/llvm/test/Transforms/InstSimplify/rem.ll @@ -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(i1 %x, i32 %y) { 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 |

