1
+ ;=========================== begin_copyright_notice ============================
2
+ ;
3
+ ; Copyright (C) 2025 Intel Corporation
4
+ ;
5
+ ; SPDX-License-Identifier: MIT
6
+ ;
7
+ ;============================ end_copyright_notice =============================
8
+
9
+ ; REQUIRES: llvm-14-plus
10
+ ; RUN: igc_opt --opaque-pointers --platformdg2 -igc-custom-safe-opt -S < %s --dce | FileCheck %s
11
+
12
+ target datalayout = "e-p:64:64:64-p3:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-a0:0:32-n8:16:32-S32"
13
+ target triple = "dxil-ms-dx"
14
+
15
+ %__Buffer_Typed_DIM_Resource = type opaque
16
+ %"class.RWBuffer<unsigned int>" = type { i32 }
17
+ %"class.RWStructuredBuffer<xs>" = type { %struct.xs }
18
+ %struct.xs = type { i32 }
19
+
20
+ @"\01 ?outputg@@3PAIA" = external addrspace (3 ) global [32 x i32 ], align 4
21
+ @ThreadGroupSize_X = constant i32 32
22
+ @ThreadGroupSize_Y = constant i32 1
23
+ @ThreadGroupSize_Z = constant i32 1
24
+
25
+ ; -------------------------------------------------------------
26
+ ; CustomSafeOptPass: EATOMIC_IADD to EATOMIC_INC or EATOMIC_DEC
27
+ ; -------------------------------------------------------------
28
+ define void @main (<8 x i32 > %r0 ) {
29
+ ; CHECK-LABEL: @main(
30
+ ; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.genx.GenISA.DCL.SystemValue.f32(i32 14)
31
+ ; CHECK-NEXT: [[GROUPX:%.*]] = bitcast float [[TMP1]] to i32
32
+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.genx.GenISA.RuntimeValue.i32(i32 0)
33
+ ; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[TMP2]], 64
34
+ ; CHECK-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
35
+ ; CHECK-NEXT: [[U0:%.*]] = inttoptr i64 [[TMP4]] to ptr addrspace(2490369)
36
+ ; CHECK-NEXT: [[TMP5:%.*]] = zext i32 [[TMP2]] to i64
37
+ ; CHECK-NEXT: [[U01:%.*]] = inttoptr i64 [[TMP5]] to ptr addrspace(2490368)
38
+ ; CHECK-NEXT: [[TMP6:%.*]] = shl i32 [[GROUPX]], 5
39
+ ; CHECK-NEXT: [[LOCALIDX:%.*]] = call i32 @llvm.genx.GenISA.DCL.SystemValue.i32(i32 17)
40
+ ; CHECK-NEXT: [[THREADIDX:%.*]] = add i32 [[TMP6]], [[LOCALIDX]]
41
+ ; CHECK-NEXT: [[TMP7:%.*]] = call i32 @llvm.genx.GenISA.intatomictyped.i32.p2490368__Buffer_Typed_DIM_Resource(ptr addrspace(2490368) [[U01]], i32 [[THREADIDX]], i32 undef, i32 undef, i32 1, i32 2)
42
+ ; CHECK-NEXT: [[TMP8:%.*]] = call i32 @llvm.genx.GenISA.intatomictyped.i32.p2490368__Buffer_Typed_DIM_Resource(ptr addrspace(2490368) [[U01]], i32 [[THREADIDX]], i32 undef, i32 undef, i32 -1, i32 3)
43
+ ; CHECK-NEXT: [[TMP9:%.*]] = shl i32 [[THREADIDX]], 2
44
+ ; CHECK-NEXT: [[TMP10:%.*]] = call i32 @llvm.genx.GenISA.intatomicraw.i32.p2490369v4f32(ptr addrspace(2490369) [[U0]], i32 [[TMP9]], i32 1, i32 2)
45
+ ; CHECK-NEXT: [[TMP11:%.*]] = call i32 @llvm.genx.GenISA.intatomicraw.i32.p2490369v4f32(ptr addrspace(2490369) [[U0]], i32 [[TMP9]], i32 -1, i32 3)
46
+ ; CHECK-NEXT: [[TMP12:%.*]] = getelementptr [32 x i32], ptr addrspace(3) null, i32 0, i32 [[THREADIDX]]
47
+ ; CHECK-NEXT: [[TMP13:%.*]] = call i32 @llvm.genx.GenISA.intatomicrawA64.i32.p3i32.p3i32(ptr addrspace(3) [[TMP12]], ptr addrspace(3) [[TMP12]], i32 1, i32 2)
48
+ ; CHECK-NEXT: [[TMP14:%.*]] = call i32 @llvm.genx.GenISA.intatomicrawA64.i32.p3i32.p3i32(ptr addrspace(3) [[TMP12]], ptr addrspace(3) [[TMP12]], i32 -1, i32 3)
49
+ ; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr addrspace(3) [[TMP12]], align 4, !tbaa !18
50
+ ; CHECK-NEXT: [[TMP16:%.*]] = insertelement <1 x i32> undef, i32 [[TMP15]], i64 0
51
+ ; CHECK-NEXT: call void @llvm.genx.GenISA.storerawvector.indexed.p2490369v4f32.v1i32(ptr addrspace(2490369) [[U0]], i32 0, <1 x i32> [[TMP16]], i32 4, i1 false)
52
+ ; CHECK-NEXT: ret void
53
+ ;
54
+ %1 = call fast float @llvm.genx.GenISA.DCL.SystemValue.f32 (i32 14 )
55
+ %GroupID_X = bitcast float %1 to i32
56
+ %2 = call i32 @llvm.genx.GenISA.RuntimeValue.i32 (i32 0 )
57
+ %3 = add i32 %2 , 64
58
+ %4 = zext i32 %3 to i64
59
+ %u0 = inttoptr i64 %4 to <4 x float > addrspace (2490369 )*
60
+ %5 = zext i32 %2 to i64
61
+ %u01 = inttoptr i64 %5 to %__Buffer_Typed_DIM_Resource addrspace (2490368 )*
62
+ %6 = shl i32 %GroupID_X , 5
63
+ %LocalID_X = call i32 @llvm.genx.GenISA.DCL.SystemValue.i32 (i32 17 )
64
+ %ThreadID_X = add i32 %6 , %LocalID_X
65
+ %7 = call i32 @llvm.genx.GenISA.intatomictyped.i32.p2490368__Buffer_Typed_DIM_Resource (%__Buffer_Typed_DIM_Resource addrspace (2490368 )* %u01 , i32 %ThreadID_X , i32 undef , i32 undef , i32 1 , i32 0 )
66
+ %8 = call i32 @llvm.genx.GenISA.intatomictyped.i32.p2490368__Buffer_Typed_DIM_Resource (%__Buffer_Typed_DIM_Resource addrspace (2490368 )* %u01 , i32 %ThreadID_X , i32 undef , i32 undef , i32 -1 , i32 0 )
67
+ %9 = shl i32 %ThreadID_X , 2
68
+ %10 = call i32 @llvm.genx.GenISA.intatomicraw.i32.p2490369v4f32 (<4 x float > addrspace (2490369 )* %u0 , i32 %9 , i32 1 , i32 0 )
69
+ %11 = call i32 @llvm.genx.GenISA.intatomicraw.i32.p2490369v4f32 (<4 x float > addrspace (2490369 )* %u0 , i32 %9 , i32 -1 , i32 0 )
70
+ %12 = getelementptr [32 x i32 ], [32 x i32 ] addrspace (3 )* null , i32 0 , i32 %ThreadID_X
71
+ %13 = call i32 @llvm.genx.GenISA.intatomicrawA64.i32.p3i32.p3i32 (i32 addrspace (3 )* %12 , i32 addrspace (3 )* %12 , i32 1 , i32 0 )
72
+ %14 = call i32 @llvm.genx.GenISA.intatomicrawA64.i32.p3i32.p3i32 (i32 addrspace (3 )* %12 , i32 addrspace (3 )* %12 , i32 -1 , i32 0 )
73
+ %15 = load i32 , i32 addrspace (3 )* %12 , align 4 , !tbaa !18
74
+ %16 = insertelement <1 x i32 > undef , i32 %15 , i64 0
75
+ call void @llvm.genx.GenISA.storerawvector.indexed.p2490369v4f32.v1i32 (<4 x float > addrspace (2490369 )* %u0 , i32 0 , <1 x i32 > %16 , i32 4 , i1 false )
76
+ ret void
77
+ }
78
+
79
+ declare i32 @llvm.genx.GenISA.RuntimeValue.i32 (i32 )
80
+ declare i32 @llvm.genx.GenISA.intatomicrawA64.i32.p3i32.p3i32 (i32 addrspace (3 )*, i32 addrspace (3 )*, i32 , i32 )
81
+ declare float @llvm.genx.GenISA.DCL.SystemValue.f32 (i32 )
82
+ declare i32 @llvm.genx.GenISA.DCL.SystemValue.i32 (i32 )
83
+ declare i32 @llvm.genx.GenISA.intatomictyped.i32.p2490368__Buffer_Typed_DIM_Resource (%__Buffer_Typed_DIM_Resource addrspace (2490368 )*, i32 , i32 , i32 , i32 , i32 )
84
+ declare i32 @llvm.genx.GenISA.intatomicraw.i32.p2490369v4f32 (<4 x float > addrspace (2490369 )*, i32 , i32 , i32 )
85
+ declare void @llvm.genx.GenISA.storerawvector.indexed.p2490369v4f32.v1i32 (<4 x float > addrspace (2490369 )*, i32 , <1 x i32 >, i32 , i1 )
86
+
87
+ !llvm.ident = !{!0 }
88
+ !dx.version = !{!1 }
89
+ !dx.valver = !{!2 }
90
+ !dx.shaderModel = !{!3 }
91
+ !dx.resources = !{!4 }
92
+ !dx.entryPoints = !{!10 }
93
+ !igc.functions = !{!13 }
94
+
95
+ !0 = !{!"dxcoob 1.8.2502.11 (239921522)" }
96
+ !1 = !{i32 1 , i32 6 }
97
+ !2 = !{i32 1 , i32 8 }
98
+ !3 = !{!"cs" , i32 6 , i32 6 }
99
+ !4 = !{null , !5 , null , null }
100
+ !5 = !{!6 , !8 }
101
+ !6 = !{i32 0 , %"class.RWBuffer<unsigned int>" * undef , !"" , i32 0 , i32 0 , i32 1 , i32 10 , i1 false , i1 false , i1 false , !7 }
102
+ !7 = !{i32 0 , i32 5 }
103
+ !8 = !{i32 1 , %"class.RWStructuredBuffer<xs>" * undef , !"" , i32 0 , i32 1 , i32 1 , i32 12 , i1 false , i1 false , i1 false , !9 }
104
+ !9 = !{i32 1 , i32 4 }
105
+ !10 = distinct !{null , !"main" , null , !4 , !11 }
106
+ !11 = !{i32 0 , i64 8388624 , i32 4 , !12 }
107
+ !12 = !{i32 32 , i32 1 , i32 1 }
108
+ !13 = !{void (<8 x i32 >)* @main , !14 }
109
+ !14 = !{!15 , !16 }
110
+ !15 = !{!"function_type" , i32 0 }
111
+ !16 = !{!"implicit_arg_desc" , !17 }
112
+ !17 = !{i32 0 }
113
+ !18 = !{!19 , !19 , i64 0 }
114
+ !19 = !{!"int" , !20 , i64 0 }
115
+ !20 = !{!"omnipotent char" , !21 , i64 0 }
116
+ !21 = !{!"Simple C/C++ TBAA" }
0 commit comments