[llvm] r339176 - [InstSimplify] fold fsub+fadd with common operand

Roman Tereshin via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 8 13:24:23 PDT 2018


Hi Sanjay,

+ Michael


I'm not sure it's enough to check for nsz and reassoc flags here.

I think reassoc let's you do

Y + (X - Y)  -->   (Y - Y) + X

But w/o knowing that Y is non a NaN and not an infinity (of any sign) we can't tell if the result is a NaN or X, I believe.
The check could be done by checking just the nnan flag on the top level op.

Shouldn't we check for the nnan flag here as well while doing this?


Another question here is that we check here the top-level reassoc flag only. I'm not sure if it's enough either.

Meaning, I think it's possible that while

(Y + (X - Y)<reassoc>)<reassoc>  -->   ((Y - Y)<reassoc> + X)<reassoc>

is perfectly legal

(Y + (X - Y))<reassoc>  -->  (Y - Y) + X

is not allowed.

What do you think?


Thanks,
Roman

> On Aug 7, 2018, at 1:32 PM, Sanjay Patel via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: spatel
> Date: Tue Aug  7 13:32:55 2018
> New Revision: 339176
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=339176&view=rev
> Log:
> [InstSimplify] fold fsub+fadd with common operand
> 
> Modified:
>    llvm/trunk/lib/Analysis/InstructionSimplify.cpp
>    llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll
> 
> Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=339176&r1=339175&r2=339176&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Tue Aug  7 13:32:55 2018
> @@ -4359,6 +4359,14 @@ static Value *SimplifyFAddInst(Value *Op
>                        match(Op1, m_FSub(m_AnyZeroFP(), m_Specific(Op0)))))
>     return ConstantFP::getNullValue(Op0->getType());
> 
> +  // (X - Y) + Y --> X
> +  // Y + (X - Y) --> X
> +  Value *X;
> +  if (FMF.noSignedZeros() && FMF.allowReassoc() &&
> +      (match(Op0, m_FSub(m_Value(X), m_Specific(Op1))) ||
> +       match(Op1, m_FSub(m_Value(X), m_Specific(Op0)))))
> +    return X;
> +
>   return nullptr;
> }
> 
> 
> Modified: llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll?rev=339176&r1=339175&r2=339176&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll (original)
> +++ llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll Tue Aug  7 13:32:55 2018
> @@ -849,9 +849,7 @@ define float @fadd_fsub_common_op_wrong_
> 
> define <2 x float> @fsub_fadd_common_op_vec(<2 x float> %x, <2 x float> %y) {
> ; CHECK-LABEL: @fsub_fadd_common_op_vec(
> -; CHECK-NEXT:    [[S:%.*]] = fsub <2 x float> [[X:%.*]], [[Y:%.*]]
> -; CHECK-NEXT:    [[R:%.*]] = fadd reassoc nsz <2 x float> [[Y]], [[S]]
> -; CHECK-NEXT:    ret <2 x float> [[R]]
> +; CHECK-NEXT:    ret <2 x float> [[X:%.*]]
> ;
>   %s = fsub <2 x float> %x, %y
>   %r = fadd reassoc nsz <2 x float> %y, %s
> @@ -862,9 +860,7 @@ define <2 x float> @fsub_fadd_common_op_
> 
> define float @fsub_fadd_common_op_commute(float %x, float %y) {
> ; CHECK-LABEL: @fsub_fadd_common_op_commute(
> -; CHECK-NEXT:    [[S:%.*]] = fsub float [[X:%.*]], [[Y:%.*]]
> -; CHECK-NEXT:    [[R:%.*]] = fadd reassoc nsz float [[S]], [[Y]]
> -; CHECK-NEXT:    ret float [[R]]
> +; CHECK-NEXT:    ret float [[X:%.*]]
> ;
>   %s = fsub float %x, %y
>   %r = fadd reassoc nsz float %s, %y
> 
> 
> _______________________________________________
> 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