Skip to content

Commit 558b3bb

Browse files
committed
[AMDGPU][MC] Improved errors handling for SDWA operands
Reviewers: rampitec Differential Revision: https://reviews.llvm.org/D95212
1 parent f807825 commit 558b3bb

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,8 @@ class AMDGPUAsmParser : public MCTargetAsmParser {
12971297
parseNamedBit(const char *Name, OperandVector &Operands,
12981298
AMDGPUOperand::ImmTy ImmTy = AMDGPUOperand::ImmTyNone);
12991299
OperandMatchResultTy parseStringWithPrefix(StringRef Prefix,
1300-
StringRef &Value);
1300+
StringRef &Value,
1301+
SMLoc &StringLoc);
13011302

13021303
bool isModifier();
13031304
bool isOperandModifier(const AsmToken &Token, const AsmToken &NextToken) const;
@@ -5099,11 +5100,15 @@ static void addOptionalImmOperand(
50995100
}
51005101

51015102
OperandMatchResultTy
5102-
AMDGPUAsmParser::parseStringWithPrefix(StringRef Prefix, StringRef &Value) {
5103+
AMDGPUAsmParser::parseStringWithPrefix(StringRef Prefix,
5104+
StringRef &Value,
5105+
SMLoc &StringLoc) {
51035106
if (!trySkipId(Prefix, AsmToken::Colon))
51045107
return MatchOperand_NoMatch;
51055108

5106-
return parseId(Value) ? MatchOperand_Success : MatchOperand_ParseFail;
5109+
StringLoc = getLoc();
5110+
return parseId(Value, "expected an identifier") ? MatchOperand_Success
5111+
: MatchOperand_ParseFail;
51075112
}
51085113

51095114
//===----------------------------------------------------------------------===//
@@ -7523,7 +7528,8 @@ AMDGPUAsmParser::parseSDWASel(OperandVector &Operands, StringRef Prefix,
75237528
StringRef Value;
75247529
OperandMatchResultTy res;
75257530

7526-
res = parseStringWithPrefix(Prefix, Value);
7531+
SMLoc StringLoc;
7532+
res = parseStringWithPrefix(Prefix, Value, StringLoc);
75277533
if (res != MatchOperand_Success) {
75287534
return res;
75297535
}
@@ -7540,6 +7546,7 @@ AMDGPUAsmParser::parseSDWASel(OperandVector &Operands, StringRef Prefix,
75407546
.Default(0xffffffff);
75417547

75427548
if (Int == 0xffffffff) {
7549+
Error(StringLoc, "invalid " + Twine(Prefix) + " value");
75437550
return MatchOperand_ParseFail;
75447551
}
75457552

@@ -7555,7 +7562,8 @@ AMDGPUAsmParser::parseSDWADstUnused(OperandVector &Operands) {
75557562
StringRef Value;
75567563
OperandMatchResultTy res;
75577564

7558-
res = parseStringWithPrefix("dst_unused", Value);
7565+
SMLoc StringLoc;
7566+
res = parseStringWithPrefix("dst_unused", Value, StringLoc);
75597567
if (res != MatchOperand_Success) {
75607568
return res;
75617569
}
@@ -7568,6 +7576,7 @@ AMDGPUAsmParser::parseSDWADstUnused(OperandVector &Operands) {
75687576
.Default(0xffffffff);
75697577

75707578
if (Int == 0xffffffff) {
7579+
Error(StringLoc, "invalid dst_unused value");
75717580
return MatchOperand_ParseFail;
75727581
}
75737582

llvm/test/MC/AMDGPU/gfx10_err_pos.s

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,24 @@ v_mov_b32_sdwa v1, sext(u)
483483
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v1, sext(u)
484484
// CHECK-NEXT:{{^}} ^
485485

486+
//==============================================================================
487+
// expected an identifier
488+
489+
v_mov_b32_sdwa v5, v1 dst_sel:
490+
// CHECK: error: expected an identifier
491+
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:
492+
// CHECK-NEXT:{{^}} ^
493+
494+
v_mov_b32_sdwa v5, v1 dst_sel:0
495+
// CHECK: error: expected an identifier
496+
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:0
497+
// CHECK-NEXT:{{^}} ^
498+
499+
v_mov_b32_sdwa v5, v1 dst_sel:DWORD dst_unused:[UNUSED_PAD]
500+
// CHECK: error: expected an identifier
501+
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:DWORD dst_unused:[UNUSED_PAD]
502+
// CHECK-NEXT:{{^}} ^
503+
486504
//==============================================================================
487505
// expected an opening square bracket
488506

@@ -623,6 +641,22 @@ s_waitcnt vmcnt(0) & expcnt(0) x(0)
623641
// CHECK-NEXT:{{^}}s_waitcnt vmcnt(0) & expcnt(0) x(0)
624642
// CHECK-NEXT:{{^}} ^
625643

644+
//==============================================================================
645+
// invalid dst_sel value
646+
647+
v_mov_b32_sdwa v5, v1 dst_sel:WORD
648+
// CHECK: error: invalid dst_sel value
649+
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:WORD
650+
// CHECK-NEXT:{{^}} ^
651+
652+
//==============================================================================
653+
// invalid dst_unused value
654+
655+
v_mov_b32_sdwa v5, v1 dst_unused:UNUSED
656+
// CHECK: error: invalid dst_unused value
657+
// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_unused:UNUSED
658+
// CHECK-NEXT:{{^}} ^
659+
626660
//==============================================================================
627661
// invalid exp target
628662

0 commit comments

Comments
 (0)