-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[RISCV][TTI] Cost non-power-of-two size changing casts #101047
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1030,17 +1030,28 @@ InstructionCost RISCVTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, | |
| if (!IsVectorType) | ||
| return BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I); | ||
|
|
||
| bool IsTypeLegal = isTypeLegal(Src) && isTypeLegal(Dst) && | ||
| (Src->getScalarSizeInBits() <= ST->getELen()) && | ||
| (Dst->getScalarSizeInBits() <= ST->getELen()); | ||
|
|
||
| // FIXME: Need to compute legalizing cost for illegal types. | ||
| if (!IsTypeLegal) | ||
| // FIXME: Need to compute legalizing cost for illegal types. The current | ||
| // code handles only legal types and those which can be trivially | ||
| // promoted to legal. | ||
| if (Src->getScalarSizeInBits() > ST->getELen() || | ||
| Dst->getScalarSizeInBits() > ST->getELen()) | ||
| return BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I); | ||
|
|
||
| std::pair<InstructionCost, MVT> SrcLT = getTypeLegalizationCost(Src); | ||
| std::pair<InstructionCost, MVT> DstLT = getTypeLegalizationCost(Dst); | ||
|
|
||
| // Our actual lowering for the case where a wider legal type is available | ||
| // uses promotion to the wider type. This is reflected in the result of | ||
| // getTypeLegalizationCost, but BasicTTI assumes the widened cases are | ||
| // scalarized if the legalized Src and Dst are not equal sized. | ||
| const DataLayout &DL = this->getDataLayout(); | ||
| if (!SrcLT.second.isVector() || !DstLT.second.isVector() || | ||
| !TypeSize::isKnownLE(DL.getTypeSizeInBits(Src), | ||
| SrcLT.second.getSizeInBits()) || | ||
| !TypeSize::isKnownLE(DL.getTypeSizeInBits(Dst), | ||
| DstLT.second.getSizeInBits())) | ||
| return BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I); | ||
|
|
||
|
Comment on lines
+1047
to
+1054
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Before the patch, the split cost is done by BasicTTIImplBase::getCastInstrCost.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The size checks should catch this case. The only way it wouldn't would be if we split to larger types; that would be quite weird. |
||
| int ISD = TLI->InstructionOpcodeToISD(Opcode); | ||
| assert(ISD && "Invalid opcode"); | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4317,24 +4317,24 @@ define void @uitofp() { | |
|
|
||
| define void @oddvec_sizes() { | ||
| ; CHECK-LABEL: 'oddvec_sizes' | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 9 for instruction: %1 = sext <3 x i8> undef to <3 x i16> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 21 for instruction: %2 = sext <7 x i8> undef to <7 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 45 for instruction: %3 = sext <15 x i8> undef to <15 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 9 for instruction: %4 = zext <3 x i8> undef to <3 x i16> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 21 for instruction: %5 = zext <7 x i8> undef to <7 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 45 for instruction: %6 = zext <15 x i8> undef to <15 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 6 for instruction: %7 = trunc <3 x i32> undef to <3 x i8> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 14 for instruction: %8 = trunc <7 x i32> undef to <7 x i8> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 30 for instruction: %9 = trunc <15 x i32> undef to <15 x i8> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %1 = sext <3 x i8> undef to <3 x i16> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %2 = sext <7 x i8> undef to <7 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %3 = sext <15 x i8> undef to <15 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %4 = zext <3 x i8> undef to <3 x i16> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %5 = zext <7 x i8> undef to <7 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %6 = zext <15 x i8> undef to <15 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %7 = trunc <3 x i32> undef to <3 x i8> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %8 = trunc <7 x i32> undef to <7 x i8> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %9 = trunc <15 x i32> undef to <15 x i8> | ||
|
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %10 = bitcast <3 x i32> undef to <3 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %11 = bitcast <7 x i32> undef to <7 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %12 = bitcast <15 x i32> undef to <15 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 9 for instruction: %13 = sitofp <3 x i32> undef to <3 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 21 for instruction: %14 = sitofp <7 x i32> undef to <7 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 45 for instruction: %15 = sitofp <15 x i32> undef to <15 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 9 for instruction: %16 = uitofp <3 x i32> undef to <3 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 21 for instruction: %17 = uitofp <7 x i32> undef to <7 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 45 for instruction: %18 = uitofp <15 x i32> undef to <15 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %13 = sitofp <3 x i32> undef to <3 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %14 = sitofp <7 x i32> undef to <7 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %15 = sitofp <15 x i32> undef to <15 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %16 = uitofp <3 x i32> undef to <3 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %17 = uitofp <7 x i32> undef to <7 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %18 = uitofp <15 x i32> undef to <15 x float> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %19 = fptosi <3 x float> undef to <3 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %20 = fptosi <7 x float> undef to <7 x i32> | ||
| ; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %21 = fptosi <15 x float> undef to <15 x i32> | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
need
ST->hasVInstructions()before callingST->getELenThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done, thanks.