22
33module attributes {dlti.dl_spec = #dlti.dl_spec <!llvm.ptr <270 > = dense <32 > : vector <4 xi64 >, !llvm.ptr <271 > = dense <32 > : vector <4 xi64 >, !llvm.ptr <272 > = dense <64 > : vector <4 xi64 >, i64 = dense <64 > : vector <2 xi64 >, i128 = dense <128 > : vector <2 xi64 >, f80 = dense <128 > : vector <2 xi64 >, !llvm.ptr = dense <64 > : vector <4 xi64 >, i1 = dense <8 > : vector <2 xi64 >, i8 = dense <8 > : vector <2 xi64 >, i16 = dense <16 > : vector <2 xi64 >, i32 = dense <32 > : vector <2 xi64 >, f16 = dense <16 > : vector <2 xi64 >, f64 = dense <64 > : vector <2 xi64 >, f128 = dense <128 > : vector <2 xi64 >, " dlti.endianness" = " little" , " dlti.mangling_mode" = " e" , " dlti.legal_int_widths" = array <i32 : 8 , 16 , 32 , 64 >, " dlti.stack_alignment" = 128 : i64 >} {
44 llvm.func @free (!llvm.ptr )
5- omp.private {type = private } @privatizer : !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> init {
5+ llvm.func @malloc (i64 ) -> !llvm.ptr
6+
7+ omp.private {type = firstprivate } @firstprivatizer : !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> init {
68 ^bb0 (%arg0: !llvm.ptr , %arg1: !llvm.ptr ):
7- %0 = llvm.mlir.constant (48 : i32 ) : i32
8- " llvm.intr.memcpy" (%arg1 , %arg0 , %0 ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
9+ %0 = llvm.mlir.constant (48 : i64 ) : i64
10+ %1 = llvm.call @malloc (%0 ) : (i64 ) -> !llvm.ptr
11+ %2 = llvm.getelementptr %arg1 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
12+ llvm.store %1 , %2 : !llvm.ptr , !llvm.ptr
913 omp.yield (%arg1 : !llvm.ptr )
10- }
11-
12- omp.private {type = firstprivate } @firstprivatizer : !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> copy {
14+ } copy {
1315 ^bb0 (%arg0: !llvm.ptr , %arg1: !llvm.ptr ):
1416 %0 = llvm.mlir.constant (48 : i32 ) : i32
1517 " llvm.intr.memcpy" (%arg1 , %arg0 , %0 ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
1618 omp.yield (%arg1 : !llvm.ptr )
1719 }
18-
19- llvm.func internal @private_test (%arg0: !llvm.ptr {fir.bindc_name = " ptr0" }, %arg1: !llvm.ptr {fir.bindc_name = " ptr1" }) {
20- %0 = llvm.mlir.constant (1 : i32 ) : i32
21- %1 = llvm.mlir.constant (0 : index ) : i64
22- %5 = llvm.alloca %0 x !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> {alignment = 8 : i64 } : (i32 ) -> !llvm.ptr
23- %19 = llvm.alloca %0 x !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> {bindc_name = " local" } : (i32 ) -> !llvm.ptr
24- %21 = llvm.alloca %0 x i32 {bindc_name = " i" } : (i32 ) -> !llvm.ptr
25- %33 = llvm.mlir.undef : !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
26- llvm.store %33 , %19 : !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>, !llvm.ptr
27- llvm.store %0 , %21 : i32 , !llvm.ptr
28- %124 = omp.map.info var_ptr (%21 : !llvm.ptr , i32 ) map_clauses (implicit , exit_release_or_enter_alloc ) capture (ByCopy ) -> !llvm.ptr {name = " i" }
29- %150 = llvm.getelementptr %19 [0 , 7 , %1 , 0 ] : (!llvm.ptr , i64 ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
30- %151 = llvm.load %150 : !llvm.ptr -> i64
31- %152 = llvm.getelementptr %19 [0 , 7 , %1 , 1 ] : (!llvm.ptr , i64 ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
32- %153 = llvm.load %152 : !llvm.ptr -> i64
33- %154 = llvm.getelementptr %19 [0 , 7 , %1 , 2 ] : (!llvm.ptr , i64 ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
34- %155 = llvm.load %154 : !llvm.ptr -> i64
35- %156 = llvm.sub %153 , %1 : i64
36- %157 = omp.map.bounds lower_bound (%1 : i64 ) upper_bound (%156 : i64 ) extent (%153 : i64 ) stride (%155 : i64 ) start_idx (%151 : i64 ) {stride_in_bytes = true }
37- %158 = llvm.getelementptr %19 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
38- %159 = omp.map.info var_ptr (%19 : !llvm.ptr , i32 ) map_clauses (descriptor_base_addr , to ) capture (ByRef ) var_ptr_ptr (%158 : !llvm.ptr ) bounds (%157 ) -> !llvm.ptr {name = " " }
39- %160 = omp.map.info var_ptr (%19 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>) map_clauses (always , descriptor , to ) capture (ByRef ) members (%159 : [0 ] : !llvm.ptr ) -> !llvm.ptr
40- omp.target nowait map_entries (%124 -> %arg2 , %160 -> %arg5 , %159 -> %arg8 : !llvm.ptr , !llvm.ptr , !llvm.ptr ) private (@privatizer %19 -> %arg9 [map_idx =1 ] : !llvm.ptr ) {
41- omp.terminator
42- }
43- %166 = llvm.mlir.constant (48 : i32 ) : i32
44- %167 = llvm.getelementptr %19 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
45- %168 = llvm.load %167 : !llvm.ptr -> !llvm.ptr
46- llvm.call @free (%168 ) : (!llvm.ptr ) -> ()
47- llvm.return
48- }
49-
5020 llvm.func internal @firstprivate_test (%arg0: !llvm.ptr {fir.bindc_name = " ptr0" }, %arg1: !llvm.ptr {fir.bindc_name = " ptr1" }) {
5121 %0 = llvm.mlir.constant (1 : i32 ) : i32
5222 %1 = llvm.mlir.constant (0 : index ) : i64
@@ -79,10 +49,12 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vec
7949 }
8050}
8151
82- // CHECK-LABEL: llvm.func @malloc(i64) -> !llvm.ptr
83- // CHECK: llvm.func @free( !llvm.ptr)
52+ // CHECK-LABEL: llvm.func @free( !llvm.ptr)
53+ // CHECK: llvm.func @malloc(i64) -> !llvm.ptr
8454
85- // CHECK-LABEL: llvm.func internal @private_test(
55+ // CHECK-LABEL: llvm.func internal @firstprivate_test(
56+ // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr {fir.bindc_name = "ptr0"},
57+ // CHECK-SAME: %[[ARG1:.*]]: !llvm.ptr {fir.bindc_name = "ptr1"}) {
8658// CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i32) : i32
8759// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(0 : index) : i64
8860// CHECK: %[[VAL_2:.*]] = llvm.alloca %[[VAL_0]] x !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> {alignment = 8 : i64} : (i32) -> !llvm.ptr
@@ -102,62 +74,35 @@ module attributes {dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vec
10274// CHECK: %[[VAL_14:.*]] = llvm.load %[[VAL_13]] : !llvm.ptr -> i64
10375// CHECK: %[[VAL_15:.*]] = llvm.sub %[[VAL_12]], %[[VAL_1]] : i64
10476// CHECK: %[[VAL_16:.*]] = omp.map.bounds lower_bound(%[[VAL_1]] : i64) upper_bound(%[[VAL_15]] : i64) extent(%[[VAL_12]] : i64) stride(%[[VAL_14]] : i64) start_idx(%[[VAL_10]] : i64) {stride_in_bytes = true}
105- // CHECK: %[[VAL_17:.*]] = llvm.load %[[STACK]] : !llvm.ptr -> !llvm.struct<( ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
106- // CHECK: llvm.store %[[VAL_17 ]], %[[HEAP]] : !llvm.struct<( ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>, !llvm.ptr
107- // CHECK: %[[VAL_18 :.*]] = llvm.getelementptr %[[HEAP]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
108- // CHECK: %[[VAL_19 :.*]] = omp.map.info var_ptr(%[[HEAP]] : !llvm.ptr, i32) map_clauses(to) capture(ByRef) var_ptr_ptr(%[[VAL_18 ]] : !llvm.ptr) bounds(%[[VAL_16]]) -> !llvm.ptr {name = ""}
109- // CHECK: %[[VAL_20 :.*]] = omp.map.info var_ptr(%[[HEAP]] : !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>) map_clauses(always, to) capture(ByRef) members(%[[VAL_19 ]] : [0] : !llvm.ptr) -> !llvm.ptr
110- // CHECK: omp.target nowait map_entries(%[[VAL_8]] -> %[[VAL_21 :.*]], %[[VAL_20 ]] -> %[[VAL_22 :.*]], %[[VAL_19 ]] -> %[[VAL_23 :.*]] : !llvm.ptr, !llvm.ptr, !llvm.ptr) private(@privatizer %[[HEAP]] -> %[[VAL_24 :.*]] [map_idx=1] : !llvm.ptr) {
77+ // CHECK: %[[VAL_17:.*]] = llvm.call @firstprivatizer_init( %[[STACK]], %[[HEAP]]) : ( !llvm.ptr, !llvm.ptr) -> !llvm.ptr
78+ // CHECK: %[[VAL_18:.*]] = llvm.call @firstprivatizer_copy( %[[STACK ]], %[[VAL_17]]) : ( !llvm.ptr, !llvm.ptr) -> !llvm.ptr
79+ // CHECK: %[[VAL_19 :.*]] = llvm.getelementptr %[[HEAP]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
80+ // CHECK: %[[VAL_20 :.*]] = omp.map.info var_ptr(%[[HEAP]] : !llvm.ptr, i32) map_clauses(to) capture(ByRef) var_ptr_ptr(%[[VAL_19 ]] : !llvm.ptr) bounds(%[[VAL_16]]) -> !llvm.ptr {name = ""}
81+ // CHECK: %[[VAL_21 :.*]] = omp.map.info var_ptr(%[[HEAP]] : !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>) map_clauses(always, to) capture(ByRef) members(%[[VAL_20 ]] : [0] : !llvm.ptr) -> !llvm.ptr
82+ // CHECK: omp.target nowait map_entries(%[[VAL_8]] -> %[[VAL_22 :.*]], %[[VAL_21 ]] -> %[[VAL_23 :.*]], %[[VAL_20 ]] -> %[[VAL_24 :.*]] : !llvm.ptr, !llvm.ptr, !llvm.ptr) private(@firstprivatizer %[[HEAP]] -> %[[VAL_25 :.*]] [map_idx=1] : !llvm.ptr) {
11183// CHECK: omp.terminator
11284// CHECK: }
113- // CHECK: %[[VAL_26:.*]] = llvm.getelementptr %[[STACK]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
114- // CHECK: %[[VAL_27:.*]] = llvm.load %[[VAL_26]] : !llvm.ptr -> !llvm.ptr
115- // CHECK: llvm.call @free(%[[VAL_27]]) : (!llvm.ptr) -> ()
85+ // CHECK: %[[VAL_26:.*]] = llvm.mlir.constant(48 : i32) : i32
86+ // CHECK: %[[VAL_27:.*]] = llvm.getelementptr %[[STACK]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
87+ // CHECK: %[[VAL_28:.*]] = llvm.load %[[VAL_27]] : !llvm.ptr -> !llvm.ptr
88+ // CHECK: llvm.call @free(%[[VAL_28]]) : (!llvm.ptr) -> ()
11689// CHECK: llvm.return
11790// CHECK: }
11891
119- // CHECK-LABEL: llvm.func internal @firstprivate_test(
120- // CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(1 : i32) : i32
121- // CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(0 : index) : i64
122- // CHECK: %[[VAL_2:.*]] = llvm.alloca %[[VAL_0]] x !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> {alignment = 8 : i64} : (i32) -> !llvm.ptr
123- // CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(48 : i64) : i64
124- // CHECK: %[[HEAP:.*]] = llvm.call @malloc(%[[VAL_3]]) : (i64) -> !llvm.ptr
125- // CHECK: %[[STACK:.*]] = llvm.alloca %[[VAL_0]] x !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> {bindc_name = "local"} : (i32) -> !llvm.ptr
126- // CHECK: %[[VAL_6:.*]] = llvm.alloca %[[VAL_0]] x i32 {bindc_name = "i"} : (i32) -> !llvm.ptr
127- // CHECK: %[[VAL_7:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
128- // CHECK: llvm.store %[[VAL_7]], %[[STACK]] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>, !llvm.ptr
129- // CHECK: llvm.store %[[VAL_0]], %[[VAL_6]] : i32, !llvm.ptr
130- // CHECK: %[[VAL_8:.*]] = omp.map.info var_ptr(%[[VAL_6]] : !llvm.ptr, i32) map_clauses(implicit, exit_release_or_enter_alloc) capture(ByCopy) -> !llvm.ptr {name = "i"}
131- // CHECK: %[[VAL_9:.*]] = llvm.getelementptr %[[STACK]][0, 7, %[[VAL_1]], 0] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
132- // CHECK: %[[VAL_10:.*]] = llvm.load %[[VAL_9]] : !llvm.ptr -> i64
133- // CHECK: %[[VAL_11:.*]] = llvm.getelementptr %[[STACK]][0, 7, %[[VAL_1]], 1] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
134- // CHECK: %[[VAL_12:.*]] = llvm.load %[[VAL_11]] : !llvm.ptr -> i64
135- // CHECK: %[[VAL_13:.*]] = llvm.getelementptr %[[STACK]][0, 7, %[[VAL_1]], 2] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
136- // CHECK: %[[VAL_14:.*]] = llvm.load %[[VAL_13]] : !llvm.ptr -> i64
137- // CHECK: %[[VAL_15:.*]] = llvm.sub %[[VAL_12]], %[[VAL_1]] : i64
138- // CHECK: %[[VAL_16:.*]] = omp.map.bounds lower_bound(%[[VAL_1]] : i64) upper_bound(%[[VAL_15]] : i64) extent(%[[VAL_12]] : i64) stride(%[[VAL_14]] : i64) start_idx(%[[VAL_10]] : i64) {stride_in_bytes = true}
139- // CHECK: %[[VAL_17:.*]] = llvm.load %[[STACK]] : !llvm.ptr -> !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
140- // CHECK: llvm.store %[[VAL_17]], %[[HEAP]] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>, !llvm.ptr
141- // CHECK: %[[VAL_18:.*]] = llvm.getelementptr %[[STACK]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
142- // CHECK: %[[VAL_19:.*]] = llvm.mlir.constant(1 : i64) : i64
143- // CHECK: %[[VAL_20:.*]] = llvm.sub %[[VAL_15]], %[[VAL_1]] : i64
144- // CHECK: %[[VAL_21:.*]] = llvm.add %[[VAL_20]], %[[VAL_19]] : i64
145- // CHECK: %[[VAL_22:.*]] = llvm.mul %[[VAL_19]], %[[VAL_21]] : i64
146- // CHECK: %[[VAL_23:.*]] = llvm.mlir.constant(4 : i64) : i64
147- // CHECK: %[[VAL_24:.*]] = llvm.mul %[[VAL_22]], %[[VAL_23]] : i64
148- // CHECK: %[[NEW_DATA_PTR:.*]] = llvm.call @malloc(%[[VAL_24]]) : (i64) -> !llvm.ptr
149- // CHECK: %[[OLD_DATA_PTR:.*]] = llvm.load %[[VAL_18]] : !llvm.ptr -> !llvm.ptr
150- // CHECK: "llvm.intr.memcpy"(%[[NEW_DATA_PTR]], %[[OLD_DATA_PTR]], %[[VAL_24]]) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i64) -> ()
151- // CHECK: %[[VAL_27:.*]] = llvm.getelementptr %[[HEAP]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
152- // CHECK: llvm.store %[[NEW_DATA_PTR]], %[[VAL_27]] : !llvm.ptr, !llvm.ptr
153- // CHECK: %[[VAL_28:.*]] = omp.map.info var_ptr(%[[HEAP]] : !llvm.ptr, i32) map_clauses(to) capture(ByRef) var_ptr_ptr(%[[VAL_27]] : !llvm.ptr) bounds(%[[VAL_16]]) -> !llvm.ptr {name = ""}
154- // CHECK: %[[VAL_29:.*]] = omp.map.info var_ptr(%[[HEAP]] : !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>) map_clauses(always, to) capture(ByRef) members(%[[VAL_28]] : [0] : !llvm.ptr) -> !llvm.ptr
155- // CHECK: omp.target nowait map_entries(%[[VAL_8]] -> %[[VAL_30:.*]], %[[VAL_29]] -> %[[VAL_31:.*]], %[[VAL_28]] -> %[[VAL_32:.*]] : !llvm.ptr, !llvm.ptr, !llvm.ptr) private(@firstprivatizer %[[HEAP]] -> %[[VAL_33:.*]] [map_idx=1] : !llvm.ptr) {
156- // CHECK: omp.terminator
92+ // CHECK-LABEL: llvm.func @firstprivatizer_init(
93+ // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr,
94+ // CHECK-SAME: %[[ARG1:.*]]: !llvm.ptr) -> !llvm.ptr attributes {always_inline} {
95+ // CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(48 : i64) : i64
96+ // CHECK: %[[VAL_1:.*]] = llvm.call @malloc(%[[VAL_0]]) : (i64) -> !llvm.ptr
97+ // CHECK: %[[VAL_2:.*]] = llvm.getelementptr %[[ARG1]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
98+ // CHECK: llvm.store %[[VAL_1]], %[[VAL_2]] : !llvm.ptr, !llvm.ptr
99+ // CHECK: llvm.return %[[ARG1]] : !llvm.ptr
157100// CHECK: }
158- // CHECK: %[[VAL_34:.*]] = llvm.mlir.constant(48 : i32) : i32
159- // CHECK: %[[VAL_35:.*]] = llvm.getelementptr %[[STACK]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)>
160- // CHECK: %[[VAL_36:.*]] = llvm.load %[[VAL_35]] : !llvm.ptr -> !llvm.ptr
161- // CHECK: llvm.call @free(%[[VAL_36]]) : (!llvm.ptr) -> ()
162- // CHECK: llvm.return
101+
102+ // CHECK-LABEL: llvm.func @firstprivatizer_copy(
103+ // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr,
104+ // CHECK-SAME: %[[ARG1:.*]]: !llvm.ptr) -> !llvm.ptr attributes {always_inline} {
105+ // CHECK: %[[VAL_0:.*]] = llvm.mlir.constant(48 : i32) : i32
106+ // CHECK: "llvm.intr.memcpy"(%[[ARG1]], %[[ARG0]], %[[VAL_0]]) <{isVolatile = false}> : (!llvm.ptr, !llvm.ptr, i32) -> ()
107+ // CHECK: llvm.return %[[ARG1]] : !llvm.ptr
163108// CHECK: }
0 commit comments