From c00b31be2959890210e53b3905f55a350d851eba Mon Sep 17 00:00:00 2001 From: Sjoerd Meijer Date: Tue, 1 Dec 2020 09:17:10 +0000 Subject: [PATCH] ExtractValue instruction costs Instruction ExtractValue wasn't handled in LoopVectorizationCostModel::getInstructionCost(). As a result, it was modeled as a mul which is not really accurate. Since it is free (most of the times), this now gets a cost of 0 using getInstructionCost. This is a follow-up of D92208, that required changing this regression test. In a follow up I will look at InsertValue which also isn't handled yet. Differential Revision: https://reviews.llvm.org/D92317 --- lib/Transforms/Vectorize/LoopVectorize.cpp | 2 ++ .../extractvalue-no-scalarization-required.ll | 15 ++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index ce4f57fb394..d389e03e9c0 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -6853,6 +6853,8 @@ unsigned LoopVectorizationCostModel::getInstructionCost(Instruction *I, return std::min(CallCost, getVectorIntrinsicCost(CI, VF)); return CallCost; } + case Instruction::ExtractValue: + return TTI.getInstructionCost(I, TTI::TCK_RecipThroughput); default: // The cost of executing VF copies of the scalar instruction. This opcode // is unknown. Assume that it is the same as 'mul'. diff --git a/test/Transforms/LoopVectorize/AArch64/extractvalue-no-scalarization-required.ll b/test/Transforms/LoopVectorize/AArch64/extractvalue-no-scalarization-required.ll index 37c1f4eec32..35c2ddbf3b6 100644 --- a/test/Transforms/LoopVectorize/AArch64/extractvalue-no-scalarization-required.ll +++ b/test/Transforms/LoopVectorize/AArch64/extractvalue-no-scalarization-required.ll @@ -8,9 +8,9 @@ ; Check scalar cost for extractvalue. The constant and loop invariant operands are free, ; leaving cost 3 for scalarizing the result + 2 for executing the op with VF 2. -; CM: LV: Scalar loop costs: 7. -; CM: LV: Found an estimated cost of 19 for VF 2 For instruction: %a = extractvalue { i64, i64 } %sv, 0 -; CM-NEXT: LV: Found an estimated cost of 19 for VF 2 For instruction: %b = extractvalue { i64, i64 } %sv, 1 +; CM: LV: Scalar loop costs: 5. +; CM: LV: Found an estimated cost of 0 for VF 2 For instruction: %a = extractvalue { i64, i64 } %sv, 0 +; CM-NEXT: LV: Found an estimated cost of 0 for VF 2 For instruction: %b = extractvalue { i64, i64 } %sv, 1 ; Check that the extractvalue operands are actually free in vector code. @@ -57,9 +57,9 @@ exit: ; Similar to the test case above, but checks getVectorCallCost as well. declare float @pow(float, float) readnone nounwind -; CM: LV: Scalar loop costs: 16. -; CM: LV: Found an estimated cost of 5 for VF 2 For instruction: %a = extractvalue { float, float } %sv, 0 -; CM-NEXT: LV: Found an estimated cost of 5 for VF 2 For instruction: %b = extractvalue { float, float } %sv, 1 +; CM: LV: Scalar loop costs: 14. +; CM: LV: Found an estimated cost of 0 for VF 2 For instruction: %a = extractvalue { float, float } %sv, 0 +; CM-NEXT: LV: Found an estimated cost of 0 for VF 2 For instruction: %b = extractvalue { float, float } %sv, 1 ; FORCED-LABEL: define void @test_getVectorCallCost @@ -101,6 +101,3 @@ loop.body: exit: ret void } - - -