Skip to content

Commit 29d5893

Browse files
[ESIMD] Preserve debug info in LowerESIMD pass (#3482)
[ESIMD] Preserve debug info in LowerESIMD pass
1 parent 962b00a commit 29d5893

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

llvm/lib/SYCLLowerIR/LowerESIMD.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,12 @@ static Instruction *generateVectorGenXForSpirv(ExtractElementInst *EEI,
813813
Instruction *ExtrI = ExtractElementInst::Create(
814814
IntrI, ConstantInt::get(I32Ty, ExtractIndex), ExtractName, EEI);
815815
Instruction *CastI = addCastInstIfNeeded(EEI, ExtrI);
816+
if (EEI->getDebugLoc()) {
817+
IntrI->setDebugLoc(EEI->getDebugLoc());
818+
ExtrI->setDebugLoc(EEI->getDebugLoc());
819+
// It's OK if ExtrI and CastI is the same instruction
820+
CastI->setDebugLoc(EEI->getDebugLoc());
821+
}
816822
return CastI;
817823
}
818824

@@ -839,6 +845,11 @@ static Instruction *generateGenXForSpirv(ExtractElementInst *EEI,
839845
Instruction *IntrI =
840846
IntrinsicInst::Create(NewFDecl, {}, IntrinName + Suff.str(), EEI);
841847
Instruction *CastI = addCastInstIfNeeded(EEI, IntrI);
848+
if (EEI->getDebugLoc()) {
849+
IntrI->setDebugLoc(EEI->getDebugLoc());
850+
// It's OK if IntrI and CastI is the same instruction
851+
CastI->setDebugLoc(EEI->getDebugLoc());
852+
}
842853
return CastI;
843854
}
844855

@@ -1093,6 +1104,8 @@ static void translateESIMDIntrinsicCall(CallInst &CI) {
10931104
NewFDecl, GenXArgs,
10941105
NewFDecl->getReturnType()->isVoidTy() ? "" : CI.getName() + ".esimd",
10951106
&CI);
1107+
if (CI.getDebugLoc())
1108+
NewCI->setDebugLoc(CI.getDebugLoc());
10961109
NewCI = addCastInstIfNeeded(&CI, NewCI);
10971110
CI.replaceAllUsesWith(NewCI);
10981111
CI.eraseFromParent();
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -debugify -LowerESIMD -S < %s | FileCheck %s
3+
4+
; This test checks that debug info is preserved during lowering
5+
; ESIMD specific constructs.
6+
7+
@__spirv_BuiltInGlobalInvocationId = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32
8+
9+
declare spir_func <16 x float> @_Z18__esimd_block_readIfLi16EPU3AS1fEN2cl4sycl5INTEL3gpu11vector_typeIT_XT0_EE4typeET1_j(float addrspace(1)*, i32)
10+
11+
define spir_func void @func1(float addrspace(1)* %arg1, i32 %arg2 ){
12+
; CHECK-LABEL: @func1(
13+
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint float addrspace(1)* [[ARG1:%.*]] to i32, !dbg [[DBG11:![0-9]+]]
14+
; CHECK-NEXT: [[CALL1_I_I_ESIMD:%.*]] = call <16 x float> @llvm.genx.oword.ld.unaligned.v16f32(i32 0, i32 [[TMP1]], i32 [[ARG2:%.*]]), !dbg [[DBG11]]
15+
; CHECK-NEXT: call void @llvm.dbg.value(metadata <16 x float> [[CALL1_I_I_ESIMD]], metadata [[META9:![0-9]+]], metadata !DIExpression()), !dbg [[DBG11]]
16+
; CHECK-NEXT: ret void, !dbg [[DBG12:![0-9]+]]
17+
;
18+
%call1.i.i = tail call spir_func <16 x float> @_Z18__esimd_block_readIfLi16EPU3AS1fEN2cl4sycl5INTEL3gpu11vector_typeIT_XT0_EE4typeET1_j(float addrspace(1)* %arg1, i32 %arg2)
19+
ret void
20+
}
21+
22+
define spir_func void @func2(i64 addrspace(1)* %arg1) {
23+
; CHECK-LABEL: @func2(
24+
; CHECK-NEXT: call void @llvm.dbg.value(metadata <3 x i64> undef, metadata [[META15:![0-9]+]], metadata !DIExpression()), !dbg [[DBG21:![0-9]+]]
25+
; CHECK-NEXT: [[DOTESIMD:%.*]] = call <3 x i32> @llvm.genx.local.id.v3i32(), !dbg [[DBG22:![0-9]+]]
26+
; CHECK-NEXT: [[LOCAL_ID_X:%.*]] = extractelement <3 x i32> [[DOTESIMD]], i32 0, !dbg [[DBG22]]
27+
; CHECK-NEXT: [[LOCAL_ID_X_CAST_TY:%.*]] = zext i32 [[LOCAL_ID_X]] to i64, !dbg [[DBG22]]
28+
; CHECK-NEXT: [[DOTESIMD1:%.*]] = call <3 x i32> @llvm.genx.local.size.v3i32(), !dbg [[DBG22]]
29+
; CHECK-NEXT: [[WGSIZE_X:%.*]] = extractelement <3 x i32> [[DOTESIMD1]], i32 0, !dbg [[DBG22]]
30+
; CHECK-NEXT: [[WGSIZE_X_CAST_TY:%.*]] = zext i32 [[WGSIZE_X]] to i64, !dbg [[DBG22]]
31+
; CHECK-NEXT: [[GROUP_ID_X:%.*]] = call i32 @llvm.genx.group.id.x(), !dbg [[DBG22]]
32+
; CHECK-NEXT: [[GROUP_ID_X_CAST_TY:%.*]] = zext i32 [[GROUP_ID_X]] to i64, !dbg [[DBG22]]
33+
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[WGSIZE_X_CAST_TY]], [[GROUP_ID_X_CAST_TY]]
34+
; CHECK-NEXT: [[ADD:%.*]] = add i64 [[LOCAL_ID_X_CAST_TY]], [[MUL]]
35+
; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 [[ADD]], metadata [[META17:![0-9]+]], metadata !DIExpression()), !dbg [[DBG22]]
36+
; CHECK-NEXT: [[PTRIDX_I_I:%.*]] = getelementptr inbounds i64, i64 addrspace(1)* [[ARG1:%.*]], i64 2, !dbg [[DBG23:![0-9]+]]
37+
; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 addrspace(1)* [[PTRIDX_I_I]], metadata [[META19:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23]]
38+
; CHECK-NEXT: [[PTRIDX_ASCAST_I_I:%.*]] = addrspacecast i64 addrspace(1)* [[PTRIDX_I_I]] to i64 addrspace(4)*, !dbg [[DBG24:![0-9]+]]
39+
; CHECK-NEXT: call void @llvm.dbg.value(metadata i64 addrspace(4)* [[PTRIDX_ASCAST_I_I]], metadata [[META20:![0-9]+]], metadata !DIExpression()), !dbg [[DBG24]]
40+
; CHECK-NEXT: store i64 [[ADD]], i64 addrspace(4)* [[PTRIDX_ASCAST_I_I]], align 4, !dbg [[DBG25:![0-9]+]]
41+
; CHECK-NEXT: ret void, !dbg [[DBG26:![0-9]+]]
42+
;
43+
%1 = load <3 x i64>, <3 x i64> addrspace(4)* addrspacecast (<3 x i64> addrspace(1)* @__spirv_BuiltInGlobalInvocationId to <3 x i64> addrspace(4)*)
44+
%2 = extractelement <3 x i64> %1, i64 0
45+
%ptridx.i.i = getelementptr inbounds i64, i64 addrspace(1)* %arg1, i64 2
46+
%ptridx.ascast.i.i = addrspacecast i64 addrspace(1)* %ptridx.i.i to i64 addrspace(4)*
47+
store i64 %2, i64 addrspace(4)* %ptridx.ascast.i.i
48+
ret void
49+
}

0 commit comments

Comments
 (0)