mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[CostModel] Align the cost model for intrinsics for scalable/fixed-width vectors.
Let getIntrinsicInstrCost call getTypeBasedIntrinsicInstrCost for scalable vectors, similar to how this is done for fixed-width vectors, instead of falling back on BaseT::getIntrinsicInstrCost(). If the intrinsic cannot be costed (or is not overloaded by the target), it will return InstructionCost::getInvalid() instead. Depends on D97469 Reviewed By: david-arm Differential Revision: https://reviews.llvm.org/D97470
This commit is contained in:
parent
b60a1a8c9a
commit
d0edfcf635
@ -1346,15 +1346,12 @@ public:
|
||||
return Cost;
|
||||
}
|
||||
}
|
||||
// TODO: Handle the remaining intrinsic with scalable vector type
|
||||
if (isa<ScalableVectorType>(RetTy))
|
||||
return BaseT::getIntrinsicInstrCost(ICA, CostKind);
|
||||
|
||||
// Assume that we need to scalarize this intrinsic.
|
||||
// Compute the scalarization overhead based on Args for a vector
|
||||
// intrinsic.
|
||||
unsigned ScalarizationCost = std::numeric_limits<unsigned>::max();
|
||||
if (RetVF.isVector()) {
|
||||
if (RetVF.isVector() && !RetVF.isScalable()) {
|
||||
ScalarizationCost = 0;
|
||||
if (!RetTy->isVoidTy())
|
||||
ScalarizationCost +=
|
||||
@ -1399,6 +1396,12 @@ public:
|
||||
SmallVector<unsigned, 2> ISDs;
|
||||
switch (IID) {
|
||||
default: {
|
||||
// Scalable vectors cannot be scalarized, so return Invalid.
|
||||
if (isa<ScalableVectorType>(RetTy) || any_of(Tys, [](const Type *Ty) {
|
||||
return isa<ScalableVectorType>(Ty);
|
||||
}))
|
||||
return InstructionCost::getInvalid();
|
||||
|
||||
// Assume that we need to scalarize this intrinsic.
|
||||
InstructionCost ScalarizationCost = ScalarizationCostPassed;
|
||||
unsigned ScalarCalls = 1;
|
||||
@ -1810,6 +1813,12 @@ public:
|
||||
// this will emit a costly libcall, adding call overhead and spills. Make it
|
||||
// very expensive.
|
||||
if (auto *RetVTy = dyn_cast<VectorType>(RetTy)) {
|
||||
// Scalable vectors cannot be scalarized, so return Invalid.
|
||||
if (isa<ScalableVectorType>(RetTy) || any_of(Tys, [](const Type *Ty) {
|
||||
return isa<ScalableVectorType>(Ty);
|
||||
}))
|
||||
return InstructionCost::getInvalid();
|
||||
|
||||
unsigned ScalarizationCost = SkipScalarizationCost ?
|
||||
ScalarizationCostPassed : getScalarizationOverhead(RetVTy, true, false);
|
||||
|
||||
|
@ -105,8 +105,8 @@ declare double @llvm.vector.reduce.fmax.nxv4f64(<vscale x 4 x double>)
|
||||
|
||||
define void @count_zeroes(<vscale x 4 x i32> %A) {
|
||||
; CHECK-LABEL: 'count_zeroes'
|
||||
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %ctlz = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %A, i1 true)
|
||||
; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %cttz = call <vscale x 4 x i32> @llvm.cttz.nxv4i32(<vscale x 4 x i32> %A, i1 true)
|
||||
; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %ctlz = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %A, i1 true)
|
||||
; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %cttz = call <vscale x 4 x i32> @llvm.cttz.nxv4i32(<vscale x 4 x i32> %A, i1 true)
|
||||
%ctlz = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %A, i1 true)
|
||||
%cttz = call <vscale x 4 x i32> @llvm.cttz.nxv4i32(<vscale x 4 x i32> %A, i1 true)
|
||||
ret void
|
||||
|
@ -29,7 +29,7 @@ define <vscale x 2 x double> @fadd_v2f64(<vscale x 2 x double> %a, <vscale x 2 x
|
||||
|
||||
define <vscale x 2 x double> @sqrt_v2f64(<vscale x 2 x double> %a) {
|
||||
; THRU-LABEL: 'sqrt_v2f64'
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %a)
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %a)
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret <vscale x 2 x double> %r
|
||||
;
|
||||
; LATE-LABEL: 'sqrt_v2f64'
|
||||
@ -37,11 +37,11 @@ define <vscale x 2 x double> @sqrt_v2f64(<vscale x 2 x double> %a) {
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <vscale x 2 x double> %r
|
||||
;
|
||||
; SIZE-LABEL: 'sqrt_v2f64'
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %a)
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %a)
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <vscale x 2 x double> %r
|
||||
;
|
||||
; SIZE_LATE-LABEL: 'sqrt_v2f64'
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %a)
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %r = call <vscale x 2 x double> @llvm.sqrt.nxv2f64(<vscale x 2 x double> %a)
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret <vscale x 2 x double> %r
|
||||
;
|
||||
%r = call <vscale x 2 x double> @llvm.sqrt.v2f64(<vscale x 2 x double> %a)
|
||||
|
Loading…
x
Reference in New Issue
Block a user