[CostModel] avoid crashing while finding scalarization overhead
The constrained intrinsics have metadata arguments, so the tests here were crashing as noted in D90554 (and that was reverted even though this bug exists independently of that change).
This commit is contained in:
@@ -602,7 +602,7 @@ public:
|
||||
return thisT()->getScalarizationOverhead(Ty, DemandedElts, Insert, Extract);
|
||||
}
|
||||
|
||||
/// Estimate the overhead of scalarizing an instructions unique
|
||||
/// Estimate the overhead of scalarizing an instruction's unique
|
||||
/// non-constant operands. The types of the arguments are ordinarily
|
||||
/// scalar, in which case the costs are multiplied with VF.
|
||||
unsigned getOperandsScalarizationOverhead(ArrayRef<const Value *> Args,
|
||||
@@ -610,8 +610,14 @@ public:
|
||||
unsigned Cost = 0;
|
||||
SmallPtrSet<const Value*, 4> UniqueOperands;
|
||||
for (const Value *A : Args) {
|
||||
// Disregard things like metadata arguments.
|
||||
Type *Ty = A->getType();
|
||||
if (!Ty->isIntOrIntVectorTy() && !Ty->isFPOrFPVectorTy() &&
|
||||
!Ty->isPtrOrPtrVectorTy())
|
||||
continue;
|
||||
|
||||
if (!isa<Constant>(A) && UniqueOperands.insert(A).second) {
|
||||
auto *VecTy = dyn_cast<VectorType>(A->getType());
|
||||
auto *VecTy = dyn_cast<VectorType>(Ty);
|
||||
if (VecTy) {
|
||||
// If A is a vector operand, VF should be 1 or correspond to A.
|
||||
assert((VF == 1 ||
|
||||
@@ -619,7 +625,7 @@ public:
|
||||
"Vector argument does not match VF");
|
||||
}
|
||||
else
|
||||
VecTy = FixedVectorType::get(A->getType(), VF);
|
||||
VecTy = FixedVectorType::get(Ty, VF);
|
||||
|
||||
Cost += getScalarizationOverhead(VecTy, false, true);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,9 @@ declare <16 x float> @llvm.fmuladd.v16f32(<16 x float>, <16 x float>, <16 x floa
|
||||
declare float @llvm.log2.f32(float)
|
||||
declare <16 x float> @llvm.log2.v16f32(<16 x float>)
|
||||
|
||||
declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
|
||||
declare <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float>, <16 x float>, metadata, metadata)
|
||||
|
||||
declare i32 @llvm.cttz.i32(i32, i1)
|
||||
declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)
|
||||
|
||||
@@ -112,6 +115,32 @@ define void @log2(float %a, <16 x float> %va) {
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @constrained_fadd(float %a, <16 x float> %va) {
|
||||
; THRU-LABEL: 'constrained_fadd'
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 528 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
||||
;
|
||||
; LATE-LABEL: 'constrained_fadd'
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
|
||||
;
|
||||
; SIZE-LABEL: 'constrained_fadd'
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
|
||||
;
|
||||
; SIZE_LATE-LABEL: 'constrained_fadd'
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
|
||||
;
|
||||
%s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
%t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @cttz(i32 %a, <16 x i32> %va) {
|
||||
; THRU-LABEL: 'cttz'
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call i32 @llvm.cttz.i32(i32 %a, i1 false)
|
||||
|
||||
@@ -22,6 +22,9 @@ declare <16 x float> @llvm.fmuladd.v16f32(<16 x float>, <16 x float>, <16 x floa
|
||||
declare float @llvm.log2.f32(float)
|
||||
declare <16 x float> @llvm.log2.v16f32(<16 x float>)
|
||||
|
||||
declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
|
||||
declare <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float>, <16 x float>, metadata, metadata)
|
||||
|
||||
declare i32 @llvm.cttz.i32(i32, i1)
|
||||
declare <16 x i32> @llvm.cttz.v16i32(<16 x i32>, i1)
|
||||
|
||||
@@ -143,6 +146,32 @@ define void @log2(float %a, <16 x float> %va) {
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @constrained_fadd(float %a, <16 x float> %va) {
|
||||
; THRU-LABEL: 'constrained_fadd'
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 40 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
|
||||
;
|
||||
; LATE-LABEL: 'constrained_fadd'
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
|
||||
;
|
||||
; SIZE-LABEL: 'constrained_fadd'
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
|
||||
;
|
||||
; SIZE_LATE-LABEL: 'constrained_fadd'
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
; SIZE_LATE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void
|
||||
;
|
||||
%s = call float @llvm.experimental.constrained.fadd.f32(float %a, float %a, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
%t = call <16 x float> @llvm.experimental.constrained.fadd.v16f32(<16 x float> %va, <16 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.ignore")
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @cttz(i32 %a, <16 x i32> %va) {
|
||||
; THRU-LABEL: 'cttz'
|
||||
; THRU-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %s = call i32 @llvm.cttz.i32(i32 %a, i1 false)
|
||||
|
||||
Reference in New Issue
Block a user