@@ -395,12 +395,34 @@ subroutine pointer()
395
395
! CHECK: %[[VAL_4:.*]] = omp.threadprivate %[[VAL_1]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
396
396
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFallocatableEp"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
397
397
! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
398
- ! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_5]]#0 realloc : !fir.box<!fir.heap<!fir.array<?xi32>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
398
+ ! CHECK: %[[VAL_7:.*]] = fir.box_addr %[[VAL_6]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
399
+ ! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (!fir.heap<!fir.array<?xi32>>) -> i64
400
+ ! CHECK: %[[C0_I64:.*]] = arith.constant 0 : i64
401
+ ! CHECK: %[[VAL_9:.*]] = arith.cmpi ne, %[[VAL_8]], %[[C0_I64]] : i64
402
+ ! CHECK: fir.if %[[VAL_9]] {
403
+ ! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
404
+ ! CHECK: hlfir.assign %[[VAL_10]] to %[[VAL_5]]#0 realloc : !fir.box<!fir.heap<!fir.array<?xi32>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
405
+ ! CHECK: } else {
406
+ ! CHECK: %[[VAL_10:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
407
+ ! CHECK: %[[VAL_11:.*]] = fir.box_addr %[[VAL_10]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
408
+ ! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (!fir.heap<!fir.array<?xi32>>) -> i64
409
+ ! CHECK: %[[C0_I64_0:.*]] = arith.constant 0 : i64
410
+ ! CHECK: %[[VAL_13:.*]] = arith.cmpi ne, %[[VAL_12]], %[[C0_I64_0]] : i64
411
+ ! CHECK: fir.if %[[VAL_13]] {
412
+ ! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
413
+ ! CHECK: %[[VAL_15:.*]] = fir.box_addr %[[VAL_14]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
414
+ ! CHECK: fir.freemem %[[VAL_15]] : !fir.heap<!fir.array<?xi32>>
415
+ ! CHECK: %[[VAL_16:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
416
+ ! CHECK: %[[C0:.*]] = arith.constant 0 : index
417
+ ! CHECK: %[[VAL_17:.*]] = fir.shape %[[C0]] : (index) -> !fir.shape<1>
418
+ ! CHECK: %[[VAL_18:.*]] = fir.embox %[[VAL_16]](%[[VAL_17]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xi32>>>
419
+ ! CHECK: fir.store %[[VAL_18]] to %[[VAL_5]]#1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
420
+ ! CHECK: }
399
421
! CHECK: omp.barrier
400
- ! CHECK: %[[VAL_7 :.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
401
- ! CHECK: %[[VAL_8 :.*]] = fir.box_addr %[[VAL_7 ]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
402
- ! CHECK: %[[VAL_9 :.*]] = fir.convert %[[VAL_8 ]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>
403
- ! CHECK: fir.call @_QPsub8(%[[VAL_9 ]]) fastmath<contract> : (!fir.ref<!fir.array<?xi32>>) -> ()
422
+ ! CHECK: %[[VAL_19 :.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
423
+ ! CHECK: %[[VAL_20 :.*]] = fir.box_addr %[[VAL_19 ]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
424
+ ! CHECK: %[[VAL_21 :.*]] = fir.convert %[[VAL_20 ]] : (!fir.heap<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>
425
+ ! CHECK: fir.call @_QPsub8(%[[VAL_21 ]]) fastmath<contract> : (!fir.ref<!fir.array<?xi32>>) -> ()
404
426
! CHECK: omp.terminator
405
427
! CHECK: }
406
428
! CHECK: return
@@ -422,7 +444,7 @@ subroutine allocatable()
422
444
! CHECK: omp.parallel {
423
445
! CHECK: %[[VAL_4:.*]] = omp.threadprivate %[[VAL_1]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>> -> !fir.ref<!fir.box<!fir.heap<i32>>>
424
446
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFallocatable2Ea"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
425
- ! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_5 ]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
447
+ ! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_3 ]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
426
448
! CHECK: %[[VAL_7:.*]] = fir.box_addr %[[VAL_6]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
427
449
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (!fir.heap<i32>) -> i64
428
450
! CHECK: %[[VAL_9:.*]] = arith.constant 0 : i64
@@ -432,10 +454,23 @@ subroutine allocatable()
432
454
! CHECK: %[[VAL_12:.*]] = fir.box_addr %[[VAL_11]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
433
455
! CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]] : !fir.heap<i32>
434
456
! CHECK: hlfir.assign %[[VAL_13]] to %[[VAL_5]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
435
- ! CHECK: }
457
+ ! CHECK: } else {
458
+ ! CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
459
+ ! CHECK: %[[VAL_15:.*]] = fir.box_addr %[[VAL_11]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
460
+ ! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (!fir.heap<i32>) -> i64
461
+ ! CHECK: %[[C0_I64_0:.*]] = arith.constant 0 : i64
462
+ ! CHECK: %[[VAL_17:.*]] = arith.cmpi ne, %[[VAL_16]], %[[C0_I64_0]] : i64
463
+ ! CHECK: fir.if %[[VAL_17]] {
464
+ ! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_5]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
465
+ ! CHECK: %[[VAL_19:.*]] = fir.box_addr %[[VAL_18]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
466
+ ! CHECK: fir.freemem %[[VAL_19]] : !fir.heap<i32>
467
+ ! CHECK: %[[VAL_20:.*]] = fir.zero_bits !fir.heap<i32>
468
+ ! CHECK: %[[VAL_21:.*]] = fir.embox %[[VAL_20]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
469
+ ! CHECK: fir.store %[[VAL_21]] to %[[VAL_5]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
470
+ ! CHECK: }
436
471
! CHECK: omp.barrier
437
- ! CHECK: %[[VAL_14 :.*]] = arith.constant 1 : i32
438
- ! CHECK: hlfir.assign %[[VAL_14 ]] to %[[VAL_5]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
472
+ ! CHECK: %[[VAL_22 :.*]] = arith.constant 1 : i32
473
+ ! CHECK: hlfir.assign %[[VAL_22 ]] to %[[VAL_5]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
439
474
! CHECK: omp.terminator
440
475
! CHECK: }
441
476
! CHECK: return
@@ -448,3 +483,62 @@ subroutine allocatable2()
448
483
a = 1
449
484
! $omp end parallel
450
485
end subroutine
486
+
487
+ ! CHECK: func.func @_QPallocatable3() {
488
+ ! CHECK: %[[VAL_0:.*]] = fir.address_of(@_QFallocatable3Ea) : !fir.ref<!fir.box<!fir.heap<i32>>>
489
+ ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFallocatable3Ea"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
490
+ ! CHECK: %[[VAL_2:.*]] = omp.threadprivate %[[VAL_1]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>> -> !fir.ref<!fir.box<!fir.heap<i32>>>
491
+ ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFallocatable3Ea"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
492
+ ! CHECK: %[[VAL_4:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFallocatable3Ea.alloc"}
493
+ ! CHECK: %[[VAL_5:.*]] = fir.embox %[[VAL_4]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
494
+ ! CHECK: fir.store %[[VAL_5]] to %[[VAL_3]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
495
+ ! CHECK: %[[C10_I32:.*]] = arith.constant 10 : i32
496
+ ! CHECK: hlfir.assign %[[C10_I32]] to %[[VAL_3]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
497
+ ! CHECK: omp.parallel {
498
+ ! CHECK: %[[VAL_6:.*]] = omp.threadprivate %[[VAL_1]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>> -> !fir.ref<!fir.box<!fir.heap<i32>>>
499
+ ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFallocatable3Ea"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>)
500
+ ! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
501
+ ! CHECK: %[[VAL_9:.*]] = fir.box_addr %[[VAL_8]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
502
+ ! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (!fir.heap<i32>) -> i64
503
+ ! CHECK: %[[C10_I64:.*]] = arith.constant 0 : i64
504
+ ! CHECK: %[[VAL_11:.*]] = arith.cmpi ne, %[[VAL_10]], %[[C10_I64]] : i64
505
+ ! CHECK: fir.if %[[VAL_11]] {
506
+ ! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
507
+ ! CHECK: %[[VAL_13:.*]] = fir.box_addr %[[VAL_12]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
508
+ ! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.heap<i32>
509
+ ! CHECK: hlfir.assign %[[VAL_14]] to %[[VAL_7]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
510
+ ! CHECK: } else {
511
+ ! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
512
+ ! CHECK: %[[VAL_15:.*]] = fir.box_addr %[[VAL_12]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
513
+ ! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (!fir.heap<i32>) -> i64
514
+ ! CHECK: %[[C0_I64_0:.*]] = arith.constant 0 : i64
515
+ ! CHECK: %[[VAL_17:.*]] = arith.cmpi ne, %[[VAL_16]], %[[C0_I64_0]] : i64
516
+ ! CHECK: fir.if %[[VAL_17]] {
517
+ ! CHECK: %[[VAL_18:.*]] = fir.load %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
518
+ ! CHECK: %[[VAL_19:.*]] = fir.box_addr %[[VAL_18]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
519
+ ! CHECK: fir.freemem %[[VAL_19]] : !fir.heap<i32>
520
+ ! CHECK: %[[VAL_20:.*]] = fir.zero_bits !fir.heap<i32>
521
+ ! CHECK: %[[VAL_21:.*]] = fir.embox %[[VAL_20]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
522
+ ! CHECK: fir.store %[[VAL_21]] to %[[VAL_7]]#1 : !fir.ref<!fir.box<!fir.heap<i32>>>
523
+ ! CHECK: }
524
+ ! CHECK: }
525
+ ! CHECK: omp.barrier
526
+ ! CHECK: %[[VAL_22:.*]] = fir.load %7#0 : !fir.ref<!fir.box<!fir.heap<i32>>>
527
+ ! CHECK: %[[VAL_23:.*]] = fir.box_addr %[[VAL_22]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
528
+ ! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_23]] : !fir.heap<i32>
529
+ ! CHECK: %[[C1_I32:.*]] = arith.constant 1 : i32
530
+ ! CHECK: %[[VAL_25:.*]]= arith.addi %[[VAL_24]], %[[C1_I32]] : i32
531
+ ! CHECK: hlfir.assign %[[VAL_25]]to %[[VAL_7]]#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>>
532
+ ! CHECK: omp.terminator
533
+ ! CHECK: }
534
+ ! CHECK: return
535
+ ! CHECK: }
536
+ subroutine allocatable3 ()
537
+ integer , allocatable , save :: a
538
+ ! $omp threadprivate(a)
539
+ allocate (a)
540
+ a = 10
541
+ ! $omp parallel copyin(a)
542
+ a = a + 1
543
+ ! $omp end parallel
544
+ end subroutine
0 commit comments