diff options
author | Craig Topper <craig.topper@sifive.com> | 2020-12-19 14:25:16 -0800 |
---|---|---|
committer | Craig Topper <craig.topper@sifive.com> | 2020-12-19 14:56:17 -0800 |
commit | 0cbceed27c491ebd185e1f53bd0f43ce655efceb (patch) | |
tree | 6b64646c4367c3504ccb63cbb75a196fbc6edf7f /llvm/utils/TableGen/CodeGenTarget.cpp | |
parent | 99930719c66df9a8b67f3575d251b182c9cc8ee9 (diff) | |
download | llvm-0cbceed27c491ebd185e1f53bd0f43ce655efceb.zip llvm-0cbceed27c491ebd185e1f53bd0f43ce655efceb.tar.gz llvm-0cbceed27c491ebd185e1f53bd0f43ce655efceb.tar.bz2 |
[TableGen][ARM][X86] Detect combining IntrReadMem and IntrWriteMem.
These properties aren't additive. They are closer to ReadOnly and
WriteOnly. The default is ReadWrite. ReadMem cancels the write property and
WriteMem cancels the read property. Combining them leaves neither.
This patch checks that when we process WriteMem, the Mod flag is
still set. And for ReadMem we check that the Ref flag set still set.
I've updated 2 target intrinsics that were combining these properties.
Reviewed By: RKSimon
Differential Revision: https://reviews.llvm.org/D93571
Diffstat (limited to 'llvm/utils/TableGen/CodeGenTarget.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenTarget.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp index 61b9fa8..0e93635 100644 --- a/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -821,11 +821,19 @@ void CodeGenIntrinsic::setDefaultProperties( void CodeGenIntrinsic::setProperty(Record *R) { if (R->getName() == "IntrNoMem") ModRef = NoMem; - else if (R->getName() == "IntrReadMem") + else if (R->getName() == "IntrReadMem") { + if (!(ModRef & MR_Ref)) + PrintFatalError(TheDef->getLoc(), + Twine("IntrReadMem cannot be used after IntrNoMem or " + "IntrWriteMem. Default is ReadWrite")); ModRef = ModRefBehavior(ModRef & ~MR_Mod); - else if (R->getName() == "IntrWriteMem") + } else if (R->getName() == "IntrWriteMem") { + if (!(ModRef & MR_Mod)) + PrintFatalError(TheDef->getLoc(), + Twine("IntrWriteMem cannot be used after IntrNoMem or " + "IntrReadMem. Default is ReadWrite")); ModRef = ModRefBehavior(ModRef & ~MR_Ref); - else if (R->getName() == "IntrArgMemOnly") + } else if (R->getName() == "IntrArgMemOnly") ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_ArgMem); else if (R->getName() == "IntrInaccessibleMemOnly") ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_InaccessibleMem); |