From 558b3bbb5b67387c5a29c1eb6548be81c1588adc Mon Sep 17 00:00:00 2001 From: Dmitry Preobrazhensky Date: Mon, 25 Jan 2021 19:01:19 +0300 Subject: [PATCH] [AMDGPU][MC] Improved errors handling for SDWA operands Reviewers: rampitec Differential Revision: https://reviews.llvm.org/D95212 --- .../Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp | 19 ++++++++---- llvm/test/MC/AMDGPU/gfx10_err_pos.s | 34 ++++++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 5146271..0352781 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -1297,7 +1297,8 @@ public: parseNamedBit(const char *Name, OperandVector &Operands, AMDGPUOperand::ImmTy ImmTy = AMDGPUOperand::ImmTyNone); OperandMatchResultTy parseStringWithPrefix(StringRef Prefix, - StringRef &Value); + StringRef &Value, + SMLoc &StringLoc); bool isModifier(); bool isOperandModifier(const AsmToken &Token, const AsmToken &NextToken) const; @@ -5099,11 +5100,15 @@ static void addOptionalImmOperand( } OperandMatchResultTy -AMDGPUAsmParser::parseStringWithPrefix(StringRef Prefix, StringRef &Value) { +AMDGPUAsmParser::parseStringWithPrefix(StringRef Prefix, + StringRef &Value, + SMLoc &StringLoc) { if (!trySkipId(Prefix, AsmToken::Colon)) return MatchOperand_NoMatch; - return parseId(Value) ? MatchOperand_Success : MatchOperand_ParseFail; + StringLoc = getLoc(); + return parseId(Value, "expected an identifier") ? MatchOperand_Success + : MatchOperand_ParseFail; } //===----------------------------------------------------------------------===// @@ -7523,7 +7528,8 @@ AMDGPUAsmParser::parseSDWASel(OperandVector &Operands, StringRef Prefix, StringRef Value; OperandMatchResultTy res; - res = parseStringWithPrefix(Prefix, Value); + SMLoc StringLoc; + res = parseStringWithPrefix(Prefix, Value, StringLoc); if (res != MatchOperand_Success) { return res; } @@ -7540,6 +7546,7 @@ AMDGPUAsmParser::parseSDWASel(OperandVector &Operands, StringRef Prefix, .Default(0xffffffff); if (Int == 0xffffffff) { + Error(StringLoc, "invalid " + Twine(Prefix) + " value"); return MatchOperand_ParseFail; } @@ -7555,7 +7562,8 @@ AMDGPUAsmParser::parseSDWADstUnused(OperandVector &Operands) { StringRef Value; OperandMatchResultTy res; - res = parseStringWithPrefix("dst_unused", Value); + SMLoc StringLoc; + res = parseStringWithPrefix("dst_unused", Value, StringLoc); if (res != MatchOperand_Success) { return res; } @@ -7568,6 +7576,7 @@ AMDGPUAsmParser::parseSDWADstUnused(OperandVector &Operands) { .Default(0xffffffff); if (Int == 0xffffffff) { + Error(StringLoc, "invalid dst_unused value"); return MatchOperand_ParseFail; } diff --git a/llvm/test/MC/AMDGPU/gfx10_err_pos.s b/llvm/test/MC/AMDGPU/gfx10_err_pos.s index cb4f9ae..b0cf979 100644 --- a/llvm/test/MC/AMDGPU/gfx10_err_pos.s +++ b/llvm/test/MC/AMDGPU/gfx10_err_pos.s @@ -484,6 +484,24 @@ v_mov_b32_sdwa v1, sext(u) // CHECK-NEXT:{{^}} ^ //============================================================================== +// expected an identifier + +v_mov_b32_sdwa v5, v1 dst_sel: +// CHECK: error: expected an identifier +// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel: +// CHECK-NEXT:{{^}} ^ + +v_mov_b32_sdwa v5, v1 dst_sel:0 +// CHECK: error: expected an identifier +// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:0 +// CHECK-NEXT:{{^}} ^ + +v_mov_b32_sdwa v5, v1 dst_sel:DWORD dst_unused:[UNUSED_PAD] +// CHECK: error: expected an identifier +// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:DWORD dst_unused:[UNUSED_PAD] +// CHECK-NEXT:{{^}} ^ + +//============================================================================== // expected an opening square bracket v_mov_b32_dpp v5, v1 dpp8:(0,1,2,3,4,5,6,7) @@ -624,6 +642,22 @@ s_waitcnt vmcnt(0) & expcnt(0) x(0) // CHECK-NEXT:{{^}} ^ //============================================================================== +// invalid dst_sel value + +v_mov_b32_sdwa v5, v1 dst_sel:WORD +// CHECK: error: invalid dst_sel value +// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_sel:WORD +// CHECK-NEXT:{{^}} ^ + +//============================================================================== +// invalid dst_unused value + +v_mov_b32_sdwa v5, v1 dst_unused:UNUSED +// CHECK: error: invalid dst_unused value +// CHECK-NEXT:{{^}}v_mov_b32_sdwa v5, v1 dst_unused:UNUSED +// CHECK-NEXT:{{^}} ^ + +//============================================================================== // invalid exp target exp invalid_target_10 v3, v2, v1, v0 -- 2.7.4