[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