[flang-commits] [flang] b870875 - [flang] Allow non-index length parameter on exprs fed into hlfir.get_length. (#124827)
via flang-commits
flang-commits at lists.llvm.org
Wed Jan 29 12:01:16 PST 2025
Author: Slava Zakharin
Date: 2025-01-29T12:01:13-08:00
New Revision: b8708753c89db07eb6993559b4546e5a97d94530
URL: https://github.com/llvm/llvm-project/commit/b8708753c89db07eb6993559b4546e5a97d94530
DIFF: https://github.com/llvm/llvm-project/commit/b8708753c89db07eb6993559b4546e5a97d94530.diff
LOG: [flang] Allow non-index length parameter on exprs fed into hlfir.get_length. (#124827)
The length might be any integer, so hlfir.get_length lowering
should explicitly cast it to `index`.
Added:
Modified:
flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
flang/test/HLFIR/get_length_codegen.fir
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index 48e3db0eb39b67..e664834d31d359 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -362,6 +362,7 @@ struct GetLengthOpConversion
if (!length)
return rewriter.notifyMatchFailure(
getLength, "could not deduce length from GetLengthOp operand");
+ length = builder.createConvert(loc, builder.getIndexType(), length);
rewriter.replaceOp(getLength, length);
return mlir::success();
}
diff --git a/flang/test/HLFIR/get_length_codegen.fir b/flang/test/HLFIR/get_length_codegen.fir
index 7cb36d2cd3c6c7..c828aa5653d657 100644
--- a/flang/test/HLFIR/get_length_codegen.fir
+++ b/flang/test/HLFIR/get_length_codegen.fir
@@ -30,3 +30,22 @@ fir.global linkonce @_QQclX616263 constant : !fir.char<1,3> {
// CHECK: %[[VAL_33:.*]]:2 = hlfir.declare %[[VAL_31:.*]] typeparams %[[VAL_9]] {uniq_name = ".tmp"} : (!fir.ref<!fir.char<1,?>>, index) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>)
// CHECK: return %[[VAL_9]] : index
// CHECK: }
+
+// Test get_length taking the length from an expression with i32 length parameter.
+func.func @i32_length(%char: !fir.boxchar<1>, %shape : i32, %len : i32) -> index {
+ %14 = fir.shape %shape : (i32) -> !fir.shape<1>
+ %15 = hlfir.elemental %14 typeparams %len unordered : (!fir.shape<1>, i32) -> !hlfir.expr<?x!fir.char<1,?>> {
+ ^bb0(%arg0: index):
+ hlfir.yield_element %char : !fir.boxchar<1>
+ }
+ %18 = hlfir.get_length %15 : (!hlfir.expr<?x!fir.char<1,?>>) -> index
+ hlfir.destroy %15 : !hlfir.expr<?x!fir.char<1,?>>
+ return %18 : index
+}
+// CHECK-LABEL: func.func @i32_length(
+// CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1>,
+// CHECK-SAME: %[[VAL_1:.*]]: i32,
+// CHECK-SAME: %[[VAL_2:.*]]: i32) -> index {
+// CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_2]] : (i32) -> index
+// CHECK: return %[[VAL_14]] : index
+// CHECK: }
More information about the flang-commits
mailing list