[flang-commits] [flang] [flang][HLFIR] lower hlfir.declare of assumed-ranks (PR #93468)
via flang-commits
flang-commits at lists.llvm.org
Mon May 27 05:52:26 PDT 2024
https://github.com/jeanPerier created https://github.com/llvm/llvm-project/pull/93468
hlfir.declare is in charge of ensuring that the lower bounds of its "hlfir entity" output are the ones of the source program. For non-allocatable/non-pointer assumed-ranks where the input descriptor lower bounds may not be ones, the hlfir.declare needs to be lowered to an hlfir.rebox_assumed_rank to set the lower bounds to ones.
>From 516861a47bab8d8a44fcf06c45e12da99063b48c Mon Sep 17 00:00:00 2001
From: Jean Perier <jperier at nvidia.com>
Date: Fri, 24 May 2024 07:01:46 -0700
Subject: [PATCH] [flang][HLFIR] lower hlfir.declare of assumed-ranks
hlfir.declare is in charge of ensuring that the lower bounds of its
"hlfir entity" output are the ones of the source program.
For non-allocatable/non-pointer assumed-ranks where the input
descriptor lower bounds may not be ones, the hlfir.declare needs
to be lowered to an hlfir.rebox_assumed_rank to set the lower bounds
to ones.
---
.../Optimizer/HLFIR/Transforms/ConvertToFIR.cpp | 17 +++++++++++------
flang/test/HLFIR/declare-codegen.fir | 9 +++++++++
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp
index e56595d1c8e23..44552359930c1 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp
@@ -348,7 +348,17 @@ class DeclareOpConversion : public mlir::OpRewritePattern<hlfir::DeclareOp> {
// Helper to generate the hlfir fir.box with the local lower bounds and
// type parameters.
auto genHlfirBox = [&]() -> mlir::Value {
- if (!mlir::isa<fir::BaseBoxType>(firBase.getType())) {
+ if (auto baseBoxType =
+ mlir::dyn_cast<fir::BaseBoxType>(firBase.getType())) {
+ // Rebox so that lower bounds are correct.
+ if (baseBoxType.isAssumedRank())
+ return builder.create<fir::ReboxAssumedRankOp>(
+ loc, hlfirBaseType, firBase,
+ fir::LowerBoundModifierAttribute::SetToOnes);
+ return builder.create<fir::ReboxOp>(loc, hlfirBaseType, firBase,
+ declareOp.getShape(),
+ /*slice=*/mlir::Value{});
+ } else {
llvm::SmallVector<mlir::Value> typeParams;
auto maybeCharType = mlir::dyn_cast<fir::CharacterType>(
fir::unwrapSequenceType(fir::unwrapPassByRefType(hlfirBaseType)));
@@ -358,11 +368,6 @@ class DeclareOpConversion : public mlir::OpRewritePattern<hlfir::DeclareOp> {
return builder.create<fir::EmboxOp>(
loc, hlfirBaseType, firBase, declareOp.getShape(),
/*slice=*/mlir::Value{}, typeParams);
- } else {
- // Rebox so that lower bounds are correct.
- return builder.create<fir::ReboxOp>(loc, hlfirBaseType, firBase,
- declareOp.getShape(),
- /*slice=*/mlir::Value{});
}
};
if (!mlir::cast<fir::FortranVariableOpInterface>(declareOp.getOperation())
diff --git a/flang/test/HLFIR/declare-codegen.fir b/flang/test/HLFIR/declare-codegen.fir
index 9f51d0fbc7afd..bd0d61a2559db 100644
--- a/flang/test/HLFIR/declare-codegen.fir
+++ b/flang/test/HLFIR/declare-codegen.fir
@@ -210,3 +210,12 @@ func.func @dummy_scope(%arg0: !fir.ref<f32>) {
// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<f32>) {
// CHECK: %[[SCOPE:.*]] = fir.dummy_scope : !fir.dscope
// CHECK: %[[VAL_1:.*]] = fir.declare %[[VAL_0]] dummy_scope %[[SCOPE]] {uniq_name = "x"} : (!fir.ref<f32>, !fir.dscope) -> !fir.ref<f32>
+
+func.func @assumed_rank_declare(%arg0: !fir.box<!fir.array<*:f32>>) {
+ %0:2 = hlfir.declare %arg0 {uniq_name = "x"} : (!fir.box<!fir.array<*:f32>>) -> (!fir.box<!fir.array<*:f32>>, !fir.box<!fir.array<*:f32>>)
+ return
+}
+// CHECK-LABEL: func.func @assumed_rank_declare(
+// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<*:f32>>) {
+// CHECK: %[[VAL_1:.*]] = fir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box<!fir.array<*:f32>>) -> !fir.box<!fir.array<*:f32>>
+// CHECK: %[[VAL_2:.*]] = fir.rebox_assumed_rank %[[VAL_1]] lbs ones : (!fir.box<!fir.array<*:f32>>) -> !fir.box<!fir.array<*:f32>>
More information about the flang-commits
mailing list