diff options
author | Igor Laevsky <igmyrj@gmail.com> | 2015-08-13 17:40:04 +0000 |
---|---|---|
committer | Igor Laevsky <igmyrj@gmail.com> | 2015-08-13 17:40:04 +0000 |
commit | 30143aee112770247554b8c371ea03998300667d (patch) | |
tree | 5af8ca4aad41bc5baef9ceeee768bfc42c251137 /llvm/utils/TableGen | |
parent | 29e8d343e48a524eaaff733653059bbc1862e980 (diff) | |
download | bcm5719-llvm-30143aee112770247554b8c371ea03998300667d.tar.gz bcm5719-llvm-30143aee112770247554b8c371ea03998300667d.zip |
Emit argmemonly attribute for intrinsics.
Differential Revision: http://reviews.llvm.org/D11352
llvm-svn: 244920
Diffstat (limited to 'llvm/utils/TableGen')
-rw-r--r-- | llvm/utils/TableGen/CodeGenIntrinsics.h | 5 | ||||
-rw-r--r-- | llvm/utils/TableGen/IntrinsicEmitter.cpp | 56 |
2 files changed, 26 insertions, 35 deletions
diff --git a/llvm/utils/TableGen/CodeGenIntrinsics.h b/llvm/utils/TableGen/CodeGenIntrinsics.h index f4055571b1c..7bdb7e1bc53 100644 --- a/llvm/utils/TableGen/CodeGenIntrinsics.h +++ b/llvm/utils/TableGen/CodeGenIntrinsics.h @@ -60,9 +60,10 @@ namespace llvm { IntrinsicSignature IS; // Memory mod/ref behavior of this intrinsic. - enum { + enum ModRefKind { NoMem, ReadArgMem, ReadMem, ReadWriteArgMem, ReadWriteMem - } ModRef; + }; + ModRefKind ModRef; /// This is set to true if the intrinsic is overloaded by its argument /// types. diff --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp index cebe5bbc313..c4bb6bf9cc3 100644 --- a/llvm/utils/TableGen/IntrinsicEmitter.cpp +++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp @@ -503,28 +503,6 @@ void IntrinsicEmitter::EmitGenerator(const std::vector<CodeGenIntrinsic> &Ints, } namespace { -enum ModRefKind { - MRK_none, - MRK_readonly, - MRK_readnone -}; -} - -static ModRefKind getModRefKind(const CodeGenIntrinsic &intrinsic) { - switch (intrinsic.ModRef) { - case CodeGenIntrinsic::NoMem: - return MRK_readnone; - case CodeGenIntrinsic::ReadArgMem: - case CodeGenIntrinsic::ReadMem: - return MRK_readonly; - case CodeGenIntrinsic::ReadWriteArgMem: - case CodeGenIntrinsic::ReadWriteMem: - return MRK_none; - } - llvm_unreachable("bad mod-ref kind"); -} - -namespace { struct AttributeComparator { bool operator()(const CodeGenIntrinsic *L, const CodeGenIntrinsic *R) const { // Sort throwing intrinsics after non-throwing intrinsics. @@ -541,8 +519,8 @@ struct AttributeComparator { return R->isConvergent; // Try to order by readonly/readnone attribute. - ModRefKind LK = getModRefKind(*L); - ModRefKind RK = getModRefKind(*R); + CodeGenIntrinsic::ModRefKind LK = L->ModRef; + CodeGenIntrinsic::ModRefKind RK = R->ModRef; if (LK != RK) return (LK > RK); // Order by argument attributes. @@ -649,10 +627,10 @@ EmitAttributes(const std::vector<CodeGenIntrinsic> &Ints, raw_ostream &OS) { } } - ModRefKind modRef = getModRefKind(intrinsic); - - if (!intrinsic.canThrow || modRef || intrinsic.isNoReturn || - intrinsic.isNoDuplicate || intrinsic.isConvergent) { + if (!intrinsic.canThrow || + intrinsic.ModRef != CodeGenIntrinsic::ReadWriteMem || + intrinsic.isNoReturn || intrinsic.isNoDuplicate || + intrinsic.isConvergent) { OS << " const Attribute::AttrKind Atts[] = {"; bool addComma = false; if (!intrinsic.canThrow) { @@ -678,17 +656,29 @@ EmitAttributes(const std::vector<CodeGenIntrinsic> &Ints, raw_ostream &OS) { addComma = true; } - switch (modRef) { - case MRK_none: break; - case MRK_readonly: + switch (intrinsic.ModRef) { + case CodeGenIntrinsic::NoMem: + if (addComma) + OS << ","; + OS << "Attribute::ReadNone"; + break; + case CodeGenIntrinsic::ReadArgMem: + if (addComma) + OS << ","; + OS << "Attribute::ReadOnly,"; + OS << "Attribute::ArgMemOnly"; + break; + case CodeGenIntrinsic::ReadMem: if (addComma) OS << ","; OS << "Attribute::ReadOnly"; break; - case MRK_readnone: + case CodeGenIntrinsic::ReadWriteArgMem: if (addComma) OS << ","; - OS << "Attribute::ReadNone"; + OS << "Attribute::ArgMemOnly"; + break; + case CodeGenIntrinsic::ReadWriteMem: break; } OS << "};\n"; |