Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / AMX / amx-combine-undef.ll
blob86874b14b3612835846b0aa4f999fea2e9e54468
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 define void @undef_2phi(ptr%buf) {
5 ; CHECK-LABEL: @undef_2phi(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[TMP0:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
8 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
9 ; CHECK:       l1:
10 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
11 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[L3:%.*]]
12 ; CHECK:       l2:
13 ; CHECK-NEXT:    [[TMP1:%.*]] = phi x86_amx [ [[TMP0]], [[ENTRY:%.*]] ], [ [[T1]], [[L1]] ]
14 ; CHECK-NEXT:    br i1 undef, label [[L3]], label [[EXIT:%.*]]
15 ; CHECK:       l3:
16 ; CHECK-NEXT:    [[TMP2:%.*]] = phi x86_amx [ [[TMP1]], [[L2]] ], [ [[T1]], [[L1]] ]
17 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr [[BUF:%.*]], i64 1024, x86_amx [[TMP2]])
18 ; CHECK-NEXT:    br label [[EXIT]]
19 ; CHECK:       exit:
20 ; CHECK-NEXT:    ret void
22 entry:
23   br i1 undef, label %l1, label %l2
25 l1:
26   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
27   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
28   br i1 undef, label %l2, label %l3
30 l2:
31   %t3 = phi <256 x i32> [ undef, %entry ], [ %t2, %l1 ]
32   br i1 undef, label %l3, label %exit
34 l3:
35   %t4 = phi <256 x i32> [ %t3, %l2], [ %t2, %l1 ]
36   %t5 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t4)
37   call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr %buf, i64 1024, x86_amx %t5)
38   br label %exit
40 exit:
41   ret void
44 define void @foo_undef(ptr%buf) {
45 ; CHECK-LABEL: @foo_undef(
46 ; CHECK-NEXT:  entry:
47 ; CHECK-NEXT:    [[TMP0:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
48 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
49 ; CHECK:       l1:
50 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
51 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[EXIT:%.*]]
52 ; CHECK:       l2:
53 ; CHECK-NEXT:    [[TMP1:%.*]] = phi x86_amx [ [[TMP0]], [[ENTRY:%.*]] ], [ [[T1]], [[L1]] ]
54 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr [[BUF:%.*]], i64 1024, x86_amx [[TMP1]])
55 ; CHECK-NEXT:    br label [[EXIT]]
56 ; CHECK:       exit:
57 ; CHECK-NEXT:    ret void
59 entry:
60   br i1 undef, label %l1, label %l2
62 l1:
63   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
64   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
65   br i1 undef, label %l2, label %exit
67 l2:
68   %t3 = phi <256 x i32> [ undef, %entry ], [ %t2, %l1 ]
69   %t4 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t3)
70   call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr %buf, i64 1024, x86_amx %t4)
71   br label %exit
73 exit:
74   ret void
77 define void @foo_zero(ptr%buf) {
78 ; CHECK-LABEL: @foo_zero(
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    [[TMP0:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
81 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
82 ; CHECK:       l1:
83 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
84 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[EXIT:%.*]]
85 ; CHECK:       l2:
86 ; CHECK-NEXT:    [[TMP1:%.*]] = phi x86_amx [ [[TMP0]], [[ENTRY:%.*]] ], [ [[T1]], [[L1]] ]
87 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr [[BUF:%.*]], i64 1024, x86_amx [[TMP1]])
88 ; CHECK-NEXT:    br label [[EXIT]]
89 ; CHECK:       exit:
90 ; CHECK-NEXT:    ret void
92 entry:
93   br i1 undef, label %l1, label %l2
95 l1:
96   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
97   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
98   br i1 undef, label %l2, label %exit
101   %t3 = phi <256 x i32> [ zeroinitializer, %entry ], [ %t2, %l1 ]
102   %t4 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t3)
103   call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr %buf, i64 1024, x86_amx %t4)
104   br label %exit
106 exit:
107   ret void
110 define void @foo_vrow(ptr%buf, i16 %row) {
111 ; CHECK-LABEL: @foo_vrow(
112 ; CHECK-NEXT:  entry:
113 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
114 ; CHECK-NEXT:    [[TMP1:%.*]] = alloca <256 x i32>, align 64
115 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
116 ; CHECK:       l1:
117 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 [[ROW:%.*]], i16 32)
118 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[ROW]], i16 32, ptr [[TMP1]], i64 32, x86_amx [[T1]])
119 ; CHECK-NEXT:    [[TMP3:%.*]] = load <256 x i32>, ptr [[TMP1]], align 1024
120 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[EXIT:%.*]]
121 ; CHECK:       l2:
122 ; CHECK-NEXT:    [[T3:%.*]] = phi <256 x i32> [ undef, [[ENTRY:%.*]] ], [ [[TMP3]], [[L1]] ]
123 ; CHECK-NEXT:    store <256 x i32> [[T3]], ptr [[TMP0]], align 1024
124 ; CHECK-NEXT:    [[TMP5:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 [[ROW]], i16 32, ptr [[TMP0]], i64 32)
125 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 [[ROW]], i16 32, ptr [[BUF:%.*]], i64 1024, x86_amx [[TMP5]])
126 ; CHECK-NEXT:    br label [[EXIT]]
127 ; CHECK:       exit:
128 ; CHECK-NEXT:    ret void
130 entry:
131   br i1 undef, label %l1, label %l2
134   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 %row, i16 32)
135   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
136   br i1 undef, label %l2, label %exit
139   %t3 = phi <256 x i32> [ undef, %entry ], [ %t2, %l1 ]
140   %t4 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t3)
141   call void @llvm.x86.tilestored64.internal(i16 %row, i16 32, ptr %buf, i64 1024, x86_amx %t4)
142   br label %exit
144 exit:
145   ret void
148 define void @foo_vcol(ptr%buf, i16 %col) {
149 ; CHECK-LABEL: @foo_vcol(
150 ; CHECK-NEXT:  entry:
151 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
152 ; CHECK-NEXT:    [[TMP1:%.*]] = alloca <256 x i32>, align 64
153 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
154 ; CHECK:       l1:
155 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 [[COL:%.*]])
156 ; CHECK-NEXT:    [[TMP3:%.*]] = sext i16 [[COL]] to i64
157 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 [[COL]], ptr [[TMP1]], i64 [[TMP3]], x86_amx [[T1]])
158 ; CHECK-NEXT:    [[TMP4:%.*]] = load <256 x i32>, ptr [[TMP1]], align 1024
159 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[EXIT:%.*]]
160 ; CHECK:       l2:
161 ; CHECK-NEXT:    [[T3:%.*]] = phi <256 x i32> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[TMP4]], [[L1]] ]
162 ; CHECK-NEXT:    store <256 x i32> [[T3]], ptr [[TMP0]], align 1024
163 ; CHECK-NEXT:    [[TMP6:%.*]] = sext i16 [[COL]] to i64
164 ; CHECK-NEXT:    [[TMP7:%.*]] = call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 [[COL]], ptr [[TMP0]], i64 [[TMP6]])
165 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 [[COL]], ptr [[BUF:%.*]], i64 1024, x86_amx [[TMP7]])
166 ; CHECK-NEXT:    br label [[EXIT]]
167 ; CHECK:       exit:
168 ; CHECK-NEXT:    ret void
170 entry:
171   br i1 undef, label %l1, label %l2
174   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 %col)
175   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
176   br i1 undef, label %l2, label %exit
179   %t3 = phi <256 x i32> [ zeroinitializer, %entry ], [ %t2, %l1 ]
180   %t4 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t3)
181   call void @llvm.x86.tilestored64.internal(i16 8, i16 %col, ptr %buf, i64 1024, x86_amx %t4)
182   br label %exit
184 exit:
185   ret void
188 define void @noshape(ptr%buf) {
189 ; CHECK-LABEL: @noshape(
190 ; CHECK-NEXT:  entry:
191 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
192 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
193 ; CHECK:       l1:
194 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
195 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr [[TMP0]], i64 32, x86_amx [[T1]])
196 ; CHECK-NEXT:    [[TMP2:%.*]] = load <256 x i32>, ptr [[TMP0]], align 1024
197 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[EXIT:%.*]]
198 ; CHECK:       l2:
199 ; CHECK-NEXT:    [[T3:%.*]] = phi <256 x i32> [ undef, [[ENTRY:%.*]] ], [ [[TMP2]], [[L1]] ]
200 ; CHECK-NEXT:    store <256 x i32> [[T3]], ptr [[BUF:%.*]], align 1024
201 ; CHECK-NEXT:    br label [[EXIT]]
202 ; CHECK:       exit:
203 ; CHECK-NEXT:    ret void
205 entry:
206   br i1 undef, label %l1, label %l2
209   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
210   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
211   br i1 undef, label %l2, label %exit
214   %t3 = phi <256 x i32> [ undef, %entry ], [ %t2, %l1 ]
215   %t4 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t3)
216   %t5 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t4)
217   store <256 x i32> %t5, ptr %buf
218   br label %exit
220 exit:
221   ret void
224 define void @noshape2(ptr%buf) {
225 ; CHECK-LABEL: @noshape2(
226 ; CHECK-NEXT:  entry:
227 ; CHECK-NEXT:    [[TMP0:%.*]] = alloca <256 x i32>, align 64
228 ; CHECK-NEXT:    br i1 undef, label [[L1:%.*]], label [[L2:%.*]]
229 ; CHECK:       l1:
230 ; CHECK-NEXT:    [[T1:%.*]] = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
231 ; CHECK-NEXT:    call void @llvm.x86.tilestored64.internal(i16 8, i16 32, ptr [[TMP0]], i64 32, x86_amx [[T1]])
232 ; CHECK-NEXT:    [[TMP2:%.*]] = load <256 x i32>, ptr [[TMP0]], align 1024
233 ; CHECK-NEXT:    br i1 undef, label [[L2]], label [[EXIT:%.*]]
234 ; CHECK:       l2:
235 ; CHECK-NEXT:    [[T3:%.*]] = phi <256 x i32> [ undef, [[ENTRY:%.*]] ], [ [[TMP2]], [[L1]] ]
236 ; CHECK-NEXT:    [[T6:%.*]] = call <256 x i32> @llvm.abs.v256i32(<256 x i32> [[T3]], i1 true)
237 ; CHECK-NEXT:    store <256 x i32> [[T6]], ptr [[BUF:%.*]], align 1024
238 ; CHECK-NEXT:    br label [[EXIT]]
239 ; CHECK:       exit:
240 ; CHECK-NEXT:    ret void
242 entry:
243   br i1 undef, label %l1, label %l2
246   %t1 = call x86_amx @llvm.x86.tilezero.internal(i16 8, i16 32)
247   %t2 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t1)
248   br i1 undef, label %l2, label %exit
251   %t3 = phi <256 x i32> [ undef, %entry ], [ %t2, %l1 ]
252   %t4 = call x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32> %t3)
253   %t5 = call <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx %t4)
254   %t6 = call <256 x i32> @llvm.abs.v256i32(<256 x i32> %t5, i1 1)
255   store <256 x i32> %t6, ptr %buf
256   br label %exit
258 exit:
259   ret void
262 declare <256 x i32> @llvm.abs.v256i32(<256 x i32>, i1)
263 declare x86_amx @llvm.x86.tilezero.internal(i16, i16)
264 declare x86_amx @llvm.x86.tileloadd64.internal(i16, i16, ptr, i64)
265 declare <256 x i32> @llvm.x86.cast.tile.to.vector.v256i32(x86_amx)
266 declare x86_amx @llvm.x86.cast.vector.to.tile.v256i32(<256 x i32>)
267 declare void @llvm.x86.tilestored64.internal(i16, i16, ptr, i64, x86_amx)
268 declare x86_amx @llvm.x86.tdpbssd.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)