@@ -256,6 +256,22 @@ define i32 @test_bitcast_update_dpp_f32_to_i32(float %val0, float %val1) {
256256 ret i32 %dpp
257257}
258258
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+
259275define i32 @test_bitcast_update_dpp_sources_different_type (float %val0 , <2 x half > %val1 ) {
260276; CHECK-LABEL: define i32 @test_bitcast_update_dpp_sources_different_type(
261277; 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
269285 %dpp = call i32 @llvm.amdgcn.update.dpp.i32 (i32 %bitcast0 , i32 %bitcast1 , i32 1 , i32 1 , i32 1 , i1 false )
270286 ret i32 %dpp
271287}
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