From a9720c67f18ac651b84d10843d170de7e36ddd2d Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Mon, 20 Jun 2016 17:51:32 +0000 Subject: [PATCH] AMDGPU: Use correct method for determining instruction size llvm-svn: 273172 --- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 6 ++-- llvm/test/CodeGen/AMDGPU/inline-asm.ll | 38 ++++++++++++++++++--- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index f4a17b90411d..7204a34a8d79 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -28,6 +28,7 @@ #include "R600RegisterInfo.h" #include "SIDefines.h" #include "SIMachineFunctionInfo.h" +#include "SIInstrInfo.h" #include "SIRegisterInfo.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/MC/MCContext.h" @@ -309,6 +310,8 @@ void AMDGPUAsmPrinter::getSIProgramInfo(SIProgramInfo &ProgInfo, bool FlatUsed = false; const SIRegisterInfo *RI = static_cast(STM.getRegisterInfo()); + const SIInstrInfo *TII = + static_cast(STM.getInstrInfo()); for (const MachineBasicBlock &MBB : MF) { for (const MachineInstr &MI : MBB) { @@ -318,8 +321,7 @@ void AMDGPUAsmPrinter::getSIProgramInfo(SIProgramInfo &ProgInfo, if (MI.isDebugValue()) continue; - // FIXME: This is reporting 0 for many instructions. - CodeSize += MI.getDesc().Size; + CodeSize += TII->getInstSizeInBytes(MI); unsigned numOperands = MI.getNumOperands(); for (unsigned op_idx = 0; op_idx < numOperands; op_idx++) { diff --git a/llvm/test/CodeGen/AMDGPU/inline-asm.ll b/llvm/test/CodeGen/AMDGPU/inline-asm.ll index 0a6b5c06d81d..f08106a96fd3 100644 --- a/llvm/test/CodeGen/AMDGPU/inline-asm.ll +++ b/llvm/test/CodeGen/AMDGPU/inline-asm.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs | FileCheck %s -; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck %s +; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s -; CHECK: {{^}}inline_asm: +; CHECK-LABEL: {{^}}inline_asm: ; CHECK: s_endpgm ; CHECK: s_endpgm define void @inline_asm(i32 addrspace(1)* %out) { @@ -11,7 +11,7 @@ entry: ret void } -; CHECK: {{^}}inline_asm_shader: +; CHECK-LABEL: {{^}}inline_asm_shader: ; CHECK: s_endpgm ; CHECK: s_endpgm define amdgpu_ps void @inline_asm_shader() { @@ -38,7 +38,7 @@ endif: ret void } -; CHECK: {{^}}v_cmp_asm: +; CHECK-LABEL: {{^}}v_cmp_asm: ; CHECK: v_mov_b32_e32 [[SRC:v[0-9]+]], s{{[0-9]+}} ; CHECK: v_cmp_ne_i32_e64 s{{\[}}[[MASK_LO:[0-9]+]]:[[MASK_HI:[0-9]+]]{{\]}}, 0, [[SRC]] ; CHECK-DAG: v_mov_b32_e32 v[[V_LO:[0-9]+]], s[[MASK_LO]] @@ -49,3 +49,31 @@ define void @v_cmp_asm(i64 addrspace(1)* %out, i32 %in) { store i64 %sgpr, i64 addrspace(1)* %out ret void } + +; CHECK-LABEL: {{^}}code_size_inline_asm: +; CHECK: codeLenInByte = 12 +define void @code_size_inline_asm(i32 addrspace(1)* %out) { +entry: + call void asm sideeffect "v_nop_e64", ""() + ret void +} + +; All inlineasm instructions are assumed to be the maximum size +; CHECK-LABEL: {{^}}code_size_inline_asm_small_inst: +; CHECK: codeLenInByte = 12 +define void @code_size_inline_asm_small_inst(i32 addrspace(1)* %out) { +entry: + call void asm sideeffect "v_nop_e32", ""() + ret void +} + +; CHECK-LABEL: {{^}}code_size_inline_asm_2_inst: +; CHECK: codeLenInByte = 20 +define void @code_size_inline_asm_2_inst(i32 addrspace(1)* %out) { +entry: + call void asm sideeffect " + v_nop_e64 + v_nop_e64 + ", ""() + ret void +}