[llvm] r337545 - [InstSimplify] fold srem instruction if its two operands are negated.
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 20 06:14:31 PDT 2018
On Fri, Jul 20, 2018 at 4:00 PM, Chen Zheng via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: shchenz
> Date: Fri Jul 20 06:00:47 2018
> New Revision: 337545
>
> URL: http://llvm.org/viewvc/llvm-project?rev=337545&view=rev
> Log:
> [InstSimplify] fold srem instruction if its two operands are negated.
>
> Differential Revision: https://reviews.llvm.org/D49423
>
> Modified:
> llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> llvm/trunk/test/Transforms/InstSimplify/srem.ll
>
> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=337545&r1=337544&r2=337545&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Fri Jul 20 06:00:47 2018
> @@ -1109,6 +1109,10 @@ static Value *SimplifySRemInst(Value *Op
> if (match(Op1, m_SExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1))
> return ConstantInt::getNullValue(Op0->getType());
>
> + // If the two operands are negated, return 0.
> + if (isKnownNegation(Op0, Op1))
> + return ConstantInt::getNullValue(Op0->getType());
> +
> return simplifyRem(Instruction::SRem, Op0, Op1, Q, MaxRecurse);
> }
>
>
> Modified: llvm/trunk/test/Transforms/InstSimplify/srem.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/srem.ll?rev=337545&r1=337544&r2=337545&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstSimplify/srem.ll (original)
> +++ llvm/trunk/test/Transforms/InstSimplify/srem.ll Fri Jul 20 06:00:47 2018
> @@ -3,9 +3,7 @@
>
> define i32 @negated_operand(i32 %x) {
> ; CHECK-LABEL: @negated_operand(
> -; CHECK-NEXT: [[NEGX:%.*]] = sub i32 0, [[X:%.*]]
> -; CHECK-NEXT: [[REM:%.*]] = srem i32 [[NEGX]], [[X]]
> -; CHECK-NEXT: ret i32 [[REM]]
> +; CHECK-NEXT: ret i32 0
> ;
> %negx = sub i32 0, %x
> %rem = srem i32 %negx, %x
> @@ -14,46 +12,36 @@ define i32 @negated_operand(i32 %x) {
>
> define <2 x i32> @negated_operand_commute_vec(<2 x i32> %x) {
> ; CHECK-LABEL: @negated_operand_commute_vec(
> -; CHECK-NEXT: [[NEGX:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]]
> -; CHECK-NEXT: [[REM:%.*]] = srem <2 x i32> [[NEGX]], [[X]]
> -; CHECK-NEXT: ret <2 x i32> [[REM]]
> +; CHECK-NEXT: ret <2 x i32> zeroinitializer
> - %negx = sub nsw <2 x i32> zeroinitializer, %x
> + %negx = sub <2 x i32> zeroinitializer, %x
Changes like these too should have been in rL337543
> %rem = srem <2 x i32> %negx, %x
> ret <2 x i32> %rem
> }
>
> define i32 @knownnegation(i32 %x, i32 %y) {
> ; CHECK-LABEL: @knownnegation(
> -; CHECK-NEXT: [[XY:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
> -; CHECK-NEXT: [[YX:%.*]] = sub nsw i32 [[Y]], [[X]]
> -; CHECK-NEXT: [[REM:%.*]] = srem i32 [[XY]], [[YX]]
> -; CHECK-NEXT: ret i32 [[REM]]
> +; CHECK-NEXT: ret i32 0
> ;
> - %xy = sub nsw i32 %x, %y
> - %yx = sub nsw i32 %y, %x
> + %xy = sub i32 %x, %y
> + %yx = sub i32 %y, %x
> %rem = srem i32 %xy, %yx
> ret i32 %rem
> }
>
> define <2 x i32> @knownnegation_commute_vec(<2 x i32> %x, <2 x i32> %y) {
> ; CHECK-LABEL: @knownnegation_commute_vec(
> -; CHECK-NEXT: [[XY:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
> -; CHECK-NEXT: [[YX:%.*]] = sub nsw <2 x i32> [[Y]], [[X]]
> -; CHECK-NEXT: [[REM:%.*]] = srem <2 x i32> [[XY]], [[YX]]
> -; CHECK-NEXT: ret <2 x i32> [[REM]]
> +; CHECK-NEXT: ret <2 x i32> zeroinitializer
> ;
> - %xy = sub nsw <2 x i32> %x, %y
> - %yx = sub nsw <2 x i32> %y, %x
> + %xy = sub <2 x i32> %x, %y
> + %yx = sub <2 x i32> %y, %x
> %rem = srem <2 x i32> %xy, %yx
> ret <2 x i32> %rem
> }
>
> define <3 x i32> @negated_operand_vec_undef(<3 x i32> %x) {
> ; CHECK-LABEL: @negated_operand_vec_undef(
> -; CHECK-NEXT: [[NEGX:%.*]] = sub <3 x i32> <i32 0, i32 undef, i32 0>, [[X:%.*]]
> -; CHECK-NEXT: [[REM:%.*]] = srem <3 x i32> [[NEGX]], [[X]]
> -; CHECK-NEXT: ret <3 x i32> [[REM]]
> +; CHECK-NEXT: ret <3 x i32> zeroinitializer
> ;
> %negx = sub <3 x i32> <i32 0, i32 undef, i32 0>, %x
> %rem = srem <3 x i32> %negx, %x
> @@ -73,9 +61,7 @@ define <2 x i32> @negated_operand_vec_no
>
> define i32 @negated_operand_commute(i32 %x) {
> ; CHECK-LABEL: @negated_operand_commute(
> -; CHECK-NEXT: [[NEGX:%.*]] = sub i32 0, [[X:%.*]]
> -; CHECK-NEXT: [[REM:%.*]] = srem i32 [[X]], [[NEGX]]
> -; CHECK-NEXT: ret i32 [[REM]]
> +; CHECK-NEXT: ret i32 0
> ;
> %negx = sub i32 0, %x
> %rem = srem i32 %x, %negx
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list