mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-21 02:59:15 +00:00
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. llvm-svn: 47931
This commit is contained in:
parent
95c88272c6
commit
e0b3c221ab
@ -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 {
|
||||
|
@ -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<ConstantFP>(ConstantExpr::getFPTrunc(LLVMC, SType));
|
||||
VT = SVT;
|
||||
|
@ -435,6 +435,16 @@ namespace llvm {
|
||||
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
|
||||
/// optimization should implement this function.
|
||||
|
7
test/CodeGen/X86/shrink-fp-const1.ll
Normal file
7
test/CodeGen/X86/shrink-fp-const1.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user