Skip to content

Commit 864eead

Browse files
jrbyrnesLukacma
authored andcommitted
[AMDGPU][AsmParser]: Use dummy operand for parsing buffer_ SWZ operand. (llvm#165305)
`MCInstrDesc` counts the SWZ operand for `NumOperands` -- thus, since we do not parse this into the `MCInst` operands, there will be a mismatch between `MCInst.getNumOperands` and `MCInstrDesc.getNumOperands` . `llvm-mca` assumes that each operand counted by `MCInstrDesc.getNumOperands` will be present in `MCInst.operands` https://github.com/llvm/llvm-project/blob/263377a17570e1cbe6eeae9ffa5ce02f240839ef/llvm/lib/MCA/InstrBuilder.cpp#L324 This parses a dummy operand for the buffer_loads as a placeholder for the implicit SWZ operand. This is similar to the parsing of `tbuffer_` variants which automatically parse the dummy operand https://github.com/llvm/llvm-project/blob/263377a17570e1cbe6eeae9ffa5ce02f240839ef/llvm/utils/TableGen/AsmMatcherEmitter.cpp#L1853
1 parent 10fe786 commit 864eead

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9028,6 +9028,9 @@ void AMDGPUAsmParser::cvtMubufImpl(MCInst &Inst,
90289028

90299029
addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyOffset);
90309030
addOptionalImmOperand(Inst, Operands, OptionalIdx, AMDGPUOperand::ImmTyCPol, 0);
9031+
// Parse a dummy operand as a placeholder for the SWZ operand. This enforces
9032+
// agreement between MCInstrDesc.getNumOperands and MCInst.getNumOperands.
9033+
Inst.addOperand(MCOperand::createImm(0));
90319034
}
90329035

