[llvm] 0113cf1 - [RISCV] Check register class for AMO memory operands
James Clarke via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 12 16:57:38 PST 2020
Author: James Clarke
Date: 2020-01-13T00:50:37Z
New Revision: 0113cf193f0610bb1a5dfa0bcd29c41a8965938a
URL: https://github.com/llvm/llvm-project/commit/0113cf193f0610bb1a5dfa0bcd29c41a8965938a
DIFF: https://github.com/llvm/llvm-project/commit/0113cf193f0610bb1a5dfa0bcd29c41a8965938a.diff
LOG: [RISCV] Check register class for AMO memory operands
Summary:
AMO memory operands use a custom parser in order to accept both (reg)
and 0(reg). However, the validation predicate used for these operands
was only checking that they were registers, and not the register class,
so non-GPRs (such as FPRs) were also accepted. Thus, fix this by making
the predicate check that they are GPRs.
Reviewers: asb, lenary
Reviewed By: asb, lenary
Subscribers: hiraditya, rbar, johnrusso, simoncook, sabuasal, niosHD, kito-cheng, shiva0217, MaskRay, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, rkruppe, PkmX, jocewei, psnobl, benna, Jim, s.egerton, pzheng, sameer.abuasal, apazos, luismarques, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D72471
Added:
Modified:
llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
llvm/lib/Target/RISCV/RISCVInstrInfoA.td
llvm/test/MC/RISCV/rva-aliases-invalid.s
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
index f7fb4870914e..fe0455fb2228 100644
--- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
+++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
@@ -258,6 +258,11 @@ struct RISCVOperand : public MCParsedAsmOperand {
bool isMem() const override { return false; }
bool isSystemRegister() const { return Kind == KindTy::SystemRegister; }
+ bool isGPR() const {
+ return Kind == KindTy::Register &&
+ RISCVMCRegisterClasses[RISCV::GPRRegClassID].contains(Reg.RegNum);
+ }
+
static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm,
RISCVMCExpr::VariantKind &VK) {
if (auto *RE = dyn_cast<RISCVMCExpr>(Expr)) {
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoA.td b/llvm/lib/Target/RISCV/RISCVInstrInfoA.td
index 38ba3f9fb24e..7321f4bd9d2f 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoA.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoA.td
@@ -20,7 +20,7 @@
def AtomicMemOpOperand : AsmOperandClass {
let Name = "AtomicMemOpOperand";
let RenderMethod = "addRegOperands";
- let PredicateMethod = "isReg";
+ let PredicateMethod = "isGPR";
let ParserMethod = "parseAtomicMemOp";
}
diff --git a/llvm/test/MC/RISCV/rva-aliases-invalid.s b/llvm/test/MC/RISCV/rva-aliases-invalid.s
index ef101e25814d..a4e80e465faa 100644
--- a/llvm/test/MC/RISCV/rva-aliases-invalid.s
+++ b/llvm/test/MC/RISCV/rva-aliases-invalid.s
@@ -10,6 +10,8 @@ lr.w a1, foo # CHECK: :[[@LINE]]:10: error: expected '(' or optional integer
lr.w a1, 1(a0) # CHECK: :[[@LINE]]:10: error: optional integer offset must be 0
lr.w a1, (foo) # CHECK: :[[@LINE]]:11: error: expected register
lr.w a1, 0(foo) # CHECK: :[[@LINE]]:12: error: expected register
+lr.w a1, (f0) # CHECK: :[[@LINE]]:11: error: invalid operand for instruction
+lr.w a1, 0(f0) # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
lr.w a1, 0(a0 # CHECK: :[[@LINE]]:17: error: expected ')'
lr.w a1, (a0 # CHECK: :[[@LINE]]:17: error: expected ')'
@@ -18,6 +20,8 @@ sc.w a2, a1, foo # CHECK: :[[@LINE]]:14: error: expected '(' or optional inte
sc.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:14: error: optional integer offset must be 0
sc.w a2, a1, (foo) # CHECK: :[[@LINE]]:15: error: expected register
sc.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:16: error: expected register
+sc.w a2, a1, (f0) # CHECK: :[[@LINE]]:15: error: invalid operand for instruction
+sc.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:16: error: invalid operand for instruction
sc.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:21: error: expected ')'
sc.w a2, a1, (a0 # CHECK: :[[@LINE]]:21: error: expected ')'
@@ -26,6 +30,8 @@ amoswap.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional
amoswap.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
amoswap.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
amoswap.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
+amoswap.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
+amoswap.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
amoswap.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
amoswap.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
@@ -34,6 +40,8 @@ amoadd.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
amoadd.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
amoadd.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
amoadd.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoadd.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
+amoadd.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
amoadd.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
amoadd.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
@@ -42,6 +50,8 @@ amoxor.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
amoxor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
amoxor.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
amoxor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoxor.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
+amoxor.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
amoxor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
amoxor.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
@@ -50,6 +60,8 @@ amoand.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
amoand.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
amoand.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
amoand.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amoand.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
+amoand.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
amoand.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
amoand.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
@@ -58,6 +70,8 @@ amoor.w a2, a1, foo # CHECK: :[[@LINE]]:17: error: expected '(' or optional i
amoor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:17: error: optional integer offset must be 0
amoor.w a2, a1, (foo) # CHECK: :[[@LINE]]:18: error: expected register
amoor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:19: error: expected register
+amoor.w a2, a1, (f0) # CHECK: :[[@LINE]]:18: error: invalid operand for instruction
+amoor.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
amoor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:24: error: expected ')'
amoor.w a2, a1, (a0 # CHECK: :[[@LINE]]:24: error: expected ')'
@@ -66,6 +80,8 @@ amomin.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
amomin.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
amomin.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
amomin.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amomin.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
+amomin.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
amomin.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
amomin.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
@@ -74,6 +90,8 @@ amomax.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
amomax.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
amomax.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
amomax.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
+amomax.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
+amomax.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
amomax.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
amomax.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
@@ -82,6 +100,8 @@ amominu.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional
amominu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
amominu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
amominu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
+amominu.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
+amominu.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
amominu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
amominu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
@@ -90,5 +110,7 @@ amomaxu.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional
amomaxu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
amomaxu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
amomaxu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
+amomaxu.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
+amomaxu.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
amomaxu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
amomaxu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
\ No newline at end of file
More information about the llvm-commits
mailing list