aboutsummaryrefslogtreecommitdiff
path: root/llvm/utils/TableGen/CodeGenTarget.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2020-12-19 14:25:16 -0800
committerCraig Topper <craig.topper@sifive.com>2020-12-19 14:56:17 -0800
commit0cbceed27c491ebd185e1f53bd0f43ce655efceb (patch)
tree6b64646c4367c3504ccb63cbb75a196fbc6edf7f /llvm/utils/TableGen/CodeGenTarget.cpp
parent99930719c66df9a8b67f3575d251b182c9cc8ee9 (diff)
downloadllvm-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.cpp14
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);