[llvm] 8ed0864 - Reland [X86] X86TTIImpl::getInterleavedMemoryOpCostAVX2(): use getMemoryOpCost()
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Sat May 22 01:52:46 PDT 2021
Author: Roman Lebedev
Date: 2021-05-22T11:47:08+03:00
New Revision: 8ed0864fd76ded2646b33de8fc610519dd7f1eb5
URL: https://github.com/llvm/llvm-project/commit/8ed0864fd76ded2646b33de8fc610519dd7f1eb5
DIFF: https://github.com/llvm/llvm-project/commit/8ed0864fd76ded2646b33de8fc610519dd7f1eb5.diff
LOG: Reland [X86] X86TTIImpl::getInterleavedMemoryOpCostAVX2(): use getMemoryOpCost()
Now that getMemoryOpCost() correctly handles all the vector variants,
we should no longer hand-roll our own version of it, but use it directly.
The AVX512 variant probably needs a similar change,
but there it is less obvious.
This was initially landed in 69ed93a4355123a45c1d7216aea7cd53d07a361b,
but was reverted in 6b95fd199d96e3ba5c28a23b17b74203522bdaa8
because the patch it depends on was reverted.
Added:
Modified:
llvm/lib/Target/X86/X86TargetTransformInfo.cpp
llvm/test/Analysis/CostModel/X86/interleaved-load-i8.ll
llvm/test/Analysis/CostModel/X86/interleaved-store-i8.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
index d0e146cd4875..7be4742c7b40 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
@@ -4724,17 +4724,9 @@ InstructionCost X86TTIImpl::getInterleavedMemoryOpCostAVX2(
ScalarTy =
Type::getIntNTy(ScalarTy->getContext(), DL.getTypeSizeInBits(ScalarTy));
- // Calculate the number of memory operations (NumOfMemOps), required
- // for load/store the VecTy.
- unsigned VecTySize = DL.getTypeStoreSize(VecTy);
- unsigned LegalVTSize = LegalVT.getStoreSize();
- unsigned NumOfMemOps = (VecTySize + LegalVTSize - 1) / LegalVTSize;
-
- // Get the cost of one memory operation.
- auto *SingleMemOpTy = FixedVectorType::get(VecTy->getElementType(),
- LegalVT.getVectorNumElements());
- InstructionCost MemOpCost = getMemoryOpCost(
- Opcode, SingleMemOpTy, MaybeAlign(Alignment), AddressSpace, CostKind);
+ // Get the cost of all the memory operations.
+ InstructionCost MemOpCosts = getMemoryOpCost(
+ Opcode, VecTy, MaybeAlign(Alignment), AddressSpace, CostKind);
auto *VT = FixedVectorType::get(ScalarTy, VF);
EVT ETy = TLI->getValueType(DL, VT);
@@ -4789,13 +4781,13 @@ InstructionCost X86TTIImpl::getInterleavedMemoryOpCostAVX2(
if (Opcode == Instruction::Load) {
if (const auto *Entry =
CostTableLookup(AVX2InterleavedLoadTbl, Factor, ETy.getSimpleVT()))
- return NumOfMemOps * MemOpCost + Entry->Cost;
+ return MemOpCosts + Entry->Cost;
} else {
assert(Opcode == Instruction::Store &&
"Expected Store Instruction at this point");
if (const auto *Entry =
CostTableLookup(AVX2InterleavedStoreTbl, Factor, ETy.getSimpleVT()))
- return NumOfMemOps * MemOpCost + Entry->Cost;
+ return MemOpCosts + Entry->Cost;
}
return BaseT::getInterleavedMemoryOpCost(Opcode, VecTy, Factor, Indices,
diff --git a/llvm/test/Analysis/CostModel/X86/interleaved-load-i8.ll b/llvm/test/Analysis/CostModel/X86/interleaved-load-i8.ll
index f43d73e64652..d20745080981 100644
--- a/llvm/test/Analysis/CostModel/X86/interleaved-load-i8.ll
+++ b/llvm/test/Analysis/CostModel/X86/interleaved-load-i8.ll
@@ -7,9 +7,9 @@ target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: norecurse nounwind readonly uwtable
define i32 @doit_stride3(i8* nocapture readonly %Ptr, i32 %Nels) {
;CHECK: LV: Found an estimated cost of 1 for VF 1 For instruction: %0 = load i8
-;CHECK: LV: Found an estimated cost of 11 for VF 2 For instruction: %0 = load i8
-;CHECK: LV: Found an estimated cost of 5 for VF 4 For instruction: %0 = load i8
-;CHECK: LV: Found an estimated cost of 10 for VF 8 For instruction: %0 = load i8
+;CHECK: LV: Found an estimated cost of 13 for VF 2 For instruction: %0 = load i8
+;CHECK: LV: Found an estimated cost of 7 for VF 4 For instruction: %0 = load i8
+;CHECK: LV: Found an estimated cost of 12 for VF 8 For instruction: %0 = load i8
;CHECK: LV: Found an estimated cost of 13 for VF 16 For instruction: %0 = load i8
;CHECK: LV: Found an estimated cost of 16 for VF 32 For instruction: %0 = load i8
entry:
diff --git a/llvm/test/Analysis/CostModel/X86/interleaved-store-i8.ll b/llvm/test/Analysis/CostModel/X86/interleaved-store-i8.ll
index 0923f131c004..349f5ad21a6f 100644
--- a/llvm/test/Analysis/CostModel/X86/interleaved-store-i8.ll
+++ b/llvm/test/Analysis/CostModel/X86/interleaved-store-i8.ll
@@ -7,9 +7,9 @@ target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: norecurse nounwind uwtable
define void @doit_stride3(i8* nocapture %Ptr, i32 %Nels) local_unnamed_addr {
;CHECK: LV: Found an estimated cost of 1 for VF 1 For instruction: store i8 %conv4
-;CHECK: LV: Found an estimated cost of 8 for VF 2 For instruction: store i8 %conv4
-;CHECK: LV: Found an estimated cost of 9 for VF 4 For instruction: store i8 %conv4
-;CHECK: LV: Found an estimated cost of 12 for VF 8 For instruction: store i8 %conv4
+;CHECK: LV: Found an estimated cost of 10 for VF 2 For instruction: store i8 %conv4
+;CHECK: LV: Found an estimated cost of 11 for VF 4 For instruction: store i8 %conv4
+;CHECK: LV: Found an estimated cost of 14 for VF 8 For instruction: store i8 %conv4
;CHECK: LV: Found an estimated cost of 13 for VF 16 For instruction: store i8 %conv4
;CHECK: LV: Found an estimated cost of 16 for VF 32 For instruction: store i8 %conv4
entry:
More information about the llvm-commits
mailing list