[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