Skip to content

Commit

Permalink
[SPIR-V] Ensure that OpExtInst instructions generated by NonSemantic_…
Browse files Browse the repository at this point in the history
…Shader_DebugInfo_100 are not mixed up with other OpExtInst instructions (#107007)

This PR is to ensure that OpExtInst instructions generated by
NonSemantic_Shader_DebugInfo_100 are not mixed up with other OpExtInst
instructions.

Original implementation
(#97558) has introduced an
issue by moving OpExtInst instruction with the 3rd operand equal to
DebugSource (value 35) or DebugCompilationUnit (value 1) even if
OpExtInst is not generated by NonSemantic_Shader_DebugInfo_100
implementation code.

The reproducer is attached as a new test case. The code of the test case
reproduces the issue, because "lgamma" has the same code (35) inside
OpenCL_std as DebugSource inside NonSemantic_Shader_DebugInfo_100.
  • Loading branch information
VyacheslavLevytskyy authored Sep 3, 2024
1 parent ebdadcf commit 4f403e8
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
5 changes: 4 additions & 1 deletion llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,10 @@ void SPIRVModuleAnalysis::processOtherInstrs(const Module &M) {
const unsigned OpCode = MI.getOpcode();
if (OpCode == SPIRV::OpString) {
collectOtherInstr(MI, MAI, SPIRV::MB_DebugStrings, IS);
} else if (OpCode == SPIRV::OpExtInst) {
} else if (OpCode == SPIRV::OpExtInst && MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() ==
SPIRV::InstructionSet::
NonSemantic_Shader_DebugInfo_100) {
MachineOperand Ins = MI.getOperand(3);
namespace NS = SPIRV::NonSemanticExtInst;
static constexpr int64_t GlobalNonSemanticDITy[] = {
Expand Down
36 changes: 36 additions & 0 deletions llvm/test/CodeGen/SPIRV/debug-info/no-misplaced-opextinst.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
; This test is to ensure that OpExtInst generated by NonSemantic_Shader_DebugInfo_100
; are not mixed up with other OpExtInst instructions.
; The code of the test is a reproducer, because "lgamma" has the same code (35)
; inside OpenCL_std as DebugSource inside NonSemantic_Shader_DebugInfo_100.

; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}

; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}

; CHECK: %[[#Ocl:]] = OpExtInstImport "OpenCL.std"
; CHECK: OpName %[[#Fun:]] "__devicelib_lgammaf"
; CHECK: %[[#Fun]] = OpFunction %[[#]] None %[[#]]
; CHECK: OpFunctionParameter
; CHECK: %[[#]] = OpExtInst %[[#]] %[[#Ocl]] lgamma %[[#]]

define weak_odr dso_local spir_kernel void @foo() {
entry:
%r = tail call spir_func noundef float @lgammaf(float noundef 0x7FF8000000000000)
ret void
}

define weak dso_local spir_func float @lgammaf(float noundef %x) {
entry:
%call = tail call spir_func float @__devicelib_lgammaf(float noundef %x)
ret float %call
}

define weak dso_local spir_func float @__devicelib_lgammaf(float noundef %x) {
entry:
%call = tail call spir_func noundef float @_Z18__spirv_ocl_lgammaf(float noundef %x)
ret float %call
}

declare dso_local spir_func noundef float @_Z18__spirv_ocl_lgammaf(float noundef)

0 comments on commit 4f403e8

Please sign in to comment.