@@ -1624,7 +1624,7 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
16241624 if (UseMaskForCond || UseMaskForGaps) {
16251625 unsigned IID = Opcode == Instruction::Load ? Intrinsic::masked_load
16261626 : Intrinsic::masked_store;
1627- Cost = thisT ()->getMaskedMemoryOpCost (
1627+ Cost = thisT ()->getMemIntrinsicInstrCost (
16281628 {IID, VecTy, Alignment, AddressSpace}, CostKind);
16291629 } else
16301630 Cost = thisT ()->getMemoryOpCost (Opcode, VecTy, Alignment, AddressSpace,
@@ -1825,9 +1825,10 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
18251825 if (auto *VPI = dyn_cast_or_null<VPIntrinsic>(ICA.getInst ()))
18261826 Alignment = VPI->getPointerAlignment ().valueOrOne ();
18271827 bool VarMask = isa<Constant>(ICA.getArgs ()[2 ]);
1828- return thisT ()->getGatherScatterOpCost (
1829- Instruction::Store, ICA.getArgTypes ()[0 ], ICA.getArgs ()[1 ], VarMask,
1830- Alignment, CostKind, nullptr );
1828+ return thisT ()->getMemIntrinsicInstrCost (
1829+ {Intrinsic::vp_scatter, ICA.getArgTypes ()[0 ], ICA.getArgs ()[1 ],
1830+ VarMask, Alignment, nullptr },
1831+ CostKind);
18311832 }
18321833 if (ICA.getID () == Intrinsic::vp_gather) {
18331834 if (ICA.isTypeBasedOnly ()) {
@@ -1841,9 +1842,10 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
18411842 if (auto *VPI = dyn_cast_or_null<VPIntrinsic>(ICA.getInst ()))
18421843 Alignment = VPI->getPointerAlignment ().valueOrOne ();
18431844 bool VarMask = isa<Constant>(ICA.getArgs ()[1 ]);
1844- return thisT ()->getGatherScatterOpCost (
1845- Instruction::Load, ICA.getReturnType (), ICA.getArgs ()[0 ], VarMask,
1846- Alignment, CostKind, nullptr );
1845+ return thisT ()->getMemIntrinsicInstrCost (
1846+ {Intrinsic::vp_gather, ICA.getReturnType (), ICA.getArgs ()[0 ],
1847+ VarMask, Alignment, nullptr },
1848+ CostKind);
18471849 }
18481850
18491851 if (ICA.getID () == Intrinsic::vp_select ||
@@ -1948,31 +1950,35 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
19481950 const Value *Mask = Args[2 ];
19491951 bool VarMask = !isa<Constant>(Mask);
19501952 Align Alignment = I->getParamAlign (1 ).valueOrOne ();
1951- return thisT ()->getGatherScatterOpCost (Instruction::Store,
1952- ICA.getArgTypes ()[0 ], Args[1 ],
1953- VarMask, Alignment, CostKind, I);
1953+ return thisT ()->getMemIntrinsicInstrCost ({Intrinsic::masked_scatter,
1954+ ICA.getArgTypes ()[0 ], Args[1 ],
1955+ VarMask, Alignment, I},
1956+ CostKind);
19541957 }
19551958 case Intrinsic::masked_gather: {
19561959 const Value *Mask = Args[1 ];
19571960 bool VarMask = !isa<Constant>(Mask);
19581961 Align Alignment = I->getParamAlign (0 ).valueOrOne ();
1959- return thisT ()->getGatherScatterOpCost (Instruction::Load, RetTy, Args[0 ],
1960- VarMask, Alignment, CostKind, I);
1962+ return thisT ()->getMemIntrinsicInstrCost (
1963+ {Intrinsic::masked_gather, RetTy, Args[0 ], VarMask, Alignment, I},
1964+ CostKind);
19611965 }
19621966 case Intrinsic::masked_compressstore: {
19631967 const Value *Data = Args[0 ];
19641968 const Value *Mask = Args[2 ];
19651969 Align Alignment = I->getParamAlign (1 ).valueOrOne ();
1966- return thisT ()->getExpandCompressMemoryOpCost (
1967- Instruction::Store, Data->getType (), !isa<Constant>(Mask), Alignment,
1968- CostKind, I);
1970+ return thisT ()->getMemIntrinsicInstrCost (
1971+ {Intrinsic::masked_compressstore, Data->getType (),
1972+ !isa<Constant>(Mask), Alignment, I},
1973+ CostKind);
19691974 }
19701975 case Intrinsic::masked_expandload: {
19711976 const Value *Mask = Args[1 ];
19721977 Align Alignment = I->getParamAlign (0 ).valueOrOne ();
1973- return thisT ()->getExpandCompressMemoryOpCost (Instruction::Load, RetTy,
1974- !isa<Constant>(Mask),
1975- Alignment, CostKind, I);
1978+ return thisT ()->getMemIntrinsicInstrCost ({Intrinsic::masked_expandload,
1979+ RetTy, !isa<Constant>(Mask),
1980+ Alignment, I},
1981+ CostKind);
19761982 }
19771983 case Intrinsic::experimental_vp_strided_store: {
19781984 const Value *Data = Args[0 ];
@@ -1983,9 +1989,8 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
19831989 Type *EltTy = cast<VectorType>(Data->getType ())->getElementType ();
19841990 Align Alignment =
19851991 I->getParamAlign (1 ).value_or (thisT ()->DL .getABITypeAlign (EltTy));
1986- return thisT ()->getStridedMemoryOpCost (Instruction::Store,
1987- Data->getType (), Ptr, VarMask,
1988- Alignment, CostKind, I);
1992+ return thisT ()->getMemIntrinsicInstrCost (
1993+ {IID, Data->getType (), Ptr, VarMask, Alignment, I}, CostKind);
19891994 }
19901995 case Intrinsic::experimental_vp_strided_load: {
19911996 const Value *Ptr = Args[0 ];
@@ -1995,8 +2000,8 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
19952000 Type *EltTy = cast<VectorType>(RetTy)->getElementType ();
19962001 Align Alignment =
19972002 I->getParamAlign (0 ).value_or (thisT ()->DL .getABITypeAlign (EltTy));
1998- return thisT ()->getStridedMemoryOpCost (Instruction::Load, RetTy, Ptr,
1999- VarMask, Alignment, CostKind, I );
2003+ return thisT ()->getMemIntrinsicInstrCost (
2004+ {IID, RetTy, Ptr, VarMask, Alignment, I}, CostKind );
20002005 }
20012006 case Intrinsic::stepvector: {
20022007 if (isa<ScalableVectorType>(RetTy))
@@ -2409,26 +2414,28 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
24092414 case Intrinsic::masked_store: {
24102415 Type *Ty = Tys[0 ];
24112416 Align TyAlign = thisT ()->DL .getABITypeAlign (Ty);
2412- return thisT ()->getMaskedMemoryOpCost ({IID, Ty, TyAlign, 0 }, CostKind);
2417+ return thisT ()->getMemIntrinsicInstrCost ({IID, Ty, TyAlign, 0 }, CostKind);
24132418 }
24142419 case Intrinsic::masked_load: {
24152420 Type *Ty = RetTy;
24162421 Align TyAlign = thisT ()->DL .getABITypeAlign (Ty);
2417- return thisT ()->getMaskedMemoryOpCost ({IID, Ty, TyAlign, 0 }, CostKind);
2422+ return thisT ()->getMemIntrinsicInstrCost ({IID, Ty, TyAlign, 0 }, CostKind);
24182423 }
24192424 case Intrinsic::experimental_vp_strided_store: {
24202425 auto *Ty = cast<VectorType>(ICA.getArgTypes ()[0 ]);
24212426 Align Alignment = thisT ()->DL .getABITypeAlign (Ty->getElementType ());
2422- return thisT ()->getStridedMemoryOpCost (
2423- Instruction::Store, Ty, /* Ptr=*/ nullptr , /* VariableMask=*/ true ,
2424- Alignment, CostKind, ICA.getInst ());
2427+ return thisT ()->getMemIntrinsicInstrCost ({IID, Ty, /* Ptr=*/ nullptr ,
2428+ /* VariableMask=*/ true ,
2429+ Alignment, ICA.getInst ()},
2430+ CostKind);
24252431 }
24262432 case Intrinsic::experimental_vp_strided_load: {
24272433 auto *Ty = cast<VectorType>(ICA.getReturnType ());
24282434 Align Alignment = thisT ()->DL .getABITypeAlign (Ty->getElementType ());
2429- return thisT ()->getStridedMemoryOpCost (
2430- Instruction::Load, Ty, /* Ptr=*/ nullptr , /* VariableMask=*/ true ,
2431- Alignment, CostKind, ICA.getInst ());
2435+ return thisT ()->getMemIntrinsicInstrCost ({IID, Ty, /* Ptr=*/ nullptr ,
2436+ /* VariableMask=*/ true ,
2437+ Alignment, ICA.getInst ()},
2438+ CostKind);
24322439 }
24332440 case Intrinsic::vector_reduce_add:
24342441 case Intrinsic::vector_reduce_mul:
@@ -3016,6 +3023,52 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
30163023 return SingleCallCost;
30173024 }
30183025
3026+ // / Get memory intrinsic cost based on arguments.
3027+ InstructionCost
3028+ getMemIntrinsicInstrCost (const MemIntrinsicCostAttributes &MICA,
3029+ TTI::TargetCostKind CostKind) const override {
3030+ unsigned Id = MICA.getID ();
3031+ Type *DataTy = MICA.getDataType ();
3032+ const Value *Ptr = MICA.getPointer ();
3033+ const Instruction *I = MICA.getInst ();
3034+ bool VariableMask = MICA.getVariableMask ();
3035+ Align Alignment = MICA.getAlignment ();
3036+
3037+ switch (Id) {
3038+ case Intrinsic::experimental_vp_strided_load:
3039+ case Intrinsic::experimental_vp_strided_store: {
3040+ unsigned Opcode = Id == Intrinsic::experimental_vp_strided_load
3041+ ? Instruction::Load
3042+ : Instruction::Store;
3043+ return thisT ()->getStridedMemoryOpCost (Opcode, DataTy, Ptr, VariableMask,
3044+ Alignment, CostKind, I);
3045+ }
3046+ case Intrinsic::masked_scatter:
3047+ case Intrinsic::masked_gather:
3048+ case Intrinsic::vp_scatter:
3049+ case Intrinsic::vp_gather: {
3050+ unsigned Opcode =
3051+ (Id == Intrinsic::masked_gather || Id == Intrinsic::vp_gather)
3052+ ? Instruction::Load
3053+ : Instruction::Store;
3054+ return thisT ()->getGatherScatterOpCost (Opcode, DataTy, Ptr, VariableMask,
3055+ Alignment, CostKind, I);
3056+ }
3057+ case Intrinsic::masked_load:
3058+ case Intrinsic::masked_store:
3059+ return thisT ()->getMaskedMemoryOpCost (MICA, CostKind);
3060+ case Intrinsic::masked_compressstore:
3061+ case Intrinsic::masked_expandload: {
3062+ unsigned Opcode = Id == Intrinsic::masked_expandload ? Instruction::Load
3063+ : Instruction::Store;
3064+ return thisT ()->getExpandCompressMemoryOpCost (
3065+ Opcode, DataTy, VariableMask, Alignment, CostKind, I);
3066+ }
3067+ default :
3068+ llvm_unreachable (" unexpected intrinsic" );
3069+ }
3070+ }
3071+
30193072 // / Compute a cost of the given call instruction.
30203073 // /
30213074 // / Compute the cost of calling function F with return type RetTy and
0 commit comments