@@ -882,14 +882,6 @@ class VPIRFlags {
882882// / A pure-virtual common base class for recipes defining a single VPValue and
883883// / using IR flags.
884884struct VPRecipeWithIRFlags : public VPSingleDefRecipe , public VPIRFlags {
885- VPRecipeWithIRFlags (const unsigned char SC, ArrayRef<VPValue *> Operands,
886- DebugLoc DL = DebugLoc::getUnknown())
887- : VPSingleDefRecipe(SC, Operands, DL), VPIRFlags() {}
888-
889- VPRecipeWithIRFlags (const unsigned char SC, ArrayRef<VPValue *> Operands,
890- Instruction &I)
891- : VPSingleDefRecipe(SC, Operands, &I, I.getDebugLoc()), VPIRFlags(I) {}
892-
893885 VPRecipeWithIRFlags (const unsigned char SC, ArrayRef<VPValue *> Operands,
894886 const VPIRFlags &Flags,
895887 DebugLoc DL = DebugLoc::getUnknown())
@@ -1474,9 +1466,12 @@ class LLVM_ABI_FOR_TEST VPWidenRecipe : public VPRecipeWithIRFlags,
14741466 VPIRMetadata (Metadata), Opcode(Opcode) {}
14751467
14761468 VPWidenRecipe (Instruction &I, ArrayRef<VPValue *> Operands,
1477- const VPIRMetadata &Metadata, DebugLoc DL)
1478- : VPRecipeWithIRFlags(VPDef::VPWidenSC, Operands, I),
1479- VPIRMetadata(Metadata), Opcode(I.getOpcode()) {}
1469+ const VPIRFlags &Flags = {}, const VPIRMetadata &Metadata = {},
1470+ DebugLoc DL = {})
1471+ : VPRecipeWithIRFlags(VPDef::VPWidenSC, Operands, Flags, DL),
1472+ VPIRMetadata(Metadata), Opcode(I.getOpcode()) {
1473+ setUnderlyingValue (&I);
1474+ }
14801475
14811476 ~VPWidenRecipe () override = default ;
14821477
@@ -1517,30 +1512,22 @@ class VPWidenCastRecipe : public VPRecipeWithIRFlags, public VPIRMetadata {
15171512
15181513public:
15191514 VPWidenCastRecipe (Instruction::CastOps Opcode, VPValue *Op, Type *ResultTy,
1520- CastInst &UI, const VPIRMetadata &Metadata)
1521- : VPRecipeWithIRFlags(VPDef::VPWidenCastSC, Op, UI),
1522- VPIRMetadata (Metadata), Opcode(Opcode), ResultTy(ResultTy) {
1523- assert (UI.getOpcode () == Opcode &&
1524- " opcode of underlying cast doesn't match" );
1525- }
1526- VPWidenCastRecipe (Instruction::CastOps Opcode, VPValue *Op, Type *ResultTy,
1527- const VPIRFlags &Flags = {},
1515+ CastInst *CI = nullptr , const VPIRFlags &Flags = {},
15281516 const VPIRMetadata &Metadata = {},
15291517 DebugLoc DL = DebugLoc::getUnknown())
15301518 : VPRecipeWithIRFlags(VPDef::VPWidenCastSC, Op, Flags, DL),
15311519 VPIRMetadata (Metadata), Opcode(Opcode), ResultTy(ResultTy) {
15321520 assert (flagsValidForOpcode (Opcode) &&
15331521 " Set flags not supported for the provided opcode" );
1522+ setUnderlyingValue (CI);
15341523 }
15351524
15361525 ~VPWidenCastRecipe () override = default ;
15371526
15381527 VPWidenCastRecipe *clone () override {
1539- auto *New = new VPWidenCastRecipe (Opcode, getOperand (0 ), ResultTy, *this ,
1540- *this , getDebugLoc ());
1541- if (auto *UV = getUnderlyingValue ())
1542- New->setUnderlyingValue (UV);
1543- return New;
1528+ return new VPWidenCastRecipe (Opcode, getOperand (0 ), ResultTy,
1529+ cast_or_null<CastInst>(getUnderlyingValue ()),
1530+ *this , *this , getDebugLoc ());
15441531 }
15451532
15461533 VP_CLASSOF_IMPL (VPDef::VPWidenCastSC)
@@ -1585,13 +1572,17 @@ class VPWidenIntrinsicRecipe : public VPRecipeWithIRFlags, public VPIRMetadata {
15851572public:
15861573 VPWidenIntrinsicRecipe (CallInst &CI, Intrinsic::ID VectorIntrinsicID,
15871574 ArrayRef<VPValue *> CallArguments, Type *Ty,
1575+ const VPIRFlags &Flags = {},
15881576 const VPIRMetadata &MD = {},
15891577 DebugLoc DL = DebugLoc::getUnknown())
1590- : VPRecipeWithIRFlags(VPDef::VPWidenIntrinsicSC, CallArguments, CI),
1578+ : VPRecipeWithIRFlags(VPDef::VPWidenIntrinsicSC, CallArguments, Flags,
1579+ DL),
15911580 VPIRMetadata (MD), VectorIntrinsicID(VectorIntrinsicID), ResultTy(Ty),
15921581 MayReadFromMemory(CI.mayReadFromMemory()),
15931582 MayWriteToMemory(CI.mayWriteToMemory()),
1594- MayHaveSideEffects(CI.mayHaveSideEffects()) {}
1583+ MayHaveSideEffects(CI.mayHaveSideEffects()) {
1584+ setUnderlyingValue (&CI);
1585+ }
15951586
15961587 VPWidenIntrinsicRecipe (Intrinsic::ID VectorIntrinsicID,
15971588 ArrayRef<VPValue *> CallArguments, Type *Ty,
@@ -1617,7 +1608,7 @@ class VPWidenIntrinsicRecipe : public VPRecipeWithIRFlags, public VPIRMetadata {
16171608 VPWidenIntrinsicRecipe *clone () override {
16181609 if (Value *CI = getUnderlyingValue ())
16191610 return new VPWidenIntrinsicRecipe (*cast<CallInst>(CI), VectorIntrinsicID,
1620- operands (), ResultTy, *this ,
1611+ operands (), ResultTy, *this , * this ,
16211612 getDebugLoc ());
16221613 return new VPWidenIntrinsicRecipe (VectorIntrinsicID, operands (), ResultTy,
16231614 *this , *this , getDebugLoc ());
@@ -1671,10 +1662,11 @@ class LLVM_ABI_FOR_TEST VPWidenCallRecipe : public VPRecipeWithIRFlags,
16711662public:
16721663 VPWidenCallRecipe (Value *UV, Function *Variant,
16731664 ArrayRef<VPValue *> CallArguments,
1674- DebugLoc DL = DebugLoc::getUnknown())
1675- : VPRecipeWithIRFlags(VPDef::VPWidenCallSC, CallArguments,
1676- *cast<Instruction>(UV)),
1677- VPIRMetadata (*cast<Instruction>(UV)), Variant(Variant) {
1665+ const VPIRFlags &Flags = {},
1666+ const VPIRMetadata &Metadata = {}, DebugLoc DL = {})
1667+ : VPRecipeWithIRFlags(VPDef::VPWidenCallSC, CallArguments, Flags, DL),
1668+ VPIRMetadata (Metadata), Variant(Variant) {
1669+ setUnderlyingValue (UV);
16781670 assert (
16791671 isa<Function>(getOperand (getNumOperands () - 1 )->getLiveInIRValue ()) &&
16801672 " last operand must be the called function" );
@@ -1684,7 +1676,7 @@ class LLVM_ABI_FOR_TEST VPWidenCallRecipe : public VPRecipeWithIRFlags,
16841676
16851677 VPWidenCallRecipe *clone () override {
16861678 return new VPWidenCallRecipe (getUnderlyingValue (), Variant, operands (),
1687- getDebugLoc ());
1679+ * this , * this , getDebugLoc ());
16881680 }
16891681
16901682 VP_CLASSOF_IMPL (VPDef::VPWidenCallSC)
@@ -1761,16 +1753,19 @@ class VPHistogramRecipe : public VPRecipeBase {
17611753// / instruction.
17621754struct LLVM_ABI_FOR_TEST VPWidenSelectRecipe : public VPRecipeWithIRFlags,
17631755 public VPIRMetadata {
1764- VPWidenSelectRecipe (SelectInst &I, ArrayRef<VPValue *> Operands,
1765- const VPIRMetadata &MD = {})
1766- : VPRecipeWithIRFlags(VPDef::VPWidenSelectSC, Operands, I),
1767- VPIRMetadata (MD) {}
1756+ VPWidenSelectRecipe (SelectInst *SI, ArrayRef<VPValue *> Operands,
1757+ const VPIRFlags &Flags = {}, const VPIRMetadata &MD = {},
1758+ DebugLoc DL = {})
1759+ : VPRecipeWithIRFlags(VPDef::VPWidenSelectSC, Operands, Flags, DL),
1760+ VPIRMetadata (MD) {
1761+ setUnderlyingValue (SI);
1762+ }
17681763
17691764 ~VPWidenSelectRecipe () override = default ;
17701765
17711766 VPWidenSelectRecipe *clone () override {
1772- return new VPWidenSelectRecipe (* cast<SelectInst>(getUnderlyingInstr ()),
1773- operands (), *this );
1767+ return new VPWidenSelectRecipe (cast<SelectInst>(getUnderlyingInstr ()),
1768+ operands (), *this , * this , getDebugLoc () );
17741769 }
17751770
17761771 VP_CLASSOF_IMPL (VPDef::VPWidenSelectSC)
@@ -1822,9 +1817,12 @@ class LLVM_ABI_FOR_TEST VPWidenGEPRecipe : public VPRecipeWithIRFlags {
18221817 }
18231818
18241819public:
1825- VPWidenGEPRecipe (GetElementPtrInst *GEP, ArrayRef<VPValue *> Operands)
1826- : VPRecipeWithIRFlags(VPDef::VPWidenGEPSC, Operands, *GEP),
1820+ VPWidenGEPRecipe (GetElementPtrInst *GEP, ArrayRef<VPValue *> Operands,
1821+ const VPIRFlags &Flags = {},
1822+ DebugLoc DL = DebugLoc::getUnknown())
1823+ : VPRecipeWithIRFlags(VPDef::VPWidenGEPSC, Operands, Flags, DL),
18271824 SourceElementTy (GEP->getSourceElementType ()) {
1825+ setUnderlyingValue (GEP);
18281826 SmallVector<std::pair<unsigned , MDNode *>> Metadata;
18291827 (void )Metadata;
18301828 getMetadataToPropagate (GEP, Metadata);
@@ -1835,7 +1833,7 @@ class LLVM_ABI_FOR_TEST VPWidenGEPRecipe : public VPRecipeWithIRFlags {
18351833
18361834 VPWidenGEPRecipe *clone () override {
18371835 return new VPWidenGEPRecipe (cast<GetElementPtrInst>(getUnderlyingInstr ()),
1838- operands ());
1836+ operands (), * this , getDebugLoc () );
18391837 }
18401838
18411839 VP_CLASSOF_IMPL (VPDef::VPWidenGEPSC)
@@ -2929,20 +2927,22 @@ class LLVM_ABI_FOR_TEST VPReplicateRecipe : public VPRecipeWithIRFlags,
29292927public:
29302928 VPReplicateRecipe (Instruction *I, ArrayRef<VPValue *> Operands,
29312929 bool IsSingleScalar, VPValue *Mask = nullptr ,
2932- VPIRMetadata Metadata = {})
2933- : VPRecipeWithIRFlags(VPDef::VPReplicateSC, Operands, *I),
2930+ const VPIRFlags &Flags = {}, VPIRMetadata Metadata = {},
2931+ DebugLoc DL = DebugLoc::getUnknown())
2932+ : VPRecipeWithIRFlags(VPDef::VPReplicateSC, Operands, Flags, DL),
29342933 VPIRMetadata (Metadata), IsSingleScalar(IsSingleScalar),
29352934 IsPredicated(Mask) {
2935+ setUnderlyingValue (I);
29362936 if (Mask)
29372937 addOperand (Mask);
29382938 }
29392939
29402940 ~VPReplicateRecipe () override = default ;
29412941
29422942 VPReplicateRecipe *clone () override {
2943- auto *Copy =
2944- new VPReplicateRecipe ( getUnderlyingInstr (), operands (), IsSingleScalar,
2945- isPredicated () ? getMask () : nullptr , *this );
2943+ auto *Copy = new VPReplicateRecipe (
2944+ getUnderlyingInstr (), operands (), IsSingleScalar,
2945+ isPredicated () ? getMask () : nullptr , *this , * this , getDebugLoc () );
29462946 Copy->transferFlags (*this );
29472947 return Copy;
29482948 }
0 commit comments