From: Evan Cheng Date: Wed, 5 Mar 2008 01:30:59 +0000 (+0000) Subject: Add a target lowering hook to control whether it's worthwhile to compress fp constant. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6fd599fa6916bd9438dbea7994cf2437bdf4ab8c;p=oota-llvm.git Add a target lowering hook to control whether it's worthwhile to compress fp constant. For x86, if sse2 is available, it's not a good idea since cvtss2sd is slower than a movsd load and it prevents load folding. On x87, it's important to shrink fp constant since fldt is very expensive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47931 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index a3d24cc7b42..ac573c4f916 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -467,6 +467,11 @@ public: assert(0 && "Unsupported extended type!"); } + /// ShouldShrinkFPConstant - If true, then instruction selection should + /// seek to shrink the FP constant of the specified type to a smaller type + /// in order to save space and / or reduce runtime. + virtual bool ShouldShrinkFPConstant(MVT::ValueType VT) const { return true; } + /// hasTargetDAGCombine - If true, the target has custom DAG combine /// transformations that it can perform for the specified node. bool hasTargetDAGCombine(ISD::NodeType NT) const { diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index c1bf2188b12..24dd2fd3bd6 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -504,7 +504,8 @@ static SDOperand ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP, if (CFP->isValueValidForType(SVT, CFP->getValueAPF()) && // Only do this if the target has a native EXTLOAD instruction from // smaller type. - TLI.isLoadXLegal(ISD::EXTLOAD, SVT)) { + TLI.isLoadXLegal(ISD::EXTLOAD, SVT) && + TLI.ShouldShrinkFPConstant(VT)) { const Type *SType = MVT::getTypeForValueType(SVT); LLVMC = cast(ConstantExpr::getFPTrunc(LLVMC, SType)); VT = SVT; diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index d9593a4ef64..e0ddf63bf0f 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -434,6 +434,16 @@ namespace llvm { virtual bool isVectorClearMaskLegal(std::vector &BVOps, MVT::ValueType EVT, SelectionDAG &DAG) const; + + /// ShouldShrinkFPConstant - If true, then instruction selection should + /// seek to shrink the FP constant of the specified type to a smaller type + /// in order to save space and / or reduce runtime. + virtual bool ShouldShrinkFPConstant(MVT::ValueType VT) const { + // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more + // expensive than a straight movsd. On the other hand, it's important to + // shrink long double fp constant since fldt is very slow. + return !X86ScalarSSEf64 || VT == MVT::f80; + } /// IsEligibleForTailCallOptimization - Check whether the call is eligible /// for tail call optimization. Target which want to do tail call diff --git a/test/CodeGen/X86/shrink-fp-const1.ll b/test/CodeGen/X86/shrink-fp-const1.ll new file mode 100644 index 00000000000..966e69ec779 --- /dev/null +++ b/test/CodeGen/X86/shrink-fp-const1.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | llc -march=x86-64 -mattr=+sse2 | not grep cvtss2sd +; PR1264 + +define double @foo(double %x) { + %y = mul double %x, 5.000000e-01 + ret double %y +}