[llvm] r236171 - generalize binop reassociation; NFC

Jonathan Roelofs jonathan at codesourcery.com
Wed Apr 29 16:16:22 PDT 2015



On 4/29/15 4:30 PM, Sanjay Patel wrote:
> Author: spatel
> Date: Wed Apr 29 17:30:02 2015
> New Revision: 236171
>
> URL: http://llvm.org/viewvc/llvm-project?rev=236171&view=rev
> Log:
> generalize binop reassociation; NFC
>
> Move the fold introduced in r236031:
> http://reviews.llvm.org/rL236031
>
> to its own helper function, so we can use it for other binops.
>
> This is a preliminary step before partially solving:
> https://llvm.org/bugs/show_bug.cgi?id=21768
> https://llvm.org/bugs/show_bug.cgi?id=23116
>
>
> Modified:
>      llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=236171&r1=236170&r2=236171&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Apr 29 17:30:02 2015
> @@ -7647,6 +7647,33 @@ SDValue DAGCombiner::visitFSUBForFMAComb
>     return SDValue();
>   }
>
> +static SDValue ReassociateBinops(SDNode *N, SelectionDAG &DAG) {
> +  assert(N->getNumOperands() == 2 && "Invalid node for binop reassociation");
> +  SDValue N0 = N->getOperand(0);
> +  SDValue N1 = N->getOperand(1);
> +  EVT VT = N->getValueType(0);
> +  SDLoc DL(N);
> +  unsigned Opcode = N->getOpcode();

Perhaps add a "the opcode really is associative" assertion?

> +
> +  // Canonicalize chains of this operation to LHS to allow the following fold.
> +  if (N0.getOpcode() != Opcode && N1.getOpcode() == Opcode)
> +    return DAG.getNode(Opcode, DL, VT, N1, N0);
> +
> +  // Convert a chain of 3 dependent operations into 2 independent operations
> +  // and 1 dependent operation:
> +  //  (op N0: (op N00: (op z, w), N01: y), N1: x) ->
> +  //  (op N00: (op z, w), (op N1: x, N01: y))
> +  if (N0.getOpcode() == Opcode && N0.hasOneUse() && N1.getOpcode() != Opcode) {
> +    SDValue N00 = N0.getOperand(0);
> +    if (N00.getOpcode() == Opcode) {

Realizing that your change is NFC...

Why do we care that N00's opcode matches the other two? N00:k doesn't 
really participate in the re-association of N01:y and N1:x:

   (op N0: (op N00: k, N01: y), N1: x) ->
   (op N00: k, (op N1: x, N01: y))

or in infix notation without the N's, that is:

    (k +  y) + x ->
     k + (y  + x)

Is it sufficient for N00:k to be any binop? Can it be relaxed even further?


Cheers,

Jon

> +      SDValue N01 = N0.getOperand(1);
> +      SDValue NewOp = DAG.getNode(Opcode, DL, VT, N1, N01);
> +      return DAG.getNode(Opcode, DL, VT, N00, NewOp);
> +    }
> +  }
> +  return SDValue();
> +}
> +
>   SDValue DAGCombiner::visitFADD(SDNode *N) {
>     SDValue N0 = N->getOperand(0);
>     SDValue N1 = N->getOperand(1);
> @@ -7781,24 +7808,10 @@ SDValue DAGCombiner::visitFADD(SDNode *N
>                              N0.getOperand(0), DAG.getConstantFP(4.0, DL, VT));
>         }
>       }
> -
> -    // Canonicalize chains of adds to LHS to simplify the following transform.
> -    if (N0.getOpcode() != ISD::FADD && N1.getOpcode() == ISD::FADD)
> -      return DAG.getNode(ISD::FADD, DL, VT, N1, N0);
>
> -    // Convert a chain of 3 dependent operations into 2 independent operations
> -    // and 1 dependent operation:
> -    //  (fadd N0: (fadd N00: (fadd z, w), N01: y), N1: x) ->
> -    //  (fadd N00: (fadd z, w), (fadd N1: x, N01: y))
> -    if (N0.getOpcode() == ISD::FADD &&  N0.hasOneUse() &&
> -        N1.getOpcode() != ISD::FADD) {
> -      SDValue N00 = N0.getOperand(0);
> -      if (N00.getOpcode() == ISD::FADD) {
> -        SDValue N01 = N0.getOperand(1);
> -        SDValue NewAdd = DAG.getNode(ISD::FADD, DL, VT, N1, N01);
> -        return DAG.getNode(ISD::FADD, DL, VT, N00, NewAdd);
> -      }
> -    }
> +    if (SDValue Reassociated = ReassociateBinops(N, DAG))
> +      return Reassociated;
> +
>     } // enable-unsafe-fp-math
>
>     // FADD -> FMA combines:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>

-- 
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded



More information about the llvm-commits mailing list