90339036
//===----------------------------------------------------------------------===//
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// RUN: llvm-mc -triple=amdgcn-amd-amdhsa -mcpu=gfx1100 --show-inst < %s | FileCheck %s
2+
3+
// CHECK: .amdgcn_target "amdgcn-amd-amdhsa--gfx1100"
4+
buffer_load_dwordx4 v[0:3], v0, s[0:3], 0, offen offset:4092 slc
5+
// CHECK: buffer_load_b128 v[0:3], v0, s[0:3], 0 offen offset:4092 slc ; <MCInst #13135 BUFFER_LOAD_DWORDX4_OFFEN_gfx11
6+
// CHECK-NEXT: ; <MCOperand Reg:10104>
7+
// CHECK-NEXT: ; <MCOperand Reg:486>
8+
// CHECK-NEXT: ; <MCOperand Reg:7754>
9+
// CHECK-NEXT: ; <MCOperand Imm:0>
10+
// CHECK-NEXT: ; <MCOperand Imm:4092>
11+
// CHECK-NEXT: ; <MCOperand Imm:2>
12+
// CHECK-NEXT: ; <MCOperand Imm:0>>
13+
buffer_store_dword v0, v1, s[0:3], 0 offen slc
14+
// CHECK: buffer_store_b32 v0, v1, s[0:3], 0 offen slc ; <MCInst #14553 BUFFER_STORE_DWORD_OFFEN_gfx11
15+
// CHECK-NEXT: ; <MCOperand Reg:486>
16+
// CHECK-NEXT: ; <MCOperand Reg:487>
17+
// CHECK-NEXT: ; <MCOperand Reg:7754>
18+
// CHECK-NEXT: ; <MCOperand Imm:0>
19+
// CHECK-NEXT: ; <MCOperand Imm:0>
20+
// CHECK-NEXT: ; <MCOperand Imm:2>
21+
// CHECK-NEXT: ; <MCOperand Imm:0>>
22+
23+
; tbuffer ops use autogenerate asm parsers
24+
tbuffer_load_format_xyzw v[0:3], v0, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offen offset:4092 slc
25+
// CHECK: tbuffer_load_format_xyzw v[0:3], v0, s[0:3], 0 format:[BUF_FMT_32_32_SINT] offen offset:4092 slc ; <MCInst #34095 TBUFFER_LOAD_FORMAT_XYZW_OFFEN_gfx11
26+
// CHECK-NEXT: ; <MCOperand Reg:10104>
27+
// CHECK-NEXT: ; <MCOperand Reg:486>
28+
// CHECK-NEXT: ; <MCOperand Reg:7754>
29+
// CHECK-NEXT: ; <MCOperand Imm:0>
30+
// CHECK-NEXT: ; <MCOperand Imm:4092>
31+
// CHECK-NEXT: ; <MCOperand Imm:49>
32+
// CHECK-NEXT: ; <MCOperand Imm:2>
33+
// CHECK-NEXT: ; <MCOperand Imm:0>>
34+
tbuffer_store_d16_format_x v0, v1, s[0:3], 0 format:[BUF_FMT_10_10_10_2_SNORM] offen slc
35+
// CHECK: tbuffer_store_d16_format_x v0, v1, s[0:3], 0 format:[BUF_FMT_10_10_10_2_SNORM] offen slc ; <MCInst #34264 TBUFFER_STORE_FORMAT_D16_X_OFFEN_gfx11
36+
// CHECK-NEXT: ; <MCOperand Reg:486>
37+
// CHECK-NEXT: ; <MCOperand Reg:487>
38+
// CHECK-NEXT: ; <MCOperand Reg:7754>
39+
// CHECK-NEXT: ; <MCOperand Imm:0>
40+
// CHECK-NEXT: ; <MCOperand Imm:0>
41+
// CHECK-NEXT: ; <MCOperand Imm:33>
42+
// CHECK-NEXT: ; <MCOperand Imm:2>
43+
// CHECK-NEXT: ; <MCOperand Imm:0>>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py
2+
# RUN: llvm-mca -mtriple=amdgcn-amd-amdhsa -mcpu=gfx950 < %s | FileCheck %s
3+
4+
buffer_load_dwordx4 v[30:33], v4, s[0:3], 0, offen offset:4092
5+
buffer_store_dword v0, v1, s[0:3], 0 offen
6+
7+
# CHECK: Iterations: 100
8+
# CHECK-NEXT: Instructions: 200
9+
# CHECK-NEXT: Total Cycles: 280
10+
# CHECK-NEXT: Total uOps: 200
11+
12+
# CHECK: Dispatch Width: 1
13+
# CHECK-NEXT: uOps Per Cycle: 0.71
14+
# CHECK-NEXT: IPC: 0.71
15+
# CHECK-NEXT: Block RThroughput: 2.0
16+
17+
# CHECK: Instruction Info:
18+
# CHECK-NEXT: [1]: #uOps
19+
# CHECK-NEXT: [2]: Latency
20+
# CHECK-NEXT: [3]: RThroughput
21+
# CHECK-NEXT: [4]: MayLoad
22+
# CHECK-NEXT: [5]: MayStore
23+
# CHECK-NEXT: [6]: HasSideEffects (U)
24+
25+
# CHECK: [1] [2] [3] [4] [5] [6] Instructions:
26+
# CHECK-NEXT: 1 80 1.00 * U buffer_load_dwordx4 v[30:33], v4, s[0:3], 0 offen offset:4092
27+
# CHECK-NEXT: 1 80 1.00 * U buffer_store_dword v0, v1, s[0:3], 0 offen
28+
29+
# CHECK: Resources:
30+
# CHECK-NEXT: [0] - HWBranch
31+
# CHECK-NEXT: [1] - HWExport
32+
# CHECK-NEXT: [2] - HWLGKM
33+
# CHECK-NEXT: [3] - HWSALU
34+
# CHECK-NEXT: [4] - HWVALU
35+
# CHECK-NEXT: [5] - HWVMEM
36+
# CHECK-NEXT: [6] - HWXDL
37+
38+
# CHECK: Resource pressure per iteration:
39+
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6]
40+
# CHECK-NEXT: - - - - - 2.00 -
41+
42+
# CHECK: Resource pressure by instruction:
43+
# CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] Instructions:
44+
# CHECK-NEXT: - - - - - 1.00 - buffer_load_dwordx4 v[30:33], v4, s[0:3], 0 offen offset:4092
45+
# CHECK-NEXT: - - - - - 1.00 - buffer_store_dword v0, v1, s[0:3], 0 offen

0 commit comments

Comments
 (0)