[flang-commits] [PATCH] D129079: [flang] Avoid opaque pointer issue with character array substring addressing
Jean Perier via Phabricator via flang-commits
flang-commits at lists.llvm.org
Tue Jul 5 00:14:47 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rGb094c737cd85: [flang] Avoid opaque pointer issue with character array substring addressing (authored by jeanPerier).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129079/new/
https://reviews.llvm.org/D129079
Files:
flang/lib/Optimizer/CodeGen/CodeGen.cpp
flang/test/Fir/embox.fir
Index: flang/test/Fir/embox.fir
===================================================================
--- flang/test/Fir/embox.fir
+++ flang/test/Fir/embox.fir
@@ -75,7 +75,7 @@
%1 = fir.slice %c1, %c2, %c1, %c1, %c3, %c1 substr %c1_i64, %c2_i64 : (index, index, index, index, index, index, i64, i64) -> !fir.slice<2>
%2 = fir.embox %arg0(%0) [%1] : (!fir.ref<!fir.array<2x3x!fir.char<1,4>>>, !fir.shape<2>, !fir.slice<2>) -> !fir.box<!fir.array<?x?x!fir.char<1,?>>>
// CHECK: %[[addr:.*]] = getelementptr [3 x [2 x [4 x i8]]], ptr %[[arg0]], i64 0, i64 0, i64 0
- // CHECK: %[[substringAddr:.*]] = getelementptr {{.*}}, ptr %[[addr]], i64 0, i64 1
+ // CHECK: %[[substringAddr:.*]] = getelementptr {{.*}}, ptr %[[addr]], i64 0, i64 0, i64 0, i64 1
// CHECK: insertvalue {[[descriptorType:.*]]} { ptr undef, i64 2, i32 20180515, i8 2, i8 40, i8 0, i8 0,
// CHECK-SAME: [2 x [3 x i64]] [{{\[}}3 x i64] [i64 1, i64 2, i64 4], [3 x i64] [i64 1, i64 3, i64 8]] },
// CHECK-SAME: ptr %[[substringAddr]], 0
Index: flang/lib/Optimizer/CodeGen/CodeGen.cpp
===================================================================
--- flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -1064,6 +1064,15 @@
/*isVarArg=*/false));
}
+static unsigned getDimension(mlir::LLVM::LLVMArrayType ty) {
+ unsigned result = 1;
+ for (auto eleTy = ty.getElementType().dyn_cast<mlir::LLVM::LLVMArrayType>();
+ eleTy;
+ eleTy = eleTy.getElementType().dyn_cast<mlir::LLVM::LLVMArrayType>())
+ ++result;
+ return result;
+}
+
namespace {
/// Lower a `fir.freemem` instruction into `llvm.call @free`
struct FreeMemOpConversion : public FIROpConversion<fir::FreeMemOp> {
@@ -1383,9 +1392,15 @@
llvm::SmallVector<mlir::Value> gepOperands;
auto baseType =
base.getType().cast<mlir::LLVM::LLVMPointerType>().getElementType();
- if (baseType.isa<mlir::LLVM::LLVMArrayType>()) {
+ if (auto arrayType = baseType.dyn_cast<mlir::LLVM::LLVMArrayType>()) {
+ // FIXME: The baseType should be the array element type here, meaning
+ // there should at most be one dimension (constant length characters are
+ // lowered to LLVM as an array of length one characters.). However, using
+ // the character type in the GEP does not lead to correct GEPs when llvm
+ // opaque pointers are enabled.
auto idxTy = this->lowerTy().indexType();
- gepOperands.push_back(genConstantIndex(loc, idxTy, rewriter, 0));
+ gepOperands.append(getDimension(arrayType),
+ genConstantIndex(loc, idxTy, rewriter, 0));
gepOperands.push_back(lowerBound);
} else {
gepOperands.push_back(lowerBound);
@@ -1927,15 +1942,6 @@
}
private:
- static unsigned getDimension(mlir::LLVM::LLVMArrayType ty) {
- unsigned result = 1;
- for (auto eleTy = ty.getElementType().dyn_cast<mlir::LLVM::LLVMArrayType>();
- eleTy;
- eleTy = eleTy.getElementType().dyn_cast<mlir::LLVM::LLVMArrayType>())
- ++result;
- return result;
- }
-
static mlir::Type getArrayElementType(mlir::LLVM::LLVMArrayType ty) {
auto eleTy = ty.getElementType();
while (auto arrTy = eleTy.dyn_cast<mlir::LLVM::LLVMArrayType>())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129079.442186.patch
Type: text/x-patch
Size: 3290 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220705/4e782a31/attachment.bin>
More information about the flang-commits
mailing list