@@ -256,6 +256,22 @@ define i32 @test_bitcast_update_dpp_f32_to_i32(float %val0, float %val1) {
256
256
ret i32 %dpp
257
257
}
258
258
259
+ define i32 @test_bitcast_update_dpp_f32_to_i32_convergencetoken (float %val0 , float %val1 ) convergent {
260
+ ; CHECK-LABEL: define i32 @test_bitcast_update_dpp_f32_to_i32_convergencetoken(
261
+ ; CHECK-SAME: float [[VAL0:%.*]], float [[VAL1:%.*]]) #[[ATTR1:[0-9]+]] {
262
+ ; CHECK-NEXT: [[T:%.*]] = call token @llvm.experimental.convergence.entry()
263
+ ; CHECK-NEXT: [[BITCAST0:%.*]] = bitcast float [[VAL0]] to i32
264
+ ; CHECK-NEXT: [[BITCAST1:%.*]] = bitcast float [[VAL1]] to i32
265
+ ; CHECK-NEXT: [[DPP:%.*]] = call i32 @llvm.amdgcn.update.dpp.i32(i32 [[BITCAST0]], i32 [[BITCAST1]], i32 1, i32 1, i32 1, i1 false) [ "convergencectrl"(token [[T]]) ]
266
+ ; CHECK-NEXT: ret i32 [[DPP]]
267
+ ;
268
+ %t = call token @llvm.experimental.convergence.entry ()
269
+ %bitcast0 = bitcast float %val0 to i32
270
+ %bitcast1 = bitcast float %val1 to i32
271
+ %dpp = call i32 @llvm.amdgcn.update.dpp.i32 (i32 %bitcast0 , i32 %bitcast1 , i32 1 , i32 1 , i32 1 , i1 false ) [ "convergencectrl" (token %t ) ]
272
+ ret i32 %dpp
273
+ }
274
+
259
275
define i32 @test_bitcast_update_dpp_sources_different_type (float %val0 , <2 x half > %val1 ) {
260
276
; CHECK-LABEL: define i32 @test_bitcast_update_dpp_sources_different_type(
261
277
; CHECK-SAME: float [[VAL0:%.*]], <2 x half> [[VAL1:%.*]]) #[[ATTR0]] {
@@ -269,3 +285,31 @@ define i32 @test_bitcast_update_dpp_sources_different_type(float %val0, <2 x hal
269
285
%dpp = call i32 @llvm.amdgcn.update.dpp.i32 (i32 %bitcast0 , i32 %bitcast1 , i32 1 , i32 1 , i32 1 , i1 false )
270
286
ret i32 %dpp
271
287
}
288
+
289
+ define i32 @test_bitcast_f32_to_i32_readfirstlane_convergencetoken (float %val ) convergent {
290
+ ; CHECK-LABEL: define i32 @test_bitcast_f32_to_i32_readfirstlane_convergencetoken(
291
+ ; CHECK-SAME: float [[VAL:%.*]]) #[[ATTR1]] {
292
+ ; CHECK-NEXT: [[T:%.*]] = call token @llvm.experimental.convergence.entry()
293
+ ; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
294
+ ; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.amdgcn.readfirstlane.i32(i32 [[BITCAST]]) [ "convergencectrl"(token [[T]]) ]
295
+ ; CHECK-NEXT: ret i32 [[RESULT]]
296
+ ;
297
+ %t = call token @llvm.experimental.convergence.entry ()
298
+ %bitcast = bitcast float %val to i32
299
+ %result = call i32 @llvm.amdgcn.readfirstlane.i32 (i32 %bitcast ) [ "convergencectrl" (token %t ) ]
300
+ ret i32 %result
301
+ }
302
+
303
+ define i32 @test_bitcast_f32_to_i32_readlane_convergencetoken (float %val , i32 inreg %lane.index ) convergent {
304
+ ; CHECK-LABEL: define i32 @test_bitcast_f32_to_i32_readlane_convergencetoken(
305
+ ; CHECK-SAME: float [[VAL:%.*]], i32 inreg [[LANE_INDEX:%.*]]) #[[ATTR1]] {
306
+ ; CHECK-NEXT: [[T:%.*]] = call token @llvm.experimental.convergence.entry()
307
+ ; CHECK-NEXT: [[BITCAST:%.*]] = bitcast float [[VAL]] to i32
308
+ ; CHECK-NEXT: [[RESULT:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[BITCAST]], i32 [[LANE_INDEX]]) [ "convergencectrl"(token [[T]]) ]
309
+ ; CHECK-NEXT: ret i32 [[RESULT]]
310
+ ;
311
+ %t = call token @llvm.experimental.convergence.entry ()
312
+ %bitcast = bitcast float %val to i32
313
+ %result = call i32 @llvm.amdgcn.readlane.i32 (i32 %bitcast , i32 %lane.index ) [ "convergencectrl" (token %t ) ]
314
+ ret i32 %result
315
+ }
0 commit comments