@@ -223,4 +223,75 @@ subroutine test_merge_intrinsic2(a, b, i)
223223! CHECK: %[[A_REBOX:.*]] = fir.rebox %[[LOAD_A]] : (!fir.class<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>) -> !fir.box<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>
224224! CHECK: %{{.*}} = arith.select %[[CMPI]], %[[A_REBOX]], %[[LOAD_B]] : !fir.box<!fir.heap<!fir.type<_QMpoly_tmpTp1{a:i32}>>>
225225
226+ subroutine check_unlimited_poly (a )
227+ class(* ), intent (in ) :: a
228+ end subroutine
229+
230+ subroutine test_merge_intrinsic3 (a , b , i )
231+ class(* ), intent (in ) :: a, b
232+ integer , intent (in ) :: i
233+
234+ call check_unlimited_poly(merge (a, b, i== 1 ))
235+ end subroutine
236+
237+ ! CHECK-LABEL: func.func @_QMpoly_tmpPtest_merge_intrinsic3(
238+ ! CHECK-SAME: %[[A:.*]]: !fir.class<none> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.class<none> {fir.bindc_name = "b"}, %[[I:.*]]: !fir.ref<i32> {fir.bindc_name = "i"}) {
239+ ! CHECK: %[[V_0:[0-9]+]] = fir.load %[[I]] : !fir.ref<i32>
240+ ! CHECK: %[[C1:.*]] = arith.constant 1 : i32
241+ ! CHECK: %[[V_1:[0-9]+]] = arith.cmpi eq, %[[V_0]], %[[C1]] : i32
242+ ! CHECK: %[[V_2:[0-9]+]] = arith.select %[[V_1]], %[[A]], %[[B]] : !fir.class<none>
243+ ! CHECK: fir.call @_QMpoly_tmpPcheck_unlimited_poly(%[[V_2]]) fastmath<contract> : (!fir.class<none>) -> ()
244+
245+ subroutine test_merge_intrinsic4 (i )
246+ integer , intent (in ) :: i
247+ class(* ), allocatable :: a, b
248+
249+ call check_unlimited_poly(merge (a, b, i== 1 ))
250+ end subroutine
251+
252+ ! CHECK-LABEL: func.func @_QMpoly_tmpPtest_merge_intrinsic4(
253+ ! CHECK-SAME: %[[I:.*]]: !fir.ref<i32> {fir.bindc_name = "i"}) {
254+ ! CHECK: %[[V_0:[0-9]+]] = fir.alloca !fir.class<!fir.heap<none>> {bindc_name = "a", uniq_name = "_QMpoly_tmpFtest_merge_intrinsic4Ea"}
255+ ! CHECK: %[[V_1:[0-9]+]] = fir.zero_bits !fir.heap<none>
256+ ! CHECK: %[[V_2:[0-9]+]] = fir.embox %[[V_1]] : (!fir.heap<none>) -> !fir.class<!fir.heap<none>>
257+ ! CHECK: fir.store %[[V_2]] to %[[V_0]] : !fir.ref<!fir.class<!fir.heap<none>>>
258+ ! CHECK: %[[V_3:[0-9]+]] = fir.alloca !fir.class<!fir.heap<none>> {bindc_name = "b", uniq_name = "_QMpoly_tmpFtest_merge_intrinsic4Eb"}
259+ ! CHECK: %[[V_4:[0-9]+]] = fir.zero_bits !fir.heap<none>
260+ ! CHECK: %[[V_5:[0-9]+]] = fir.embox %[[V_4]] : (!fir.heap<none>) -> !fir.class<!fir.heap<none>>
261+ ! CHECK: fir.store %[[V_5]] to %[[V_3]] : !fir.ref<!fir.class<!fir.heap<none>>>
262+ ! CHECK: %[[V_6:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<!fir.class<!fir.heap<none>>>
263+ ! CHECK: %[[V_7:[0-9]+]] = fir.load %[[V_3]] : !fir.ref<!fir.class<!fir.heap<none>>>
264+ ! CHECK: %[[V_8:[0-9]+]] = fir.load %[[I]] : !fir.ref<i32>
265+ ! CHECK: %[[C1:.*]] = arith.constant 1 : i32
266+ ! CHECK: %[[V_9:[0-9]+]] = arith.cmpi eq, %[[V_8]], %[[C1]] : i32
267+ ! CHECK: %[[V_10:[0-9]+]] = arith.select %[[V_9]], %[[V_6]], %[[V_7]] : !fir.class<!fir.heap<none>>
268+ ! CHECK: %[[V_11:[0-9]+]] = fir.rebox %[[V_10]] : (!fir.class<!fir.heap<none>>) -> !fir.class<none>
269+ ! CHECK: fir.call @_QMpoly_tmpPcheck_unlimited_poly(%[[V_11]]) fastmath<contract> : (!fir.class<none>) -> ()
270+
271+ subroutine test_merge_intrinsic5 (i )
272+ integer , intent (in ) :: i
273+ class(* ), pointer :: a, b
274+
275+ call check_unlimited_poly(merge (a, b, i== 1 ))
276+ end subroutine
277+
278+ ! CHECK-LABEL: func.func @_QMpoly_tmpPtest_merge_intrinsic5(
279+ ! CHECK-SAME: %[[I:.*]]: !fir.ref<i32> {fir.bindc_name = "i"}) {
280+ ! CHECK: %[[V_0:[0-9]+]] = fir.alloca !fir.class<!fir.ptr<none>> {bindc_name = "a", uniq_name = "_QMpoly_tmpFtest_merge_intrinsic5Ea"}
281+ ! CHECK: %[[V_1:[0-9]+]] = fir.zero_bits !fir.ptr<none>
282+ ! CHECK: %[[V_2:[0-9]+]] = fir.embox %[[V_1]] : (!fir.ptr<none>) -> !fir.class<!fir.ptr<none>>
283+ ! CHECK: fir.store %[[V_2]] to %[[V_0]] : !fir.ref<!fir.class<!fir.ptr<none>>>
284+ ! CHECK: %[[V_3:[0-9]+]] = fir.alloca !fir.class<!fir.ptr<none>> {bindc_name = "b", uniq_name = "_QMpoly_tmpFtest_merge_intrinsic5Eb"}
285+ ! CHECK: %[[V_4:[0-9]+]] = fir.zero_bits !fir.ptr<none>
286+ ! CHECK: %[[V_5:[0-9]+]] = fir.embox %[[V_4]] : (!fir.ptr<none>) -> !fir.class<!fir.ptr<none>>
287+ ! CHECK: fir.store %[[V_5]] to %[[V_3]] : !fir.ref<!fir.class<!fir.ptr<none>>>
288+ ! CHECK: %[[V_6:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<!fir.class<!fir.ptr<none>>>
289+ ! CHECK: %[[V_7:[0-9]+]] = fir.load %[[V_3]] : !fir.ref<!fir.class<!fir.ptr<none>>>
290+ ! CHECK: %[[V_8:[0-9]+]] = fir.load %[[I]] : !fir.ref<i32>
291+ ! CHECK: %[[C1:.*]] = arith.constant 1 : i32
292+ ! CHECK: %[[V_9:[0-9]+]] = arith.cmpi eq, %[[V_8]], %[[C1]] : i32
293+ ! CHECK: %[[V_10:[0-9]+]] = arith.select %[[V_9]], %[[V_6]], %[[V_7]] : !fir.class<!fir.ptr<none>>
294+ ! CHECK: %[[V_11:[0-9]+]] = fir.rebox %[[V_10]] : (!fir.class<!fir.ptr<none>>) -> !fir.class<none>
295+ ! CHECK: fir.call @_QMpoly_tmpPcheck_unlimited_poly(%[[V_11]]) fastmath<contract> : (!fir.class<none>) -> ()
296+
226297end module
0 commit comments