@@ -1107,100 +1107,6 @@ template <class BaseCL> class MemSetBase : public BaseCL {
11071107 }
11081108};
11091109
1110- // The common base class for the atomic memset/memmove/memcpy intrinsics
1111- // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
1112- class AtomicMemIntrinsic : public MemIntrinsicBase <AtomicMemIntrinsic> {
1113- private:
1114- enum { ARG_ELEMENTSIZE = 3 };
1115-
1116- public:
1117- Value *getRawElementSizeInBytes () const {
1118- return const_cast <Value *>(getArgOperand (ARG_ELEMENTSIZE));
1119- }
1120-
1121- ConstantInt *getElementSizeInBytesCst () const {
1122- return cast<ConstantInt>(getRawElementSizeInBytes ());
1123- }
1124-
1125- uint32_t getElementSizeInBytes () const {
1126- return getElementSizeInBytesCst ()->getZExtValue ();
1127- }
1128-
1129- void setElementSizeInBytes (Constant *V) {
1130- assert (V->getType () == Type::getInt8Ty (getContext ()) &&
1131- " setElementSizeInBytes called with value of wrong type!" );
1132- setArgOperand (ARG_ELEMENTSIZE, V);
1133- }
1134-
1135- static bool classof (const IntrinsicInst *I) {
1136- switch (I->getIntrinsicID ()) {
1137- case Intrinsic::memcpy_element_unordered_atomic:
1138- case Intrinsic::memmove_element_unordered_atomic:
1139- case Intrinsic::memset_element_unordered_atomic:
1140- return true ;
1141- default :
1142- return false ;
1143- }
1144- }
1145- static bool classof (const Value *V) {
1146- return isa<IntrinsicInst>(V) && classof (cast<IntrinsicInst>(V));
1147- }
1148- };
1149-
1150- // / This class represents atomic memset intrinsic
1151- // i.e. llvm.element.unordered.atomic.memset
1152- class AtomicMemSetInst : public MemSetBase <AtomicMemIntrinsic> {
1153- public:
1154- static bool classof (const IntrinsicInst *I) {
1155- return I->getIntrinsicID () == Intrinsic::memset_element_unordered_atomic;
1156- }
1157- static bool classof (const Value *V) {
1158- return isa<IntrinsicInst>(V) && classof (cast<IntrinsicInst>(V));
1159- }
1160- };
1161-
1162- // This class wraps the atomic memcpy/memmove intrinsics
1163- // i.e. llvm.element.unordered.atomic.memcpy/memmove
1164- class AtomicMemTransferInst : public MemTransferBase <AtomicMemIntrinsic> {
1165- public:
1166- static bool classof (const IntrinsicInst *I) {
1167- switch (I->getIntrinsicID ()) {
1168- case Intrinsic::memcpy_element_unordered_atomic:
1169- case Intrinsic::memmove_element_unordered_atomic:
1170- return true ;
1171- default :
1172- return false ;
1173- }
1174- }
1175- static bool classof (const Value *V) {
1176- return isa<IntrinsicInst>(V) && classof (cast<IntrinsicInst>(V));
1177- }
1178- };
1179-
1180- // / This class represents the atomic memcpy intrinsic
1181- // / i.e. llvm.element.unordered.atomic.memcpy
1182- class AtomicMemCpyInst : public AtomicMemTransferInst {
1183- public:
1184- static bool classof (const IntrinsicInst *I) {
1185- return I->getIntrinsicID () == Intrinsic::memcpy_element_unordered_atomic;
1186- }
1187- static bool classof (const Value *V) {
1188- return isa<IntrinsicInst>(V) && classof (cast<IntrinsicInst>(V));
1189- }
1190- };
1191-
1192- // / This class represents the atomic memmove intrinsic
1193- // / i.e. llvm.element.unordered.atomic.memmove
1194- class AtomicMemMoveInst : public AtomicMemTransferInst {
1195- public:
1196- static bool classof (const IntrinsicInst *I) {
1197- return I->getIntrinsicID () == Intrinsic::memmove_element_unordered_atomic;
1198- }
1199- static bool classof (const Value *V) {
1200- return isa<IntrinsicInst>(V) && classof (cast<IntrinsicInst>(V));
1201- }
1202- };
1203-
12041110// / This is the common base class for memset/memcpy/memmove.
12051111class MemIntrinsic : public MemIntrinsicBase <MemIntrinsic> {
12061112private:
@@ -1345,6 +1251,9 @@ class MemMoveInst : public MemTransferInst {
13451251// i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
13461252// and llvm.memset/memcpy/memmove
13471253class AnyMemIntrinsic : public MemIntrinsicBase <AnyMemIntrinsic> {
1254+ private:
1255+ enum { ARG_ELEMENTSIZE = 3 };
1256+
13481257public:
13491258 bool isVolatile () const {
13501259 // Only the non-atomic intrinsics can be volatile
@@ -1353,6 +1262,17 @@ class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
13531262 return false ;
13541263 }
13551264
1265+ bool isAtomic () const {
1266+ switch (getIntrinsicID ()) {
1267+ case Intrinsic::memcpy_element_unordered_atomic:
1268+ case Intrinsic::memmove_element_unordered_atomic:
1269+ case Intrinsic::memset_element_unordered_atomic:
1270+ return true ;
1271+ default :
1272+ return false ;
1273+ }
1274+ }
1275+
13561276 static bool classof (const IntrinsicInst *I) {
13571277 switch (I->getIntrinsicID ()) {
13581278 case Intrinsic::memcpy:
@@ -1371,6 +1291,16 @@ class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
13711291 static bool classof (const Value *V) {
13721292 return isa<IntrinsicInst>(V) && classof (cast<IntrinsicInst>(V));
13731293 }
1294+
1295+ Value *getRawElementSizeInBytes () const {
1296+ assert (isAtomic ());
1297+ return const_cast <Value *>(getArgOperand (ARG_ELEMENTSIZE));
1298+ }
1299+
1300+ uint32_t getElementSizeInBytes () const {
1301+ assert (isAtomic ());
1302+ return cast<ConstantInt>(getRawElementSizeInBytes ())->getZExtValue ();
1303+ }
13741304};
13751305
13761306// / This class represents any memset intrinsic
0 commit comments