Skip to content

Commit a68aa8d

Browse files
committed
Move MemSetPattern out of the MemSet hierarchy
1 parent a7373b7 commit a68aa8d

File tree

5 files changed

+47
-9
lines changed

5 files changed

+47
-9
lines changed

llvm/include/llvm/IR/InstVisitor.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,9 @@ class InstVisitor {
208208
RetTy visitDbgInfoIntrinsic(DbgInfoIntrinsic &I){ DELEGATE(IntrinsicInst); }
209209
RetTy visitMemSetInst(MemSetInst &I) { DELEGATE(MemIntrinsic); }
210210
RetTy visitMemSetInlineInst(MemSetInlineInst &I){ DELEGATE(MemSetInst); }
211-
RetTy visitMemSetPatternInst(MemSetPatternInst &I) { DELEGATE(MemSetInst); }
211+
RetTy visitMemSetPatternInst(MemSetPatternInst &I) {
212+
DELEGATE(IntrinsicInst);
213+
}
212214
RetTy visitMemCpyInst(MemCpyInst &I) { DELEGATE(MemTransferInst); }
213215
RetTy visitMemCpyInlineInst(MemCpyInlineInst &I){ DELEGATE(MemCpyInst); }
214216
RetTy visitMemMoveInst(MemMoveInst &I) { DELEGATE(MemTransferInst); }

llvm/include/llvm/IR/IntrinsicInst.h

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,7 +1222,6 @@ class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
12221222
case Intrinsic::memmove:
12231223
case Intrinsic::memset:
12241224
case Intrinsic::memset_inline:
1225-
case Intrinsic::experimental_memset_pattern:
12261225
case Intrinsic::memcpy_inline:
12271226
return true;
12281227
default:
@@ -1234,16 +1233,14 @@ class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
12341233
}
12351234
};
12361235

1237-
/// This class wraps the llvm.memset, llvm.memset.inline, and
1238-
/// llvm.experimental.memset.pattern intrinsics.
1236+
/// This class wraps the llvm.memset and llvm.memset.inline intrinsics.
12391237
class MemSetInst : public MemSetBase<MemIntrinsic> {
12401238
public:
12411239
// Methods for support type inquiry through isa, cast, and dyn_cast:
12421240
static bool classof(const IntrinsicInst *I) {
12431241
switch (I->getIntrinsicID()) {
12441242
case Intrinsic::memset:
12451243
case Intrinsic::memset_inline:
1246-
case Intrinsic::experimental_memset_pattern:
12471244
return true;
12481245
default:
12491246
return false;
@@ -1266,8 +1263,36 @@ class MemSetInlineInst : public MemSetInst {
12661263
}
12671264
};
12681265

1266+
/// This is the base class for memset.pattern
1267+
class MemSetPatternIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
1268+
private:
1269+
enum { ARG_VOLATILE = 3 };
1270+
1271+
public:
1272+
ConstantInt *getVolatileCst() const {
1273+
return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
1274+
}
1275+
1276+
bool isVolatile() const { return !getVolatileCst()->isZero(); }
1277+
1278+
void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
1279+
1280+
// Methods for support of type inquiry through isa, cast, and dyn_cast:
1281+
static bool classof(const IntrinsicInst *I) {
1282+
switch (I->getIntrinsicID()) {
1283+
case Intrinsic::experimental_memset_pattern:
1284+
return true;
1285+
default:
1286+
return false;
1287+
}
1288+
}
1289+
static bool classof(const Value *V) {
1290+
return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1291+
}
1292+
};
1293+
12691294
/// This class wraps the llvm.experimental.memset.pattern intrinsic.
1270-
class MemSetPatternInst : public MemSetInst {
1295+
class MemSetPatternInst : public MemSetBase<MemSetPatternIntrinsic> {
12711296
public:
12721297
// Methods for support type inquiry through isa, cast, and dyn_cast:
12731298
static bool classof(const IntrinsicInst *I) {
@@ -1354,7 +1379,6 @@ class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
13541379
case Intrinsic::memmove:
13551380
case Intrinsic::memset:
13561381
case Intrinsic::memset_inline:
1357-
case Intrinsic::experimental_memset_pattern:
13581382
case Intrinsic::memcpy_element_unordered_atomic:
13591383
case Intrinsic::memmove_element_unordered_atomic:
13601384
case Intrinsic::memset_element_unordered_atomic:
@@ -1377,7 +1401,6 @@ class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> {
13771401
switch (I->getIntrinsicID()) {
13781402
case Intrinsic::memset:
13791403
case Intrinsic::memset_inline:
1380-
case Intrinsic::experimental_memset_pattern:
13811404
case Intrinsic::memset_element_unordered_atomic:
13821405
return true;
13831406
default:

llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class Instruction;
2525
class MemCpyInst;
2626
class MemMoveInst;
2727
class MemSetInst;
28+
class MemSetPatternInst;
2829
class ScalarEvolution;
2930
class TargetTransformInfo;
3031
class Value;
@@ -57,6 +58,9 @@ bool expandMemMoveAsLoop(MemMoveInst *MemMove, const TargetTransformInfo &TTI);
5758
/// Expand \p MemSet as a loop. \p MemSet is not deleted.
5859
void expandMemSetAsLoop(MemSetInst *MemSet);
5960

61+
/// Expand \p MemSetPattern as a loop. \p MemSet is not deleted.
62+
void expandMemSetPatternAsLoop(MemSetPatternInst *MemSet);
63+
6064
/// Expand \p AtomicMemCpy as a loop. \p AtomicMemCpy is not deleted.
6165
void expandAtomicMemCpyAsLoop(AtomicMemCpyInst *AtomicMemCpy,
6266
const TargetTransformInfo &TTI,

llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses(Function &F) const {
322322
}
323323
case Intrinsic::experimental_memset_pattern: {
324324
auto *Memset = cast<MemSetPatternInst>(Inst);
325-
expandMemSetAsLoop(Memset);
325+
expandMemSetPatternAsLoop(Memset);
326326
Changed = true;
327327
Memset->eraseFromParent();
328328
break;

llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,15 @@ void llvm::expandMemSetAsLoop(MemSetInst *Memset) {
970970
Memset->isVolatile());
971971
}
972972

973+
void llvm::expandMemSetPatternAsLoop(MemSetPatternInst *Memset) {
974+
createMemSetLoop(/* InsertBefore=*/Memset,
975+
/* DstAddr=*/Memset->getRawDest(),
976+
/* CopyLen=*/Memset->getLength(),
977+
/* SetValue=*/Memset->getValue(),
978+
/* Alignment=*/Memset->getDestAlign().valueOrOne(),
979+
Memset->isVolatile());
980+
}
981+
973982
void llvm::expandAtomicMemCpyAsLoop(AtomicMemCpyInst *AtomicMemcpy,
974983
const TargetTransformInfo &TTI,
975984
ScalarEvolution *SE) {

0 commit comments

Comments
 (0)