aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorMatthias Braun <matze@braunis.de>2024-10-29 17:16:17 -0700
committerGitHub <noreply@github.com>2024-10-29 17:16:17 -0700
commit255e441613e39a391e9f85d6a605cc9e46dcf273 (patch)
treeb9d7881e4ad4c62ff967fd425730e731335c0dcc /llvm/lib
parent0fa2fb3ed0bc726e5dcf8258bf764aacd1c2e6dc (diff)
downloadllvm-255e441613e39a391e9f85d6a605cc9e46dcf273.zip
llvm-255e441613e39a391e9f85d6a605cc9e46dcf273.tar.gz
llvm-255e441613e39a391e9f85d6a605cc9e46dcf273.tar.bz2
X86: Do not return invalid cost for fp16 conversion (#114128)
Returning invalid instruction costs when converting from/to fp16 in `X86TTIImpl::getCastInstrCost` when there is no hardware support available was triggering asserts. This changes the code to return a large (arbitrary) number to model the fact that libcalls are used to implement the conversion. This also simplifies the code by only reporting costs for the scalar fp16 conversion; vectorized costs being left to the fallback assuming scalarization. This is a follow-up to assertion issues reported for the changes in #113195
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86TargetTransformInfo.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
index bae2232..520284d 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
@@ -3068,6 +3068,13 @@ InstructionCost X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
if (auto KindCost = Entry->Cost[CostKind])
return *KindCost;
}
+
+ if ((ISD == ISD::FP_ROUND && SimpleDstTy == MVT::f16) ||
+ (ISD == ISD::FP_EXTEND && SimpleSrcTy == MVT::f16)) {
+ // fp16 conversions not covered by any table entries require a libcall.
+ // Return a large (arbitrary) number to model this.
+ return InstructionCost(64);
+ }
}
// Fall back to legalized types.
@@ -3174,11 +3181,6 @@ InstructionCost X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
TTI::CastContextHint::None, CostKind);
}
- if (ISD == ISD::FP_ROUND && LTDest.second.getScalarType() == MVT::f16) {
- // Conversion requires a libcall.
- return InstructionCost::getInvalid();
- }
-
// TODO: Allow non-throughput costs that aren't binary.
auto AdjustCost = [&CostKind](InstructionCost Cost,
InstructionCost N = 1) -> InstructionCost {