/
associate-codegen.fir
122 lines (106 loc) · 5.99 KB
/
associate-codegen.fir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Test hlfir.associate/hlfir.end_associate operation code generation to FIR.
// RUN: fir-opt %s -bufferize-hlfir | FileCheck %s
func.func @associate_int() {
%c42_i32 = arith.constant 42 : i32
%0:3 = hlfir.associate %c42_i32 {uniq_name = "x"} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)
fir.call @take_i4(%0#0) : (!fir.ref<i32>) -> ()
hlfir.end_associate %0#1, %0#2 : !fir.ref<i32>, i1
return
}
// CHECK-LABEL: func.func @associate_int() {
// CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "x"}
// CHECK: %[[VAL_1:.*]] = arith.constant 42 : i32
// CHECK: fir.store %[[VAL_1]] to %[[VAL_0]] : !fir.ref<i32>
// CHECK: %[[VAL_2:.*]] = arith.constant false
// CHECK: fir.call @take_i4(%[[VAL_0]]) : (!fir.ref<i32>) -> ()
// CHECK-NOT: fir.freemem
func.func @associate_real() {
%cst = arith.constant 4.200000e-01 : f32
%0:3 = hlfir.associate %cst {uniq_name = "x"} : (f32) -> (!fir.ref<f32>, !fir.ref<f32>, i1)
fir.call @take_r4(%0#0) : (!fir.ref<f32>) -> ()
hlfir.end_associate %0#1, %0#2 : !fir.ref<f32>, i1
return
}
// CHECK-LABEL: func.func @associate_real() {
// CHECK: %[[VAL_0:.*]] = fir.alloca f32 {bindc_name = "x"}
// CHECK: %[[VAL_1:.*]] = arith.constant 4.200000e-01 : f32
// CHECK: fir.store %[[VAL_1]] to %[[VAL_0]] : !fir.ref<f32>
// CHECK: %[[VAL_2:.*]] = arith.constant false
// CHECK: fir.call @take_r4(%[[VAL_0]]) : (!fir.ref<f32>) -> ()
// CHECK-NOT: fir.freemem
func.func @associate_logical() {
%true = arith.constant true
%0 = fir.convert %true : (i1) -> !fir.logical<4>
%1:3 = hlfir.associate %0 {uniq_name = "x"} : (!fir.logical<4>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>, i1)
fir.call @take_l4(%1#0) : (!fir.ref<!fir.logical<4>>) -> ()
hlfir.end_associate %1#1, %1#2 : !fir.ref<!fir.logical<4>>, i1
return
}
// CHECK-LABEL: func.func @associate_logical() {
// CHECK: %[[VAL_0:.*]] = fir.alloca !fir.logical<4> {bindc_name = "x"}
// CHECK: %[[VAL_1:.*]] = arith.constant true
// CHECK: %[[VAL_2:.*]] = fir.convert %[[VAL_1]] : (i1) -> !fir.logical<4>
// CHECK: fir.store %[[VAL_2]] to %[[VAL_0]] : !fir.ref<!fir.logical<4>>
// CHECK: %[[VAL_3:.*]] = arith.constant false
// CHECK: fir.call @take_l4(%[[VAL_0]]) : (!fir.ref<!fir.logical<4>>) -> ()
// CHECK-NOT: fir.freemem
func.func @associate_char(%arg0: !fir.boxchar<1> ) {
%0:2 = fir.unboxchar %arg0 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
%1:2 = hlfir.declare %0#0 typeparams %0#1 {uniq_name = "x"} : (!fir.ref<!fir.char<1,?>>, index) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
%2 = arith.addi %0#1, %0#1 : index
%3 = hlfir.concat %1#0, %1#0 len %2 : (!fir.boxchar<1>, !fir.boxchar<1>, index) -> !hlfir.expr<!fir.char<1,?>>
%4:3 = hlfir.associate %3 typeparams %2 {uniq_name = "x"} : (!hlfir.expr<!fir.char<1,?>>, index) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>, i1)
fir.call @take_c(%4#0) : (!fir.boxchar<1>) -> ()
hlfir.end_associate %4#1, %4#2 : !fir.ref<!fir.char<1,?>>, i1
return
}
// CHECK-LABEL: func.func @associate_char(
// CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>) {
// CHECK: %[[VAL_1:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
// CHECK: %[[VAL_2:.*]]:2 = hlfir.declare %[[VAL_1]]#0 typeparams %[[VAL_1]]#1 {uniq_name = "x"} : (!fir.ref<!fir.char<1,?>>, index) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
// CHECK: %[[VAL_3:.*]] = arith.addi %[[VAL_1]]#1, %[[VAL_1]]#1 : index
// CHECK: %[[VAL_4:.*]] = arith.addi %[[VAL_1]]#1, %[[VAL_1]]#1 : index
// CHECK: %[[VAL_5:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_4]] : index) {bindc_name = ".chrtmp"}
// CHECK: fir.call @llvm.memmove.p0.p0.i64
// CHECK: %[[VAL_21:.*]]:2 = hlfir.declare %[[VAL_5]] typeparams %[[VAL_4]] {uniq_name = "tmp"} : (!fir.ref<!fir.char<1,?>>, index) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
// CHECK: %[[VAL_22:.*]] = arith.constant false
// CHECK: %[[VAL_23:.*]] = fir.undefined tuple<!fir.boxchar<1>, i1>
// CHECK: %[[VAL_24:.*]] = fir.insert_value %[[VAL_23]], %[[VAL_22]], [1 : index] : (tuple<!fir.boxchar<1>, i1>, i1) -> tuple<!fir.boxchar<1>, i1>
// CHECK: %[[VAL_25:.*]] = fir.insert_value %[[VAL_24]], %[[VAL_21]]#0, [0 : index] : (tuple<!fir.boxchar<1>, i1>, !fir.boxchar<1>) -> tuple<!fir.boxchar<1>, i1>
// CHECK: fir.call @take_c(%[[VAL_21]]#0) : (!fir.boxchar<1>) -> ()
// CHECK-NOT: fir.freemem
func.func @test_end_associate_box(%var: !fir.box<!fir.array<?xf64>>) {
%true = arith.constant 1 : i1
hlfir.end_associate %var, %true : !fir.box<!fir.array<?xf64>>, i1
return
}
// CHECK-LABEL: func.func @test_end_associate_box(
// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf64>>) {
// CHECK: %[[VAL_1:.*]] = arith.constant true
// CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_0]] : (!fir.box<!fir.array<?xf64>>) -> !fir.heap<!fir.array<?xf64>>
// CHECK: fir.freemem %[[VAL_2]] : !fir.heap<!fir.array<?xf64>>
func.func @test_end_associate_boxchar(%var: !fir.boxchar<2>) {
%true = arith.constant 1 : i1
hlfir.end_associate %var, %true : !fir.boxchar<2>, i1
return
}
// CHECK-LABEL: func.func @test_end_associate_boxchar(
// CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<2>) {
// CHECK: %[[VAL_1:.*]] = arith.constant true
// CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_0]] : (!fir.boxchar<2>) -> !fir.heap<!fir.char<2,?>>
// CHECK: fir.freemem %[[VAL_2]] : !fir.heap<!fir.char<2,?>>
func.func @test_end_associate_box_dynamic(%var: !fir.box<!fir.array<?xf64>>, %must_free: i1) {
hlfir.end_associate %var, %must_free : !fir.box<!fir.array<?xf64>>, i1
return
}
// CHECK-LABEL: func.func @test_end_associate_box_dynamic(
// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf64>>,
// CHECK-SAME: %[[VAL_1:.*]]: i1) {
// CHECK: fir.if %[[VAL_1]] {
// CHECK: %[[VAL_2:.*]] = fir.box_addr %[[VAL_0]] : (!fir.box<!fir.array<?xf64>>) -> !fir.heap<!fir.array<?xf64>>
// CHECK: fir.freemem %[[VAL_2]] : !fir.heap<!fir.array<?xf64>>
// CHECK: }
func.func private @take_i4(!fir.ref<i32>)
func.func private @take_r4(!fir.ref<f32>)
func.func private @take_l4(!fir.ref<!fir.logical<4>>)
func.func private @take_c(!fir.boxchar<1>)