Skip to content

Commit 0113cf1

Browse files
committed
[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
1 parent 54b2914 commit 0113cf1

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,11 @@ struct RISCVOperand : public MCParsedAsmOperand {
258258
bool isMem() const override { return false; }
259259
bool isSystemRegister() const { return Kind == KindTy::SystemRegister; }
260260

261+
bool isGPR() const {
262+
return Kind == KindTy::Register &&
263+
RISCVMCRegisterClasses[RISCV::GPRRegClassID].contains(Reg.RegNum);
264+
}
265+
261266
static bool evaluateConstantImm(const MCExpr *Expr, int64_t &Imm,
262267
RISCVMCExpr::VariantKind &VK) {
263268
if (auto *RE = dyn_cast<RISCVMCExpr>(Expr)) {

llvm/lib/Target/RISCV/RISCVInstrInfoA.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
def AtomicMemOpOperand : AsmOperandClass {
2121
let Name = "AtomicMemOpOperand";
2222
let RenderMethod = "addRegOperands";
23-
let PredicateMethod = "isReg";
23+
let PredicateMethod = "isGPR";
2424
let ParserMethod = "parseAtomicMemOp";
2525
}
2626

llvm/test/MC/RISCV/rva-aliases-invalid.s

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ lr.w a1, foo # CHECK: :[[@LINE]]:10: error: expected '(' or optional integer
1010
lr.w a1, 1(a0) # CHECK: :[[@LINE]]:10: error: optional integer offset must be 0
1111
lr.w a1, (foo) # CHECK: :[[@LINE]]:11: error: expected register
1212
lr.w a1, 0(foo) # CHECK: :[[@LINE]]:12: error: expected register
13+
lr.w a1, (f0) # CHECK: :[[@LINE]]:11: error: invalid operand for instruction
14+
lr.w a1, 0(f0) # CHECK: :[[@LINE]]:12: error: invalid operand for instruction
1315
lr.w a1, 0(a0 # CHECK: :[[@LINE]]:17: error: expected ')'
1416
lr.w a1, (a0 # CHECK: :[[@LINE]]:17: error: expected ')'
1517

@@ -18,6 +20,8 @@ sc.w a2, a1, foo # CHECK: :[[@LINE]]:14: error: expected '(' or optional inte
1820
sc.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:14: error: optional integer offset must be 0
1921
sc.w a2, a1, (foo) # CHECK: :[[@LINE]]:15: error: expected register
2022
sc.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:16: error: expected register
23+
sc.w a2, a1, (f0) # CHECK: :[[@LINE]]:15: error: invalid operand for instruction
24+
sc.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:16: error: invalid operand for instruction
2125
sc.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:21: error: expected ')'
2226
sc.w a2, a1, (a0 # CHECK: :[[@LINE]]:21: error: expected ')'
2327

@@ -26,6 +30,8 @@ amoswap.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional
2630
amoswap.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
2731
amoswap.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
2832
amoswap.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
33+
amoswap.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
34+
amoswap.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
2935
amoswap.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
3036
amoswap.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
3137

@@ -34,6 +40,8 @@ amoadd.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
3440
amoadd.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
3541
amoadd.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
3642
amoadd.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
43+
amoadd.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
44+
amoadd.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
3745
amoadd.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
3846
amoadd.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
3947

@@ -42,6 +50,8 @@ amoxor.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
4250
amoxor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
4351
amoxor.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
4452
amoxor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
53+
amoxor.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
54+
amoxor.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
4555
amoxor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
4656
amoxor.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
4757

@@ -50,6 +60,8 @@ amoand.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
5060
amoand.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
5161
amoand.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
5262
amoand.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
63+
amoand.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
64+
amoand.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
5365
amoand.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
5466
amoand.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
5567

@@ -58,6 +70,8 @@ amoor.w a2, a1, foo # CHECK: :[[@LINE]]:17: error: expected '(' or optional i
5870
amoor.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:17: error: optional integer offset must be 0
5971
amoor.w a2, a1, (foo) # CHECK: :[[@LINE]]:18: error: expected register
6072
amoor.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:19: error: expected register
73+
amoor.w a2, a1, (f0) # CHECK: :[[@LINE]]:18: error: invalid operand for instruction
74+
amoor.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
6175
amoor.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:24: error: expected ')'
6276
amoor.w a2, a1, (a0 # CHECK: :[[@LINE]]:24: error: expected ')'
6377

@@ -66,6 +80,8 @@ amomin.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
6680
amomin.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
6781
amomin.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
6882
amomin.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
83+
amomin.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
84+
amomin.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
6985
amomin.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
7086
amomin.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
7187

@@ -74,6 +90,8 @@ amomax.w a2, a1, foo # CHECK: :[[@LINE]]:18: error: expected '(' or optional
7490
amomax.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:18: error: optional integer offset must be 0
7591
amomax.w a2, a1, (foo) # CHECK: :[[@LINE]]:19: error: expected register
7692
amomax.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:20: error: expected register
93+
amomax.w a2, a1, (f0) # CHECK: :[[@LINE]]:19: error: invalid operand for instruction
94+
amomax.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
7795
amomax.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:25: error: expected ')'
7896
amomax.w a2, a1, (a0 # CHECK: :[[@LINE]]:25: error: expected ')'
7997

@@ -82,6 +100,8 @@ amominu.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional
82100
amominu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
83101
amominu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
84102
amominu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
103+
amominu.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
104+
amominu.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
85105
amominu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
86106
amominu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'
87107

@@ -90,5 +110,7 @@ amomaxu.w a2, a1, foo # CHECK: :[[@LINE]]:19: error: expected '(' or optional
90110
amomaxu.w a2, a1, 1(a0) # CHECK: :[[@LINE]]:19: error: optional integer offset must be 0
91111
amomaxu.w a2, a1, (foo) # CHECK: :[[@LINE]]:20: error: expected register
92112
amomaxu.w a2, a1, 0(foo) # CHECK: :[[@LINE]]:21: error: expected register
113+
amomaxu.w a2, a1, (f0) # CHECK: :[[@LINE]]:20: error: invalid operand for instruction
114+
amomaxu.w a2, a1, 0(f0) # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
93115
amomaxu.w a2, a1, 0(a0 # CHECK: :[[@LINE]]:26: error: expected ')'
94116
amomaxu.w a2, a1, (a0 # CHECK: :[[@LINE]]:26: error: expected ')'

0 commit comments

Comments
 (0)