diff --git a/flang/lib/Optimizer/Builder/MutableBox.cpp b/flang/lib/Optimizer/Builder/MutableBox.cpp index 50c945df5b465..d4cdfecd0b088 100644 --- a/flang/lib/Optimizer/Builder/MutableBox.cpp +++ b/flang/lib/Optimizer/Builder/MutableBox.cpp @@ -603,21 +603,23 @@ void fir::factory::associateMutableBoxWithRemap( mlir::ValueRange lbounds, mlir::ValueRange ubounds) { // Compute new extents llvm::SmallVector extents; - auto idxTy = builder.getIndexType(); + mlir::Type idxTy = builder.getIndexType(); + mlir::Value zero = builder.createIntegerConstant(loc, idxTy, 0); if (!lbounds.empty()) { auto one = builder.createIntegerConstant(loc, idxTy, 1); for (auto [lb, ub] : llvm::zip(lbounds, ubounds)) { - auto lbi = builder.createConvert(loc, idxTy, lb); - auto ubi = builder.createConvert(loc, idxTy, ub); - auto diff = mlir::arith::SubIOp::create(builder, loc, idxTy, ubi, lbi); + + mlir::Value lbi = builder.createConvert(loc, idxTy, lb); + mlir::Value ubi = builder.createConvert(loc, idxTy, ub); extents.emplace_back( - mlir::arith::AddIOp::create(builder, loc, idxTy, diff, one)); + fir::factory::computeExtent(builder, loc, lbi, ubi, zero, one)); } } else { // lbounds are default. Upper bounds and extents are the same. - for (auto ub : ubounds) { - auto cast = builder.createConvert(loc, idxTy, ub); - extents.emplace_back(cast); + for (mlir::Value ub : ubounds) { + mlir::Value cast = builder.createConvert(loc, idxTy, ub); + extents.emplace_back( + fir::factory::genMaxWithZero(builder, loc, cast, zero)); } } const auto newRank = extents.size(); diff --git a/flang/test/Lower/HLFIR/allocatable-and-pointer-status-change.f90 b/flang/test/Lower/HLFIR/allocatable-and-pointer-status-change.f90 index e2fd268bf994d..08492e913c992 100644 --- a/flang/test/Lower/HLFIR/allocatable-and-pointer-status-change.f90 +++ b/flang/test/Lower/HLFIR/allocatable-and-pointer-status-change.f90 @@ -58,12 +58,16 @@ subroutine pointer_remapping(p, ziel) ! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_9]] : (i64) -> index ! CHECK: %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %[[VAL_13]] : index ! CHECK: %[[VAL_16:.*]] = arith.addi %[[VAL_15]], %[[VAL_12]] : index +! CHECK: %[[cmp0:.*]] = arith.cmpi sgt, %[[VAL_16]], %c0{{.*}} : index +! CHECK: %[[ext0:.*]] = arith.select %[[cmp0]], %[[VAL_16]], %c0{{.*}} : index ! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_10]] : (i64) -> index ! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_11]] : (i64) -> index ! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_18]], %[[VAL_17]] : index ! CHECK: %[[VAL_20:.*]] = arith.addi %[[VAL_19]], %[[VAL_12]] : index +! CHECK: %[[cmp1:.*]] = arith.cmpi sgt, %[[VAL_20]], %c0{{.*}} : index +! CHECK: %[[ext1:.*]] = arith.select %[[cmp1]], %[[VAL_20]], %c0{{.*}} : index ! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.ref>) -> !fir.ref> -! CHECK: %[[VAL_22:.*]] = fir.shape_shift %[[VAL_8]], %[[VAL_16]], %[[VAL_10]], %[[VAL_20]] : (i64, index, i64, index) -> !fir.shapeshift<2> +! CHECK: %[[VAL_22:.*]] = fir.shape_shift %[[VAL_8]], %[[ext0]], %[[VAL_10]], %[[ext1]] : (i64, index, i64, index) -> !fir.shapeshift<2> ! CHECK: %[[VAL_23:.*]] = fir.embox %[[VAL_21]](%[[VAL_22]]) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.box>> ! CHECK: fir.store %[[VAL_23]] to %[[VAL_2]]#0 : !fir.ref>>> end subroutine diff --git a/flang/test/Lower/HLFIR/issue80884.f90 b/flang/test/Lower/HLFIR/issue80884.f90 index 5c05a99a53eaf..a5a51782ae735 100644 --- a/flang/test/Lower/HLFIR/issue80884.f90 +++ b/flang/test/Lower/HLFIR/issue80884.f90 @@ -26,7 +26,9 @@ subroutine issue80884(p, targ) ! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_5]] : (i64) -> index ! CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_13]], %[[VAL_12]] : index ! CHECK: %[[VAL_15:.*]] = arith.addi %[[VAL_14]], %[[VAL_11]] : index +! CHECK: %[[cmp0:.*]] = arith.cmpi sgt, %[[VAL_15]], %c0{{.*}} : index +! CHECK: %[[ext0:.*]] = arith.select %[[cmp0]], %[[VAL_15]], %c0{{.*}} : index ! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_10]] : (!fir.ref>) -> !fir.ref> -! CHECK: %[[VAL_17:.*]] = fir.shape_shift %[[VAL_4]], %[[VAL_15]] : (i64, index) -> !fir.shapeshift<1> +! CHECK: %[[VAL_17:.*]] = fir.shape_shift %[[VAL_4]], %[[ext0]] : (i64, index) -> !fir.shapeshift<1> ! CHECK: %[[VAL_18:.*]] = fir.embox %[[VAL_16]](%[[VAL_17]]) : (!fir.ref>, !fir.shapeshift<1>) -> !fir.box>> ! CHECK: fir.store %[[VAL_18]] to %[[VAL_2]]#0 : !fir.ref>>> diff --git a/flang/test/Lower/pointer-assignments.f90 b/flang/test/Lower/pointer-assignments.f90 index ac9c99c97a570..98fd61df3602f 100644 --- a/flang/test/Lower/pointer-assignments.f90 +++ b/flang/test/Lower/pointer-assignments.f90 @@ -113,11 +113,15 @@ subroutine test_array_remap(p, x) ! CHECK-DAG: %[[c2_idx:.*]] = fir.convert %c2{{.*}} : (i64) -> index ! CHECK-DAG: %[[c11_idx:.*]] = fir.convert %c11{{.*}} : (i64) -> index ! CHECK-DAG: %[[diff0:.*]] = arith.subi %[[c11_idx]], %[[c2_idx]] : index - ! CHECK-DAG: %[[ext0:.*]] = arith.addi %[[diff0:.*]], %c1{{.*}} : index + ! CHECK-DAG: %[[raw_ext0:.*]] = arith.addi %[[diff0:.*]], %c1{{.*}} : index + ! CHECK-DAG: %[[cmp0:.*]] = arith.cmpi sgt, %[[raw_ext0]], %c0{{.*}} : index + ! CHECK-DAG: %[[ext0:.*]] = arith.select %[[cmp0]], %[[raw_ext0]], %c0{{.*}} : index ! CHECK-DAG: %[[c3_idx:.*]] = fir.convert %c3{{.*}} : (i64) -> index ! CHECK-DAG: %[[c12_idx:.*]] = fir.convert %c12{{.*}} : (i64) -> index ! CHECK-DAG: %[[diff1:.*]] = arith.subi %[[c12_idx]], %[[c3_idx]] : index - ! CHECK-DAG: %[[ext1:.*]] = arith.addi %[[diff1]], %c1{{.*}} : index + ! CHECK-DAG: %[[raw_ext1:.*]] = arith.addi %[[diff1]], %c1{{.*}} : index + ! CHECK-DAG: %[[cmp1:.*]] = arith.cmpi sgt, %[[raw_ext1]], %c0{{.*}} : index + ! CHECK-DAG: %[[ext1:.*]] = arith.select %[[cmp1]], %[[raw_ext1]], %c0{{.*}} : index ! CHECK-DAG: %[[addrCast:.*]] = fir.convert %[[x]] : (!fir.ref>) -> !fir.ref> ! CHECK: %[[shape:.*]] = fir.shape_shift %c2{{.*}}, %[[ext0]], %c3{{.*}}, %[[ext1]] ! CHECK: %[[box:.*]] = fir.embox %[[addrCast]](%[[shape]]) : (!fir.ref>, !fir.shapeshift<2>) -> !fir.box>> @@ -132,9 +136,9 @@ subroutine test_array_char_remap(p, x) character(*), target :: x(100) character(:), pointer :: p(:, :) ! CHECK: subi - ! CHECK: %[[ext0:.*]] = arith.addi + ! CHECK: %[[ext0:.*]] = arith.select ! CHECK: subi - ! CHECK: %[[ext1:.*]] = arith.addi + ! CHECK: %[[ext1:.*]] = arith.select ! CHECK: %[[shape:.*]] = fir.shape_shift %c2{{.*}}, %[[ext0]], %c3{{.*}}, %[[ext1]] ! CHECK: %[[box:.*]] = fir.embox %{{.*}}(%[[shape]]) typeparams %[[unbox]]#1 : (!fir.ref>>, !fir.shapeshift<2>, index) -> !fir.box>>> ! CHECK: fir.store %[[box]] to %[[p]] @@ -218,9 +222,9 @@ subroutine test_array_non_contig_remap(p, x) real, target :: x(:) real, pointer :: p(:, :) ! CHECK: subi - ! CHECK: %[[ext0:.*]] = arith.addi + ! CHECK: %[[ext0:.*]] = arith.select ! CHECK: subi - ! CHECK: %[[ext1:.*]] = arith.addi + ! CHECK: %[[ext1:.*]] = arith.select ! CHECK: %[[shape:.*]] = fir.shape_shift %{{.*}}, %[[ext0]], %{{.*}}, %[[ext1]] ! CHECK: %[[rebox:.*]] = fir.rebox %[[x]](%[[shape]]) : (!fir.box>, !fir.shapeshift<2>) -> !fir.box>> ! CHECK: fir.store %[[rebox]] to %[[p]] : !fir.ref>>> @@ -250,13 +254,17 @@ subroutine test_array_non_contig_remap(p, x) ! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_4]] : (i64) -> index ! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_18]], %[[VAL_17]] : index ! CHECK: %[[VAL_20:.*]] = arith.addi %[[VAL_19]], %[[VAL_16]] : index +! CHECK: %[[cmp0:.*]] = arith.cmpi sgt, %[[VAL_20]], %c0{{.*}} : index +! CHECK: %[[ext0:.*]] = arith.select %[[cmp0]], %[[VAL_20]], %c0{{.*}} : index ! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_5]] : (i64) -> index ! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_6]] : (i64) -> index ! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_22]], %[[VAL_21]] : index ! CHECK: %[[VAL_24:.*]] = arith.addi %[[VAL_23]], %[[VAL_16]] : index +! CHECK: %[[cmp1:.*]] = arith.cmpi sgt, %[[VAL_24]], %c0{{.*}} : index +! CHECK: %[[ext1:.*]] = arith.select %[[cmp1]], %[[VAL_24]], %c0{{.*}} : index ! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_3]] : (i64) -> index ! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_5]] : (i64) -> index -! CHECK: %[[VAL_27:.*]] = fir.shape_shift %[[VAL_25]], %[[VAL_20]], %[[VAL_26]], %[[VAL_24]] : (index, index, index, index) -> !fir.shapeshift<2> +! CHECK: %[[VAL_27:.*]] = fir.shape_shift %[[VAL_25]], %[[ext0]], %[[VAL_26]], %[[ext1]] : (index, index, index, index) -> !fir.shapeshift<2> ! CHECK: %[[VAL_28:.*]] = fir.rebox %[[VAL_15]](%[[VAL_27]]) : (!fir.box>, !fir.shapeshift<2>) -> !fir.box>> ! CHECK: fir.store %[[VAL_28]] to %[[VAL_0]] : !fir.ref>>> ! CHECK: return @@ -333,7 +341,9 @@ subroutine issue857_array_remap(rhs) ! CHECK: %[[c101:.*]] = fir.convert %c101_i64 : (i64) -> index ! CHECK: %[[c200:.*]] = fir.convert %c200_i64 : (i64) -> index ! CHECK: %[[sub:.*]] = arith.subi %[[c200]], %[[c101]] : index - ! CHECK: %[[extent:.*]] = arith.addi %[[sub]], %c1{{.*}} : index + ! CHECK: %[[raw_extent:.*]] = arith.addi %[[sub]], %c1{{.*}} : index + ! CHECK: %[[cmp:.*]] = arith.cmpi sgt, %[[raw_extent]], %c0{{.*}} : index + ! CHECK: %[[extent:.*]] = arith.select %[[cmp]], %[[raw_extent]], %c0{{.*}} : index ! CHECK: %[[addr:.*]] = fir.box_addr %{{.*}} : (!fir.box>>>) -> !fir.ptr>> ! CHECK: %[[addr_cast:.*]] = fir.convert %[[addr]] : (!fir.ptr>>) -> !fir.ptr>> ! CHECK: fir.store %[[addr_cast]] to %[[lhs_addr]] : !fir.ref>>>