[llvm-commits] [llvm] r153901 - in /llvm/trunk: include/llvm/Target/TargetLowering.h lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Evan Cheng evan.cheng at apple.com
Thu Apr 12 22:48:36 PDT 2012


Perhaps it's time to replace all these is***Free hooks into one? Each target lowering interface can insert all pairs of (op, vt) which are free into a set. Then the unified hook doesn't even have to be a virtual function. 

Evan

On Apr 2, 2012, at 3:10 PM, Owen Anderson <resistor at mac.com> wrote:

> Author: resistor
> Date: Mon Apr  2 17:10:29 2012
> New Revision: 153901
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=153901&view=rev
> Log:
> Add predicates for checking whether targets have free FNEG and FABS operations, and prevent the DAGCombiner from turning them into bitwise operations if they do.
> 
> Modified:
>    llvm/trunk/include/llvm/Target/TargetLowering.h
>    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> 
> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=153901&r1=153900&r2=153901&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Apr  2 17:10:29 2012
> @@ -1600,6 +1600,18 @@
>     return false;
>   }
> 
> +  /// isFNegFree - Return true if an fneg operation is free to the point where
> +  /// it is never worthwhile to replace it with a bitwise operation.
> +  virtual bool isFNegFree(EVT) const {
> +    return false;
> +  }
> +
> +  /// isFAbsFree - Return true if an fneg operation is free to the point where
> +  /// it is never worthwhile to replace it with a bitwise operation.
> +  virtual bool isFAbsFree(EVT) const {
> +    return false;
> +  }
> +
>   /// isNarrowingProfitable - Return true if it's profitable to narrow
>   /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow
>   /// from i32 to i8 but not from i32 to i16.
> 
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=153901&r1=153900&r2=153901&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Apr  2 17:10:29 2012
> @@ -5342,7 +5342,8 @@
>   // fold (bitconvert (fneg x)) -> (xor (bitconvert x), signbit)
>   // fold (bitconvert (fabs x)) -> (and (bitconvert x), (not signbit))
>   // This often reduces constant pool loads.
> -  if ((N0.getOpcode() == ISD::FNEG || N0.getOpcode() == ISD::FABS) &&
> +  if (((N0.getOpcode() == ISD::FNEG && !TLI.isFNegFree(VT)) ||
> +       (N0.getOpcode() == ISD::FABS && !TLI.isFAbsFree(VT))) &&
>       N0.getNode()->hasOneUse() && VT.isInteger() && !VT.isVector()) {
>     SDValue NewConv = DAG.getNode(ISD::BITCAST, N0.getDebugLoc(), VT,
>                                   N0.getOperand(0));
> @@ -5993,7 +5994,7 @@
> 
>   // Transform fneg(bitconvert(x)) -> bitconvert(x^sign) to avoid loading
>   // constant pool values.
> -  if (N0.getOpcode() == ISD::BITCAST &&
> +  if (!TLI.isFNegFree(VT) && N0.getOpcode() == ISD::BITCAST &&
>       !VT.isVector() &&
>       N0.getNode()->hasOneUse() &&
>       N0.getOperand(0).getValueType().isInteger()) {
> @@ -6029,7 +6030,8 @@
> 
>   // Transform fabs(bitconvert(x)) -> bitconvert(x&~sign) to avoid loading
>   // constant pool values.
> -  if (N0.getOpcode() == ISD::BITCAST && N0.getNode()->hasOneUse() &&
> +  if (!TLI.isFAbsFree(VT) && 
> +      N0.getOpcode() == ISD::BITCAST && N0.getNode()->hasOneUse() &&
>       N0.getOperand(0).getValueType().isInteger() &&
>       !N0.getOperand(0).getValueType().isVector()) {
>     SDValue Int = N0.getOperand(0);
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list