[llvm] r311554 - [Reassociate] Don't canonicalize x + (-Constant * y) -> x - (Constant * y)..

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 23 14:34:46 PDT 2017


Merged to 5.0 in r311603.

On Wed, Aug 23, 2017 at 7:10 AM, Chad Rosier via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: mcrosier
> Date: Wed Aug 23 07:10:06 2017
> New Revision: 311554
>
> URL: http://llvm.org/viewvc/llvm-project?rev=311554&view=rev
> Log:
> [Reassociate] Don't canonicalize x + (-Constant * y) -> x - (Constant * y)..
>
> ..if the resulting subtract will be broken up later.  This can cause us to get
> into an infinite loop.
>
> x + (-5.0 * y)      -> x - (5.0 * y)       ; Canonicalize neg const
> x - (5.0 * y)       -> x + (0 - (5.0 * y)) ; Break up subtract
> x + (0 - (5.0 * y)) -> x + (-5.0 * y)      ; Replace 0-X with X*-1.
>
> PR34078
>
> Modified:
>     llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
>     llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll
>
> Modified: llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp?rev=311554&r1=311553&r2=311554&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/Reassociate.cpp Wed Aug 23 07:10:06 2017
> @@ -1938,6 +1938,12 @@ Instruction *ReassociatePass::canonicali
>    if (!User->isCommutative() && User->getOperand(1) != I)
>      return nullptr;
>
> +  // Don't canonicalize x + (-Constant * y) -> x - (Constant * y), if the
> +  // resulting subtract will be broken up later.  This can get us into an
> +  // infinite loop during reassociation.
> +  if (UserOpcode == Instruction::FAdd && ShouldBreakUpSubtract(User))
> +    return nullptr;
> +
>    // Change the sign of the constant.
>    APFloat Val = CF->getValueAPF();
>    Val.changeSign();
>
> Modified: llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll?rev=311554&r1=311553&r2=311554&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll (original)
> +++ llvm/trunk/test/Transforms/Reassociate/canonicalize-neg-const.ll Wed Aug 23 07:10:06 2017
> @@ -154,3 +154,25 @@ define i4 @test13(i4 %x) {
>    %add = add i4 %mul, 3
>    ret i4 %add
>  }
> +
> +; This tests used to cause an infinite loop where we would loop between
> +; canonicalizing the negated constant (i.e., (X + Y*-5.0) -> (X - Y*5.0)) and
> +; breaking up a subtract (i.e., (X - Y*5.0) -> X + (0 - Y*5.0)). To break the
> +; cycle, we don't canonicalize the negative constant if we're going to later
> +; break up the subtract.
> +;
> +; Check to make sure we don't canonicalize
> +;   (%pow2*-5.0 + %sub) -> (%sub - %pow2*5.0)
> +; as we would later break up this subtract causing a cycle.
> +;
> +; CHECK-LABEL: @pr34078
> +; CHECK: %mul5.neg = fmul fast double %pow2, -5.000000e-01
> +; CHECK: %sub1 = fadd fast double %mul5.neg, %sub
> +define double @pr34078(double %A) {
> +  %sub = fsub fast double 1.000000e+00, %A
> +  %pow2 = fmul double %A, %A
> +  %mul5 = fmul fast double %pow2, 5.000000e-01
> +  %sub1 = fsub fast double %sub, %mul5
> +  %add = fadd fast double %sub1, %sub1
> +  ret double %add
> +}
>
>
> _______________________________________________
> 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