diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -45,6 +45,10 @@ mlir::Value one = builder.createIntegerConstant(loc, idxTy, 1); assert(box.getType().isa() && "expect fir.box or fir.class"); + // Note that with the HLFIR lowering the 'box' is the FIR box + // which may not have correct local lbounds. As long as we only + // use the extents, it should be okay to read the dimensions + // from this box. for (unsigned dim = 0; dim < dataExv.rank(); ++dim) { mlir::Value d = builder.createIntegerConstant(loc, idxTy, dim); mlir::Value baseLb = diff --git a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp --- a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp +++ b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp @@ -365,6 +365,15 @@ if (!mlir::cast(declareOp.getOperation()) .isOptional()) { hlfirBase = genHlfirBox(); + // If the original base is a box too, we could as well + // use the HLFIR box as the FIR base: otherwise, the two + // boxes are "alive" at the same time, and the FIR box + // is used for accessing the base_addr and the HLFIR box + // is used for accessing the bounds etc. Using the HLFIR box, + // that holds the same base_addr at this point, makes + // the representation a little bit more clear. + if (hlfirBase.getType() == firBase.getType()) + firBase = hlfirBase; } else { // Need to conditionally rebox/embox the optional: the input fir.box // may be null and the rebox would be illegal. It is also important to diff --git a/flang/test/HLFIR/assign-codegen.fir b/flang/test/HLFIR/assign-codegen.fir --- a/flang/test/HLFIR/assign-codegen.fir +++ b/flang/test/HLFIR/assign-codegen.fir @@ -139,7 +139,7 @@ // CHECK: %[[VAL_8:.*]] = fir.declare %[[VAL_1]](%[[VAL_7]]) {uniq_name = "y"} : (!fir.ref>, !fir.shape<1>) -> !fir.ref> // CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_10:.*]] = fir.embox %[[VAL_8]](%[[VAL_9]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> -// CHECK: fir.store %[[VAL_5]] to %[[VAL_2]] : !fir.ref>> +// CHECK: fir.store %[[VAL_6]] to %[[VAL_2]] : !fir.ref>> // CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_2]] : (!fir.ref>>) -> !fir.ref> // CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_10]] : (!fir.box>) -> !fir.box // CHECK: %[[VAL_29:.*]] = fir.call @_FortranAAssign(%[[VAL_26]], %[[VAL_27]], %{{.*}}, %{{.*}}) : (!fir.ref>, !fir.box, !fir.ref, i32) -> none @@ -164,7 +164,7 @@ // CHECK: %[[VAL_8:.*]] = fir.declare %[[VAL_1]](%[[VAL_7]]) {uniq_name = "y"} : (!fir.ref>, !fir.shape<1>) -> !fir.ref> // CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_10:.*]] = fir.embox %[[VAL_8]](%[[VAL_9]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> -// CHECK: fir.store %[[VAL_5]] to %[[VAL_2]] : !fir.ref>> +// CHECK: fir.store %[[VAL_6]] to %[[VAL_2]] : !fir.ref>> // CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_2]] : (!fir.ref>>) -> !fir.ref> // CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_10]] : (!fir.box>) -> !fir.box // CHECK: %[[VAL_29:.*]] = fir.call @_FortranAAssignTemporary(%[[VAL_26]], %[[VAL_27]], %{{.*}}, %{{.*}}) : (!fir.ref>, !fir.box, !fir.ref, i32) -> none @@ -403,8 +403,8 @@ // CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_7]] : !fir.ref>>> // CHECK: %[[VAL_9:.*]] = arith.constant 1 : index // CHECK: fir.do_loop %[[VAL_10:.*]] = %[[VAL_9]] to %[[VAL_6]]#1 step %[[VAL_9]] unordered { -// CHECK: %[[VAL_11:.*]] = fir.array_coor %[[VAL_4]] %[[VAL_10]] : (!fir.class>, index) -> !fir.ref -// CHECK: %[[VAL_12:.*]] = fir.embox %[[VAL_11]] source_box %[[VAL_4]] : (!fir.ref, !fir.class>) -> !fir.class +// CHECK: %[[VAL_11:.*]] = fir.array_coor %[[VAL_5]] %[[VAL_10]] : (!fir.class>, index) -> !fir.ref +// CHECK: %[[VAL_12:.*]] = fir.embox %[[VAL_11]] source_box %[[VAL_5]] : (!fir.ref, !fir.class>) -> !fir.class // CHECK: %[[VAL_13:.*]] = arith.constant 0 : index // CHECK: %[[VAL_14:.*]]:3 = fir.box_dims %[[VAL_8]], %[[VAL_13]] : (!fir.class>>, index) -> (index, index, index) // CHECK: %[[VAL_15:.*]] = arith.constant 1 : index diff --git a/flang/test/HLFIR/designate-codegen-complex-part.fir b/flang/test/HLFIR/designate-codegen-complex-part.fir --- a/flang/test/HLFIR/designate-codegen-complex-part.fir +++ b/flang/test/HLFIR/designate-codegen-complex-part.fir @@ -34,7 +34,7 @@ // CHECK: %[[VAL_4:.*]] = fir.declare %[[VAL_1]] {uniq_name = "b"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_4]] : !fir.ref // CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> i64 -// CHECK: %[[VAL_7:.*]] = fir.array_coor %[[VAL_2]] %[[VAL_6]] : (!fir.box>>, i64) -> !fir.ref> +// CHECK: %[[VAL_7:.*]] = fir.array_coor %[[VAL_3]] %[[VAL_6]] : (!fir.box>>, i64) -> !fir.ref> // CHECK: %[[VAL_8:.*]] = arith.constant 0 : index // CHECK: %[[VAL_9:.*]] = fir.coordinate_of %[[VAL_7]], %[[VAL_8]] : (!fir.ref>, index) -> !fir.ref @@ -56,10 +56,10 @@ // CHECK: %[[VAL_6:.*]] = arith.constant 1 : index // CHECK: %[[VAL_7:.*]] = arith.constant 1 : index // CHECK: %[[VAL_8:.*]] = arith.constant 0 : index -// CHECK: %[[VAL_9:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_8]] : (!fir.box>>, index) -> (index, index, index) +// CHECK: %[[VAL_9:.*]]:3 = fir.box_dims %[[VAL_3]], %[[VAL_8]] : (!fir.box>>, index) -> (index, index, index) // CHECK: %[[VAL_10:.*]] = arith.constant 1 : index // CHECK: %[[VAL_11:.*]] = fir.slice %[[VAL_7]], %[[VAL_9]]#1, %[[VAL_6]] path %[[VAL_10]] : (index, index, index, index) -> !fir.slice<1> -// CHECK: %[[VAL_12:.*]] = fir.rebox %[[VAL_2]] [%[[VAL_11]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box> +// CHECK: %[[VAL_12:.*]] = fir.rebox %[[VAL_3]] [%[[VAL_11]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box> func.func @test_slice_steps(%arg0: !fir.box>>) { %c3 = arith.constant 3 : index @@ -80,4 +80,4 @@ // CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_7:.*]] = arith.constant 0 : index // CHECK: %[[VAL_8:.*]] = fir.slice %[[VAL_3]], %[[VAL_2]], %[[VAL_1]] path %[[VAL_7]] : (index, index, index, index) -> !fir.slice<1> -// CHECK: %[[VAL_9:.*]] = fir.rebox %[[VAL_4]] [%[[VAL_8]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box> +// CHECK: %[[VAL_9:.*]] = fir.rebox %[[VAL_5]] [%[[VAL_8]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box> diff --git a/flang/test/HLFIR/designate-codegen-component-refs.fir b/flang/test/HLFIR/designate-codegen-component-refs.fir --- a/flang/test/HLFIR/designate-codegen-component-refs.fir +++ b/flang/test/HLFIR/designate-codegen-component-refs.fir @@ -51,9 +51,9 @@ // CHECK: %[[VAL_7:.*]] = arith.constant 1 : index // CHECK: %[[VAL_8:.*]] = arith.constant 1 : index // CHECK: %[[VAL_9:.*]] = arith.constant 0 : index -// CHECK: %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_1]], %[[VAL_9]] : (!fir.box>>, index) -> (index, index, index) +// CHECK: %[[VAL_10:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_9]] : (!fir.box>>, index) -> (index, index, index) // CHECK: %[[VAL_11:.*]] = fir.slice %[[VAL_8]], %[[VAL_10]]#1, %[[VAL_7]] path %[[VAL_6]] : (index, index, index, !fir.field) -> !fir.slice<1> -// CHECK: %[[VAL_12:.*]] = fir.rebox %[[VAL_1]] {{\[}}%[[VAL_11]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box> +// CHECK: %[[VAL_12:.*]] = fir.rebox %[[VAL_2]] {{\[}}%[[VAL_11]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box> func.func @test_array_char(%arg0: !fir.ref}>>>, %n : index) { %5 = fir.shape %n : (index) -> !fir.shape<1> diff --git a/flang/test/HLFIR/designate-codegen.fir b/flang/test/HLFIR/designate-codegen.fir --- a/flang/test/HLFIR/designate-codegen.fir +++ b/flang/test/HLFIR/designate-codegen.fir @@ -14,8 +14,9 @@ // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref) { // CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "n"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_3:.*]] = fir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box>) -> !fir.box> +// CHECK: %[[VAL_4:.*]] = fir.rebox %[[VAL_3]] : (!fir.box>) -> !fir.box> // CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_2]] : !fir.ref -// CHECK: %[[VAL_6:.*]] = fir.array_coor %[[VAL_3]] %[[VAL_5]] : (!fir.box>, i64) -> !fir.ref +// CHECK: %[[VAL_6:.*]] = fir.array_coor %[[VAL_4]] %[[VAL_5]] : (!fir.box>, i64) -> !fir.ref func.func @char_array_ref(%arg0: !fir.box>>, %arg1: !fir.ref) { @@ -31,9 +32,10 @@ // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref) { // CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "n"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_3:.*]] = fir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box>>) -> !fir.box>> -// CHECK: %[[VAL_5:.*]] = fir.box_elesize %[[VAL_3]] : (!fir.box>>) -> index +// CHECK: %[[VAL_4:.*]] = fir.rebox %[[VAL_3]] : (!fir.box>>) -> !fir.box>> +// CHECK: %[[VAL_5:.*]] = fir.box_elesize %[[VAL_4]] : (!fir.box>>) -> index // CHECK: %[[VAL_6:.*]] = arith.constant 10 : index -// CHECK: %[[VAL_7:.*]] = fir.array_coor %[[VAL_3]] %[[VAL_6]] : (!fir.box>>, index) -> !fir.ref> +// CHECK: %[[VAL_7:.*]] = fir.array_coor %[[VAL_4]] %[[VAL_6]] : (!fir.box>>, index) -> !fir.ref> // CHECK: %[[VAL_8:.*]] = fir.emboxchar %[[VAL_7]], %[[VAL_5]] : (!fir.ref>, index) -> !fir.boxchar<1> @@ -51,8 +53,9 @@ // CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "n"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_3:.*]] = arith.constant 5 : index // CHECK: %[[VAL_4:.*]] = fir.declare %[[VAL_0]] typeparams %[[VAL_3]] {uniq_name = "x"} : (!fir.box>>, index) -> !fir.box>> +// CHECK: %[[VAL_5:.*]] = fir.rebox %[[VAL_4]] : (!fir.box>>) -> !fir.box>> // CHECK: %[[VAL_6:.*]] = arith.constant 10 : index -// CHECK: %[[VAL_7:.*]] = fir.array_coor %[[VAL_4]] %[[VAL_6]] : (!fir.box>>, index) -> !fir.ref> +// CHECK: %[[VAL_7:.*]] = fir.array_coor %[[VAL_5]] %[[VAL_6]] : (!fir.box>>, index) -> !fir.ref> func.func @char_array_ref_3(%arg0: !fir.ref>>, %arg1: !fir.ref) { @@ -121,16 +124,17 @@ // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref) { // CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "n"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_3:.*]] = fir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box>) -> !fir.box> +// CHECK: %[[VAL_4:.*]] = fir.rebox %[[VAL_3]] : (!fir.box>) -> !fir.box> // CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_2]] : !fir.ref // CHECK: %[[VAL_6:.*]] = arith.constant 0 : index -// CHECK: %[[VAL_7:.*]]:3 = fir.box_dims %[[VAL_3]], %[[VAL_6]] : (!fir.box>, index) -> (index, index, index) +// CHECK: %[[VAL_7:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_6]] : (!fir.box>, index) -> (index, index, index) // CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_5]] : (i64) -> index // CHECK: %[[VAL_9:.*]] = arith.constant 3 : index // CHECK: %[[VAL_10:.*]] = arith.constant 42 : index // CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_12:.*]] = fir.undefined index // CHECK: %[[VAL_13:.*]] = fir.slice %[[VAL_8]], %[[VAL_7]]#1, %[[VAL_9]] : (index, index, index) -> !fir.slice<1> -// CHECK: %[[VAL_14:.*]] = fir.rebox %[[VAL_3]] {{\[}}%[[VAL_13]]] : (!fir.box>, !fir.slice<1>) -> !fir.box> +// CHECK: %[[VAL_14:.*]] = fir.rebox %[[VAL_4]] {{\[}}%[[VAL_13]]] : (!fir.box>, !fir.slice<1>) -> !fir.box> func.func @char_array_section(%arg0: !fir.box>>, %arg1: !fir.ref) { @@ -151,16 +155,17 @@ // CHECK-SAME: %[[VAL_1:.*]]: !fir.ref) { // CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "n"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_3:.*]] = fir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box>>) -> !fir.box>> -// CHECK: %[[VAL_5:.*]] = fir.box_elesize %[[VAL_3]] : (!fir.box>>) -> index +// CHECK: %[[VAL_4:.*]] = fir.rebox %[[VAL_3]] : (!fir.box>>) -> !fir.box>> +// CHECK: %[[VAL_5:.*]] = fir.box_elesize %[[VAL_4]] : (!fir.box>>) -> index // CHECK: %[[VAL_6:.*]] = arith.constant 1 : index // CHECK: %[[VAL_7:.*]] = arith.constant 0 : index -// CHECK: %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_3]], %[[VAL_7]] : (!fir.box>>, index) -> (index, index, index) +// CHECK: %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_7]] : (!fir.box>>, index) -> (index, index, index) // CHECK: %[[VAL_9:.*]] = arith.constant 3 : index // CHECK: %[[VAL_10:.*]] = arith.constant 42 : index // CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_12:.*]] = fir.undefined index // CHECK: %[[VAL_13:.*]] = fir.slice %[[VAL_6]], %[[VAL_8]]#1, %[[VAL_9]] : (index, index, index) -> !fir.slice<1> -// CHECK: %[[VAL_14:.*]] = fir.rebox %[[VAL_3]] {{\[}}%[[VAL_13]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box>> +// CHECK: %[[VAL_14:.*]] = fir.rebox %[[VAL_4]] {{\[}}%[[VAL_13]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box>> func.func @char_array_section_cst_len(%arg0: !fir.box>>, %arg1: !fir.ref) { @@ -182,15 +187,16 @@ // CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "n"} : (!fir.ref) -> !fir.ref // CHECK: %[[VAL_3:.*]] = arith.constant 5 : index // CHECK: %[[VAL_4:.*]] = fir.declare %[[VAL_0]] typeparams %[[VAL_3]] {uniq_name = "x"} : (!fir.box>>, index) -> !fir.box>> +// CHECK: %[[VAL_5:.*]] = fir.rebox %[[VAL_4]] : (!fir.box>>) -> !fir.box>> // CHECK: %[[VAL_6:.*]] = arith.constant 1 : index // CHECK: %[[VAL_7:.*]] = arith.constant 0 : index -// CHECK: %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_7]] : (!fir.box>>, index) -> (index, index, index) +// CHECK: %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_5]], %[[VAL_7]] : (!fir.box>>, index) -> (index, index, index) // CHECK: %[[VAL_9:.*]] = arith.constant 3 : index // CHECK: %[[VAL_10:.*]] = arith.constant 42 : index // CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_10]] : (index) -> !fir.shape<1> // CHECK: %[[VAL_12:.*]] = fir.undefined index // CHECK: %[[VAL_13:.*]] = fir.slice %[[VAL_6]], %[[VAL_8]]#1, %[[VAL_9]] : (index, index, index) -> !fir.slice<1> -// CHECK: %[[VAL_14:.*]] = fir.rebox %[[VAL_4]] {{\[}}%[[VAL_13]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box>> +// CHECK: %[[VAL_14:.*]] = fir.rebox %[[VAL_5]] {{\[}}%[[VAL_13]]] : (!fir.box>>, !fir.slice<1>) -> !fir.box>> func.func @test_polymorphic_array_elt(%arg0: !fir.class>> {fir.bindc_name = "x"}) { %0:2 = hlfir.declare %arg0 {uniq_name = "_QFtest1Ex"} : (!fir.class>>) -> (!fir.class>>, !fir.class>>) @@ -203,7 +209,7 @@ // CHECK: %[[VAL_1:.*]] = fir.declare %[[VAL_0]] {uniq_name = "_QFtest1Ex"} : (!fir.class>>) -> !fir.class>> // CHECK: %[[VAL_2:.*]] = fir.rebox %[[VAL_1]] : (!fir.class>>) -> !fir.class>> // CHECK: %[[VAL_3:.*]] = arith.constant 7 : index -// CHECK: %[[VAL_4:.*]] = fir.array_coor %[[VAL_1]] %[[VAL_3]] : (!fir.class>>, index) -> !fir.ref> -// CHECK: %[[VAL_5:.*]] = fir.embox %[[VAL_4]] source_box %[[VAL_1]] : (!fir.ref>, !fir.class>>) -> !fir.class> +// CHECK: %[[VAL_4:.*]] = fir.array_coor %[[VAL_2]] %[[VAL_3]] : (!fir.class>>, index) -> !fir.ref> +// CHECK: %[[VAL_5:.*]] = fir.embox %[[VAL_4]] source_box %[[VAL_2]] : (!fir.ref>, !fir.class>>) -> !fir.class> // CHECK: return // CHECK: }