[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / AMX / lat-transform-amx-bitcast.ll
blob98a820197bbd6a079ff79df80c06f10cfbe4f9a0
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt --codegen-opt-level=2 -mtriple=x86_64 -lower-amx-type %s -S | FileCheck %s
4 %struct.__tile_str = type { i16, i16, <256 x i32> }
6 @buf = dso_local global [1024 x i8] zeroinitializer, align 64
7 @buf2 = dso_local global [1024 x i8] zeroinitializer, align 64
9 ; test bitcast x86_amx to <256 x i32>
10 define dso_local void @test_user_empty(i16 %m, i16 %n, i8 *%buf, i64 %s) {
11 ; CHECK-LABEL: @test_user_empty(
12 ; CHECK-NEXT:  entry:
13 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[N:%.*]], i8* [[BUF:%.*]], i64 [[S:%.*]])
14 ; CHECK-NEXT:    ret void
16 entry:
17   %t1 = call x86_amx @llvm.x86.tileloadd64.internal(i16 %m, i16 %n, i8* %buf, i64 %s)
18   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
19   ret void
22 ; test bitcast <256 x i32> to x86_amx
23 define dso_local void @test_user_empty2(<256 x i32> %in) {
24 ; CHECK-LABEL: @test_user_empty2(
25 ; CHECK-NEXT:  entry:
26 ; CHECK-NEXT:    ret void
28 entry:
29   %t = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %in)
30   ret void
33 define dso_local <256 x i32> @test_amx_load_bitcast_v256i32(<256 x i32>* %in, i16 %m, i16 %n, i8 *%buf, i64 %s) {
34 ; CHECK-LABEL: @test_amx_load_bitcast_v256i32(
35 ; CHECK-NEXT:  entry:
36 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
37 ; CHECK-NEXT:    [[T1:%.*]] = load <256 x i32>, <256 x i32>* [[IN:%.*]], align 64
38 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <256 x i32>* [[TMP0]] to i8*
39 ; CHECK-NEXT:    store <256 x i32> [[T1]], <256 x i32>* [[TMP0]], align 1024
40 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[N:%.*]] to i64
41 ; CHECK-NEXT:    [[TMP3:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[N]], i8* [[TMP1]], i64 [[TMP2]])
42 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[N]], i8* [[BUF:%.*]], i64 [[S:%.*]], x86_amx [[TMP3]])
43 ; CHECK-NEXT:    ret <256 x i32> [[T1]]
45 entry:
46   %t1 = load <256 x i32>, <256 x i32>* %in, align 64
47   %t2 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t1)
48   call void @llvm.x86.tilestored64.internal(i16 %m, i16 %n, i8* %buf, i64 %s, x86_amx %t2)
49   ret <256 x i32> %t1
52 define dso_local <225 x i32> @test_amx_load_bitcast_v225i32(<225 x i32>* %in, i16 %m, i16 %n, i8 *%buf, i64 %s) {
53 ; CHECK-LABEL: @test_amx_load_bitcast_v225i32(
54 ; CHECK-NEXT:  entry:
55 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <225 x i32>, align 64
56 ; CHECK-NEXT:    [[T1:%.*]] = load <225 x i32>, <225 x i32>* [[IN:%.*]], align 64
57 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <225 x i32>* [[TMP0]] to i8*
58 ; CHECK-NEXT:    store <225 x i32> [[T1]], <225 x i32>* [[TMP0]], align 1024
59 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[N:%.*]] to i64
60 ; CHECK-NEXT:    [[TMP3:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[N]], i8* [[TMP1]], i64 [[TMP2]])
61 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[N]], i8* [[BUF:%.*]], i64 [[S:%.*]], x86_amx [[TMP3]])
62 ; CHECK-NEXT:    ret <225 x i32> [[T1]]
64 entry:
65   %t1 = load <225 x i32>, <225 x i32>* %in, align 64
66   %t2 = call x86_amx @llvm.x86.cast.vector.to.tile.v225i32(<225 x i32> %t1)
67   call void @llvm.x86.tilestored64.internal(i16 %m, i16 %n, i8* %buf, i64 %s, x86_amx %t2)
68   ret <225 x i32> %t1
71 define dso_local <256 x i32> @test_amx_bitcast_store(<256 x i32>* %out, i16 %m, i16 %n, i8 *%buf, i64 %s) {
72 ; CHECK-LABEL: @test_amx_bitcast_store(
73 ; CHECK-NEXT:  entry:
74 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
75 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[M]], i8* [[BUF:%.*]], i64 [[S:%.*]])
76 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <256 x i32>* [[TMP0]] to i8*
77 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[M]] to i64
78 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[M]], i8* [[TMP1]], i64 [[TMP2]], x86_amx [[T1]])
79 ; CHECK-NEXT:    [[TMP3:%.*]] = load <256 x i32>, <256 x i32>* [[TMP0]], align 1024
80 ; CHECK-NEXT:    store <256 x i32> [[TMP3]], <256 x i32>* [[OUT:%.*]], align 1024
81 ; CHECK-NEXT:    ret <256 x i32> [[TMP3]]
83 entry:
84   %t1 = call x86_amx @llvm.x86.tileloadd64.internal(i16 %m, i16 %m, i8* %buf, i64 %s)
85   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
86   store <256 x i32> %t2, <256 x i32>* %out
87   ret <256 x i32> %t2
90 define dso_local void @test_src_add(<256 x i32> %x, <256 x i32> %y, i16 %r, i16 %c, i8* %buf, i64 %s) {
91 ; CHECK-LABEL: @test_src_add(
92 ; CHECK-NEXT:  entry:
93 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
94 ; CHECK-NEXT:    [[ADD:%.*]] = add <256 x i32> [[Y:%.*]], [[X:%.*]]
95 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <256 x i32>* [[TMP0]] to i8*
96 ; CHECK-NEXT:    store <256 x i32> [[ADD]], <256 x i32>* [[TMP0]], align 1024
97 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[C:%.*]] to i64
98 ; CHECK-NEXT:    [[TMP3:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[R:%.*]], i16 [[C]], i8* [[TMP1]], i64 [[TMP2]])
99 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[R]], i16 [[C]], i8* [[BUF:%.*]], i64 [[S:%.*]], x86_amx [[TMP3]])
100 ; CHECK-NEXT:    ret void
102 entry:
103   %add = add <256 x i32> %y, %x
104   %t = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %add)
105   call void @llvm.x86.tilestored64.internal(i16 %r, i16 %c, i8* %buf, i64 %s, x86_amx %t)
106   ret void
109 define dso_local void @test_src_add2(<256 x i32> %x, i16 %r, i16 %c, i8* %buf, i64 %s) {
110 ; CHECK-LABEL: @test_src_add2(
111 ; CHECK-NEXT:  entry:
112 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
113 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[R:%.*]], i16 [[C:%.*]], i8* [[BUF:%.*]], i64 [[S:%.*]])
114 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <256 x i32>* [[TMP0]] to i8*
115 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i16 [[C]] to i64
116 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[R]], i16 [[C]], i8* [[TMP1]], i64 [[TMP2]], x86_amx [[T1]])
117 ; CHECK-NEXT:    [[TMP3:%.*]] = load <256 x i32>, <256 x i32>* [[TMP0]], align 1024
118 ; CHECK-NEXT:    [[ADD:%.*]] = add <256 x i32> [[TMP3]], [[X:%.*]]
119 ; CHECK-NEXT:    ret void
121 entry:
122   %t1 = call x86_amx @llvm.x86.tileloadd64.internal(i16 %r, i16 %c, i8* %buf, i64 %s)
123   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
124   %add = add <256 x i32> %t2, %x
125   ret void
128 define dso_local void @__tile_loadd(%struct.__tile_str* nocapture %0, i8* %1, i64 %2) local_unnamed_addr {
129 ; CHECK-LABEL: @__tile_loadd(
130 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
131 ; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR:%.*]], %struct.__tile_str* [[TMP0:%.*]], i64 0, i32 0
132 ; CHECK-NEXT:    [[TMP6:%.*]] = load i16, i16* [[TMP5]], align 64
133 ; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP0]], i64 0, i32 1
134 ; CHECK-NEXT:    [[TMP8:%.*]] = load i16, i16* [[TMP7]], align 2
135 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i64 [[TMP2:%.*]], 32
136 ; CHECK-NEXT:    [[TMP10:%.*]] = ashr exact i64 [[TMP9]], 32
137 ; CHECK-NEXT:    [[TMP11:%.*]] = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP6]], i16 [[TMP8]], i8* [[TMP1:%.*]], i64 [[TMP10]])
138 ; CHECK-NEXT:    [[TMP12:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
139 ; CHECK-NEXT:    [[TMP13:%.*]] = sext i16 [[TMP8]] to i64
140 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[TMP6]], i16 [[TMP8]], i8* [[TMP12]], i64 [[TMP13]], x86_amx [[TMP11]])
141 ; CHECK-NEXT:    [[TMP14:%.*]] = load <256 x i32>, <256 x i32>* [[TMP4]], align 1024
142 ; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP0]], i64 0, i32 2
143 ; CHECK-NEXT:    store <256 x i32> [[TMP14]], <256 x i32>* [[TMP15]], align 64
144 ; CHECK-NEXT:    ret void
146   %4 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %0, i64 0, i32 0
147   %5 = load i16, i16* %4, align 64
148   %6 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %0, i64 0, i32 1
149   %7 = load i16, i16* %6, align 2
150   %8 = shl i64 %2, 32
151   %9 = ashr exact i64 %8, 32
152   %10 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %5, i16 %7, i8* %1, i64 %9)
153   %11 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %10)
154   %12 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %0, i64 0, i32 2
155   store <256 x i32> %11, <256 x i32>* %12, align 64
156   ret void
159 define dso_local void @__tile_dpbssd(%struct.__tile_str* nocapture %0, %struct.__tile_str* nocapture readonly byval(%struct.__tile_str) align 64 %1, %struct.__tile_str* nocapture readonly byval(%struct.__tile_str) align 64 %2) local_unnamed_addr {
160 ; CHECK-LABEL: @__tile_dpbssd(
161 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
162 ; CHECK-NEXT:    [[TMP5:%.*]] = alloca <256 x i32>, align 64
163 ; CHECK-NEXT:    [[TMP6:%.*]] = alloca <256 x i32>, align 64
164 ; CHECK-NEXT:    [[TMP7:%.*]] = alloca <256 x i32>, align 64
165 ; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR:%.*]], %struct.__tile_str* [[TMP1:%.*]], i64 0, i32 0
166 ; CHECK-NEXT:    [[TMP9:%.*]] = load i16, i16* [[TMP8]], align 64
167 ; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP2:%.*]], i64 0, i32 1
168 ; CHECK-NEXT:    [[TMP11:%.*]] = load i16, i16* [[TMP10]], align 2
169 ; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP1]], i64 0, i32 1
170 ; CHECK-NEXT:    [[TMP13:%.*]] = load i16, i16* [[TMP12]], align 2
171 ; CHECK-NEXT:    [[TMP14:%.*]] = udiv i16 [[TMP13]], 4
172 ; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP0:%.*]], i64 0, i32 2
173 ; CHECK-NEXT:    [[TMP16:%.*]] = load <256 x i32>, <256 x i32>* [[TMP15]], align 64
174 ; CHECK-NEXT:    [[TMP17:%.*]] = bitcast <256 x i32>* [[TMP7]] to i8*
175 ; CHECK-NEXT:    store <256 x i32> [[TMP16]], <256 x i32>* [[TMP7]], align 1024
176 ; CHECK-NEXT:    [[TMP18:%.*]] = sext i16 [[TMP11]] to i64
177 ; CHECK-NEXT:    [[TMP19:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP9]], i16 [[TMP11]], i8* [[TMP17]], i64 [[TMP18]])
178 ; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP1]], i64 0, i32 2
179 ; CHECK-NEXT:    [[TMP21:%.*]] = load <256 x i32>, <256 x i32>* [[TMP20]], align 64
180 ; CHECK-NEXT:    [[TMP22:%.*]] = bitcast <256 x i32>* [[TMP6]] to i8*
181 ; CHECK-NEXT:    store <256 x i32> [[TMP21]], <256 x i32>* [[TMP6]], align 1024
182 ; CHECK-NEXT:    [[TMP23:%.*]] = sext i16 [[TMP13]] to i64
183 ; CHECK-NEXT:    [[TMP24:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP9]], i16 [[TMP13]], i8* [[TMP22]], i64 [[TMP23]])
184 ; CHECK-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP2]], i64 0, i32 2
185 ; CHECK-NEXT:    [[TMP26:%.*]] = load <256 x i32>, <256 x i32>* [[TMP25]], align 64
186 ; CHECK-NEXT:    [[TMP27:%.*]] = bitcast <256 x i32>* [[TMP5]] to i8*
187 ; CHECK-NEXT:    store <256 x i32> [[TMP26]], <256 x i32>* [[TMP5]], align 1024
188 ; CHECK-NEXT:    [[TMP28:%.*]] = sext i16 [[TMP11]] to i64
189 ; CHECK-NEXT:    [[TMP29:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP14]], i16 [[TMP11]], i8* [[TMP27]], i64 [[TMP28]])
190 ; CHECK-NEXT:    [[TMP30:%.*]] = tail call x86_amx @llvm.x86.tdpbssd.internal(i16 [[TMP9]], i16 [[TMP11]], i16 [[TMP13]], x86_amx [[TMP19]], x86_amx [[TMP24]], x86_amx [[TMP29]])
191 ; CHECK-NEXT:    [[TMP31:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
192 ; CHECK-NEXT:    [[TMP32:%.*]] = sext i16 [[TMP11]] to i64
193 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[TMP9]], i16 [[TMP11]], i8* [[TMP31]], i64 [[TMP32]], x86_amx [[TMP30]])
194 ; CHECK-NEXT:    [[TMP33:%.*]] = load <256 x i32>, <256 x i32>* [[TMP4]], align 1024
195 ; CHECK-NEXT:    store <256 x i32> [[TMP33]], <256 x i32>* [[TMP15]], align 64
196 ; CHECK-NEXT:    ret void
198   %4 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %1, i64 0, i32 0
199   %5 = load i16, i16* %4, align 64
200   %6 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %2, i64 0, i32 1
201   %7 = load i16, i16* %6, align 2
202   %8 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %1, i64 0, i32 1
203   %9 = load i16, i16* %8, align 2
204   %10 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %0, i64 0, i32 2
205   %11 = load <256 x i32>, <256 x i32>* %10, align 64
206   %12 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %11)
207   %13 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %1, i64 0, i32 2
208   %14 = load <256 x i32>, <256 x i32>* %13, align 64
209   %15 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %14)
210   %16 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %2, i64 0, i32 2
211   %17 = load <256 x i32>, <256 x i32>* %16, align 64
212   %18 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %17)
213   %19 = tail call x86_amx @llvm.x86.tdpbssd.internal(i16 %5, i16 %7, i16 %9, x86_amx %12, x86_amx %15, x86_amx %18)
214   %20 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %19)
215   store <256 x i32> %20, <256 x i32>* %10, align 64
216   ret void
219 define dso_local void @__tile_dpbsud(i16 %m, i16 %n, i16 %k, <256 x i32>* %pc, <256 x i32>* %pa, <256 x i32>* %pb) {
220 ; CHECK-LABEL: @__tile_dpbsud(
221 ; CHECK-NEXT:    [[TMP1:%.*]] = alloca <256 x i32>, align 64
222 ; CHECK-NEXT:    [[TMP2:%.*]] = alloca <256 x i32>, align 64
223 ; CHECK-NEXT:    [[TMP3:%.*]] = alloca <256 x i32>, align 64
224 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
225 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i16 [[K:%.*]], 4
226 ; CHECK-NEXT:    [[T0:%.*]] = load <256 x i32>, <256 x i32>* [[PA:%.*]], align 64
227 ; CHECK-NEXT:    [[TMP6:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
228 ; CHECK-NEXT:    store <256 x i32> [[T0]], <256 x i32>* [[TMP4]], align 1024
229 ; CHECK-NEXT:    [[TMP7:%.*]] = sext i16 [[K]] to i64
230 ; CHECK-NEXT:    [[TMP8:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[K]], i8* [[TMP6]], i64 [[TMP7]])
231 ; CHECK-NEXT:    [[T2:%.*]] = load <256 x i32>, <256 x i32>* [[PB:%.*]], align 64
232 ; CHECK-NEXT:    [[TMP9:%.*]] = bitcast <256 x i32>* [[TMP3]] to i8*
233 ; CHECK-NEXT:    store <256 x i32> [[T2]], <256 x i32>* [[TMP3]], align 1024
234 ; CHECK-NEXT:    [[TMP10:%.*]] = sext i16 [[N:%.*]] to i64
235 ; CHECK-NEXT:    [[TMP11:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP5]], i16 [[N]], i8* [[TMP9]], i64 [[TMP10]])
236 ; CHECK-NEXT:    [[T4:%.*]] = load <256 x i32>, <256 x i32>* [[PC:%.*]], align 64
237 ; CHECK-NEXT:    [[TMP12:%.*]] = bitcast <256 x i32>* [[TMP2]] to i8*
238 ; CHECK-NEXT:    store <256 x i32> [[T4]], <256 x i32>* [[TMP2]], align 1024
239 ; CHECK-NEXT:    [[TMP13:%.*]] = sext i16 [[N]] to i64
240 ; CHECK-NEXT:    [[TMP14:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M]], i16 [[N]], i8* [[TMP12]], i64 [[TMP13]])
241 ; CHECK-NEXT:    [[T6:%.*]] = tail call x86_amx @llvm.x86.tdpbsud.internal(i16 [[M]], i16 [[N]], i16 [[K]], x86_amx [[TMP14]], x86_amx [[TMP8]], x86_amx [[TMP11]])
242 ; CHECK-NEXT:    [[TMP15:%.*]] = bitcast <256 x i32>* [[TMP1]] to i8*
243 ; CHECK-NEXT:    [[TMP16:%.*]] = sext i16 [[N]] to i64
244 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[N]], i8* [[TMP15]], i64 [[TMP16]], x86_amx [[T6]])
245 ; CHECK-NEXT:    [[TMP17:%.*]] = load <256 x i32>, <256 x i32>* [[TMP1]], align 1024
246 ; CHECK-NEXT:    store <256 x i32> [[TMP17]], <256 x i32>* [[PC]], align 64
247 ; CHECK-NEXT:    ret void
249   %t0 = load <256 x i32>, <256 x i32>* %pa, align 64
250   %t1 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t0)
251   %t2 = load <256 x i32>, <256 x i32>* %pb, align 64
252   %t3 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t2)
253   %t4 = load <256 x i32>, <256 x i32>* %pc, align 64
254   %t5 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t4)
255   %t6 = tail call x86_amx @llvm.x86.tdpbsud.internal(i16 %m, i16 %n, i16 %k, x86_amx %t5, x86_amx %t1, x86_amx %t3)
256   %t7 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t6)
257   store <256 x i32> %t7, <256 x i32>* %pc, align 64
258   ret void
261 define dso_local void @__tile_dpbusd(i16 %m, i16 %n, i16 %k, <256 x i32>* %pc, <256 x i32>* %pa, <256 x i32>* %pb) {
262 ; CHECK-LABEL: @__tile_dpbusd(
263 ; CHECK-NEXT:    [[TMP1:%.*]] = alloca <256 x i32>, align 64
264 ; CHECK-NEXT:    [[TMP2:%.*]] = alloca <256 x i32>, align 64
265 ; CHECK-NEXT:    [[TMP3:%.*]] = alloca <256 x i32>, align 64
266 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
267 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i16 [[K:%.*]], 4
268 ; CHECK-NEXT:    [[T0:%.*]] = load <256 x i32>, <256 x i32>* [[PA:%.*]], align 64
269 ; CHECK-NEXT:    [[TMP6:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
270 ; CHECK-NEXT:    store <256 x i32> [[T0]], <256 x i32>* [[TMP4]], align 1024
271 ; CHECK-NEXT:    [[TMP7:%.*]] = sext i16 [[K]] to i64
272 ; CHECK-NEXT:    [[TMP8:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[K]], i8* [[TMP6]], i64 [[TMP7]])
273 ; CHECK-NEXT:    [[T2:%.*]] = load <256 x i32>, <256 x i32>* [[PB:%.*]], align 64
274 ; CHECK-NEXT:    [[TMP9:%.*]] = bitcast <256 x i32>* [[TMP3]] to i8*
275 ; CHECK-NEXT:    store <256 x i32> [[T2]], <256 x i32>* [[TMP3]], align 1024
276 ; CHECK-NEXT:    [[TMP10:%.*]] = sext i16 [[N:%.*]] to i64
277 ; CHECK-NEXT:    [[TMP11:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP5]], i16 [[N]], i8* [[TMP9]], i64 [[TMP10]])
278 ; CHECK-NEXT:    [[T4:%.*]] = load <256 x i32>, <256 x i32>* [[PC:%.*]], align 64
279 ; CHECK-NEXT:    [[TMP12:%.*]] = bitcast <256 x i32>* [[TMP2]] to i8*
280 ; CHECK-NEXT:    store <256 x i32> [[T4]], <256 x i32>* [[TMP2]], align 1024
281 ; CHECK-NEXT:    [[TMP13:%.*]] = sext i16 [[N]] to i64
282 ; CHECK-NEXT:    [[TMP14:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M]], i16 [[N]], i8* [[TMP12]], i64 [[TMP13]])
283 ; CHECK-NEXT:    [[T6:%.*]] = tail call x86_amx @llvm.x86.tdpbusd.internal(i16 [[M]], i16 [[N]], i16 [[K]], x86_amx [[TMP14]], x86_amx [[TMP8]], x86_amx [[TMP11]])
284 ; CHECK-NEXT:    [[TMP15:%.*]] = bitcast <256 x i32>* [[TMP1]] to i8*
285 ; CHECK-NEXT:    [[TMP16:%.*]] = sext i16 [[N]] to i64
286 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[N]], i8* [[TMP15]], i64 [[TMP16]], x86_amx [[T6]])
287 ; CHECK-NEXT:    [[TMP17:%.*]] = load <256 x i32>, <256 x i32>* [[TMP1]], align 1024
288 ; CHECK-NEXT:    store <256 x i32> [[TMP17]], <256 x i32>* [[PC]], align 64
289 ; CHECK-NEXT:    ret void
291   %t0 = load <256 x i32>, <256 x i32>* %pa, align 64
292   %t1 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t0)
293   %t2 = load <256 x i32>, <256 x i32>* %pb, align 64
294   %t3 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t2)
295   %t4 = load <256 x i32>, <256 x i32>* %pc, align 64
296   %t5 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t4)
297   %t6 = tail call x86_amx @llvm.x86.tdpbusd.internal(i16 %m, i16 %n, i16 %k, x86_amx %t5, x86_amx %t1, x86_amx %t3)
298   %t7 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t6)
299   store <256 x i32> %t7, <256 x i32>* %pc, align 64
300   ret void
303 define dso_local void @__tile_dpbuud(i16 %m, i16 %n, i16 %k, <256 x i32>* %pc, <256 x i32>* %pa, <256 x i32>* %pb) {
304 ; CHECK-LABEL: @__tile_dpbuud(
305 ; CHECK-NEXT:    [[TMP1:%.*]] = alloca <256 x i32>, align 64
306 ; CHECK-NEXT:    [[TMP2:%.*]] = alloca <256 x i32>, align 64
307 ; CHECK-NEXT:    [[TMP3:%.*]] = alloca <256 x i32>, align 64
308 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
309 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i16 [[K:%.*]], 4
310 ; CHECK-NEXT:    [[T0:%.*]] = load <256 x i32>, <256 x i32>* [[PA:%.*]], align 64
311 ; CHECK-NEXT:    [[TMP6:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
312 ; CHECK-NEXT:    store <256 x i32> [[T0]], <256 x i32>* [[TMP4]], align 1024
313 ; CHECK-NEXT:    [[TMP7:%.*]] = sext i16 [[K]] to i64
314 ; CHECK-NEXT:    [[TMP8:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[K]], i8* [[TMP6]], i64 [[TMP7]])
315 ; CHECK-NEXT:    [[T2:%.*]] = load <256 x i32>, <256 x i32>* [[PB:%.*]], align 64
316 ; CHECK-NEXT:    [[TMP9:%.*]] = bitcast <256 x i32>* [[TMP3]] to i8*
317 ; CHECK-NEXT:    store <256 x i32> [[T2]], <256 x i32>* [[TMP3]], align 1024
318 ; CHECK-NEXT:    [[TMP10:%.*]] = sext i16 [[N:%.*]] to i64
319 ; CHECK-NEXT:    [[TMP11:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP5]], i16 [[N]], i8* [[TMP9]], i64 [[TMP10]])
320 ; CHECK-NEXT:    [[T4:%.*]] = load <256 x i32>, <256 x i32>* [[PC:%.*]], align 64
321 ; CHECK-NEXT:    [[TMP12:%.*]] = bitcast <256 x i32>* [[TMP2]] to i8*
322 ; CHECK-NEXT:    store <256 x i32> [[T4]], <256 x i32>* [[TMP2]], align 1024
323 ; CHECK-NEXT:    [[TMP13:%.*]] = sext i16 [[N]] to i64
324 ; CHECK-NEXT:    [[TMP14:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M]], i16 [[N]], i8* [[TMP12]], i64 [[TMP13]])
325 ; CHECK-NEXT:    [[T6:%.*]] = tail call x86_amx @llvm.x86.tdpbuud.internal(i16 [[M]], i16 [[N]], i16 [[K]], x86_amx [[TMP14]], x86_amx [[TMP8]], x86_amx [[TMP11]])
326 ; CHECK-NEXT:    [[TMP15:%.*]] = bitcast <256 x i32>* [[TMP1]] to i8*
327 ; CHECK-NEXT:    [[TMP16:%.*]] = sext i16 [[N]] to i64
328 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[N]], i8* [[TMP15]], i64 [[TMP16]], x86_amx [[T6]])
329 ; CHECK-NEXT:    [[TMP17:%.*]] = load <256 x i32>, <256 x i32>* [[TMP1]], align 1024
330 ; CHECK-NEXT:    store <256 x i32> [[TMP17]], <256 x i32>* [[PC]], align 64
331 ; CHECK-NEXT:    ret void
333   %t0 = load <256 x i32>, <256 x i32>* %pa, align 64
334   %t1 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t0)
335   %t2 = load <256 x i32>, <256 x i32>* %pb, align 64
336   %t3 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t2)
337   %t4 = load <256 x i32>, <256 x i32>* %pc, align 64
338   %t5 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t4)
339   %t6 = tail call x86_amx @llvm.x86.tdpbuud.internal(i16 %m, i16 %n, i16 %k, x86_amx %t5, x86_amx %t1, x86_amx %t3)
340   %t7 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t6)
341   store <256 x i32> %t7, <256 x i32>* %pc, align 64
342   ret void
345 define dso_local void @__tile_dpbf16ps(i16 %m, i16 %n, i16 %k, <256 x i32>* %pc, <256 x i32>* %pa, <256 x i32>* %pb) {
346 ; CHECK-LABEL: @__tile_dpbf16ps(
347 ; CHECK-NEXT:    [[TMP1:%.*]] = alloca <256 x i32>, align 64
348 ; CHECK-NEXT:    [[TMP2:%.*]] = alloca <256 x i32>, align 64
349 ; CHECK-NEXT:    [[TMP3:%.*]] = alloca <256 x i32>, align 64
350 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
351 ; CHECK-NEXT:    [[TMP5:%.*]] = udiv i16 [[K:%.*]], 4
352 ; CHECK-NEXT:    [[T0:%.*]] = load <256 x i32>, <256 x i32>* [[PA:%.*]], align 64
353 ; CHECK-NEXT:    [[TMP6:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
354 ; CHECK-NEXT:    store <256 x i32> [[T0]], <256 x i32>* [[TMP4]], align 1024
355 ; CHECK-NEXT:    [[TMP7:%.*]] = sext i16 [[K]] to i64
356 ; CHECK-NEXT:    [[TMP8:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M:%.*]], i16 [[K]], i8* [[TMP6]], i64 [[TMP7]])
357 ; CHECK-NEXT:    [[T2:%.*]] = load <256 x i32>, <256 x i32>* [[PB:%.*]], align 64
358 ; CHECK-NEXT:    [[TMP9:%.*]] = bitcast <256 x i32>* [[TMP3]] to i8*
359 ; CHECK-NEXT:    store <256 x i32> [[T2]], <256 x i32>* [[TMP3]], align 1024
360 ; CHECK-NEXT:    [[TMP10:%.*]] = sext i16 [[N:%.*]] to i64
361 ; CHECK-NEXT:    [[TMP11:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP5]], i16 [[N]], i8* [[TMP9]], i64 [[TMP10]])
362 ; CHECK-NEXT:    [[T4:%.*]] = load <256 x i32>, <256 x i32>* [[PC:%.*]], align 64
363 ; CHECK-NEXT:    [[TMP12:%.*]] = bitcast <256 x i32>* [[TMP2]] to i8*
364 ; CHECK-NEXT:    store <256 x i32> [[T4]], <256 x i32>* [[TMP2]], align 1024
365 ; CHECK-NEXT:    [[TMP13:%.*]] = sext i16 [[N]] to i64
366 ; CHECK-NEXT:    [[TMP14:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[M]], i16 [[N]], i8* [[TMP12]], i64 [[TMP13]])
367 ; CHECK-NEXT:    [[T6:%.*]] = tail call x86_amx @llvm.x86.tdpbf16ps.internal(i16 [[M]], i16 [[N]], i16 [[K]], x86_amx [[TMP14]], x86_amx [[TMP8]], x86_amx [[TMP11]])
368 ; CHECK-NEXT:    [[TMP15:%.*]] = bitcast <256 x i32>* [[TMP1]] to i8*
369 ; CHECK-NEXT:    [[TMP16:%.*]] = sext i16 [[N]] to i64
370 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[M]], i16 [[N]], i8* [[TMP15]], i64 [[TMP16]], x86_amx [[T6]])
371 ; CHECK-NEXT:    [[TMP17:%.*]] = load <256 x i32>, <256 x i32>* [[TMP1]], align 1024
372 ; CHECK-NEXT:    store <256 x i32> [[TMP17]], <256 x i32>* [[PC]], align 64
373 ; CHECK-NEXT:    ret void
375   %t0 = load <256 x i32>, <256 x i32>* %pa, align 64
376   %t1 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t0)
377   %t2 = load <256 x i32>, <256 x i32>* %pb, align 64
378   %t3 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t2)
379   %t4 = load <256 x i32>, <256 x i32>* %pc, align 64
380   %t5 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t4)
381   %t6 = tail call x86_amx @llvm.x86.tdpbf16ps.internal(i16 %m, i16 %n, i16 %k, x86_amx %t5, x86_amx %t1, x86_amx %t3)
382   %t7 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t6)
383   store <256 x i32> %t7, <256 x i32>* %pc, align 64
384   ret void
387 define dso_local void @__tile_stored(i8* %0, i64 %1, %struct.__tile_str* nocapture readonly byval(%struct.__tile_str) align 64 %2) local_unnamed_addr {
388 ; CHECK-LABEL: @__tile_stored(
389 ; CHECK-NEXT:    [[TMP4:%.*]] = alloca <256 x i32>, align 64
390 ; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR:%.*]], %struct.__tile_str* [[TMP2:%.*]], i64 0, i32 0
391 ; CHECK-NEXT:    [[TMP6:%.*]] = load i16, i16* [[TMP5]], align 64
392 ; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP2]], i64 0, i32 1
393 ; CHECK-NEXT:    [[TMP8:%.*]] = load i16, i16* [[TMP7]], align 2
394 ; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TILE_STR]], %struct.__tile_str* [[TMP2]], i64 0, i32 2
395 ; CHECK-NEXT:    [[TMP10:%.*]] = load <256 x i32>, <256 x i32>* [[TMP9]], align 64
396 ; CHECK-NEXT:    [[TMP11:%.*]] = bitcast <256 x i32>* [[TMP4]] to i8*
397 ; CHECK-NEXT:    store <256 x i32> [[TMP10]], <256 x i32>* [[TMP4]], align 1024
398 ; CHECK-NEXT:    [[TMP12:%.*]] = sext i16 [[TMP8]] to i64
399 ; CHECK-NEXT:    [[TMP13:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[TMP6]], i16 [[TMP8]], i8* [[TMP11]], i64 [[TMP12]])
400 ; CHECK-NEXT:    [[TMP14:%.*]] = shl i64 [[TMP1:%.*]], 32
401 ; CHECK-NEXT:    [[TMP15:%.*]] = ashr exact i64 [[TMP14]], 32
402 ; CHECK-NEXT:    tail call void @llvm.x86.tilestored64.internal(i16 [[TMP6]], i16 [[TMP8]], i8* [[TMP0:%.*]], i64 [[TMP15]], x86_amx [[TMP13]])
403 ; CHECK-NEXT:    ret void
405   %4 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %2, i64 0, i32 0
406   %5 = load i16, i16* %4, align 64
407   %6 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %2, i64 0, i32 1
408   %7 = load i16, i16* %6, align 2
409   %8 = getelementptr inbounds %struct.__tile_str, %struct.__tile_str* %2, i64 0, i32 2
410   %9 = load <256 x i32>, <256 x i32>* %8, align 64
411   %10 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %9)
412   %11 = shl i64 %1, 32
413   %12 = ashr exact i64 %11, 32
414   tail call void @llvm.x86.tilestored64.internal(i16 %5, i16 %7, i8* %0, i64 %12, x86_amx %10)
415   ret void
418 declare x86_amx @llvm.x86.tileloadd64.internal(i16, i16, i8*, i64)
419 declare x86_amx @llvm.x86.tdpbssd.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)
420 declare x86_amx @llvm.x86.tdpbsud.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)
421 declare x86_amx @llvm.x86.tdpbusd.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)
422 declare x86_amx @llvm.x86.tdpbuud.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)
423 declare x86_amx @llvm.x86.tdpbf16ps.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)
424 declare void @llvm.x86.tilestored64.internal(i16, i16, i8*, i64, x86_amx)
426 declare x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32>)
427 declare x86_amx @llvm.x86.cast.vector.to.tile.v225i32(<225 x i32>)
428 declare <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx)
429 declare <225 x i32> @llvm.x86.cast.tile.to.vector.v225i32(x86_amx)