[flang-commits] [flang] 9daec09 - [fir] Avoid slice with substr in fir.array_load, fir.array_coor and fir.array_merge_store
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Tue Oct 26 12:44:38 PDT 2021
Author: Valentin Clement
Date: 2021-10-26T21:44:25+02:00
New Revision: 9daec0955132e6e33b086edc63c6f3e0f5712323
URL: https://github.com/llvm/llvm-project/commit/9daec0955132e6e33b086edc63c6f3e0f5712323
DIFF: https://github.com/llvm/llvm-project/commit/9daec0955132e6e33b086edc63c6f3e0f5712323.diff
LOG: [fir] Avoid slice with substr in fir.array_load, fir.array_coor and fir.array_merge_store
Substring information on slice operation has been added in D112441.
The operations fir.array_load, fir.array_coor and fir.array_merge_store can take
a slice but not with a substring. This patch add this check in their verifier.
This patch is part of the upstreaming effort from fir-dev branch.
Reviewed By: schweitz
Differential Revision: https://reviews.llvm.org/D112568
Added:
Modified:
flang/include/flang/Optimizer/Dialect/FIROps.td
flang/include/flang/Optimizer/Dialect/FIRTypes.td
flang/lib/Optimizer/Dialect/FIROps.cpp
flang/test/Fir/invalid.fir
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index f58862606deb2..6a9fbcdf28a4e 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -149,7 +149,7 @@ def fir_AllocaOp : fir_Op<"alloca", [AttrSizedOperandSegments,
CArg<"mlir::ValueRange", "{}">:$typeparams,
CArg<"mlir::ValueRange", "{}">:$shape,
CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attributes)>,
- OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName,
+ OpBuilder<(ins "mlir::Type":$inType, "llvm::StringRef":$uniqName,
CArg<"mlir::ValueRange", "{}">:$typeparams,
CArg<"mlir::ValueRange", "{}">:$shape,
CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attributes)>,
diff --git a/flang/include/flang/Optimizer/Dialect/FIRTypes.td b/flang/include/flang/Optimizer/Dialect/FIRTypes.td
index b873c72deb67b..28533f372b9c0 100644
--- a/flang/include/flang/Optimizer/Dialect/FIRTypes.td
+++ b/flang/include/flang/Optimizer/Dialect/FIRTypes.td
@@ -419,7 +419,9 @@ def fir_SequenceType : FIR_Type<"Sequence", "array"> {
bool hasConstantInterior() const;
// Is the shape of the sequence constant?
- bool hasConstantShape() const { return getConstantRows() == getDimension(); }
+ bool hasConstantShape() const {
+ return getConstantRows() == getDimension();
+ }
// Does the sequence have unknown shape? (`array<* x T>`)
bool hasUnknownShape() const { return getShape().empty(); }
diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp
index b2709c32ea411..83494d18aef5b 100644
--- a/flang/lib/Optimizer/Dialect/FIROps.cpp
+++ b/flang/lib/Optimizer/Dialect/FIROps.cpp
@@ -348,10 +348,14 @@ static mlir::LogicalResult verify(fir::ArrayCoorOp op) {
return op.emitOpError("number of indices do not match dim rank");
}
- if (auto sliceOp = op.slice())
+ if (auto sliceOp = op.slice()) {
+ if (auto sl = mlir::dyn_cast_or_null<fir::SliceOp>(sliceOp.getDefiningOp()))
+ if (!sl.substr().empty())
+ return op.emitOpError("array_coor cannot take a slice with substring");
if (auto sliceTy = sliceOp.getType().dyn_cast<fir::SliceType>())
if (sliceTy.getRank() != arrDim)
return op.emitOpError("rank of dimension in slice mismatched");
+ }
return mlir::success();
}
@@ -407,10 +411,14 @@ static mlir::LogicalResult verify(fir::ArrayLoadOp op) {
return op.emitOpError("rank of dimension mismatched");
}
- if (auto sliceOp = op.slice())
+ if (auto sliceOp = op.slice()) {
+ if (auto sl = mlir::dyn_cast_or_null<fir::SliceOp>(sliceOp.getDefiningOp()))
+ if (!sl.substr().empty())
+ return op.emitOpError("array_load cannot take a slice with substring");
if (auto sliceTy = sliceOp.getType().dyn_cast<fir::SliceType>())
if (sliceTy.getRank() != arrDim)
return op.emitOpError("rank of dimension in slice mismatched");
+ }
return mlir::success();
}
@@ -423,8 +431,11 @@ static mlir::LogicalResult verify(fir::ArrayMergeStoreOp op) {
if (!isa<ArrayLoadOp>(op.original().getDefiningOp()))
return op.emitOpError("operand #0 must be result of a fir.array_load op");
if (auto sl = op.slice()) {
- if (auto *slOp = sl.getDefiningOp()) {
- auto sliceOp = mlir::cast<fir::SliceOp>(slOp);
+ if (auto sliceOp =
+ mlir::dyn_cast_or_null<fir::SliceOp>(sl.getDefiningOp())) {
+ if (!sliceOp.substr().empty())
+ return op.emitOpError(
+ "array_merge_store cannot take a slice with substring");
if (!sliceOp.fields().empty()) {
// This is an intra-object merge, where the slice is projecting the
// subfields that are to be overwritten by the merge operation.
diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir
index ca9c3b69bd2f9..d25322245c598 100644
--- a/flang/test/Fir/invalid.fir
+++ b/flang/test/Fir/invalid.fir
@@ -616,3 +616,42 @@ func @slice_must_be_integral() {
%2 = fir.slice %1, %1, %1 : (!fir.field, !fir.field, !fir.field) -> !fir.slice<1>
return
}
+
+// -----
+
+func @array_coor_no_slice_substr(%a : !fir.ref<!fir.array<?x?xf32>>) {
+ %c1 = arith.constant 1 : index
+ %c10 = arith.constant 10 : index
+ %slice = fir.slice %c1, %c10, %c1 substr %c1, %c10 : (index, index, index, index, index) -> !fir.slice<1>
+ // expected-error at +1 {{'fir.array_coor' op array_coor cannot take a slice with substring}}
+ %p = fir.array_coor %a[%slice] %c1, %c1 : (!fir.ref<!fir.array<?x?xf32>>, !fir.slice<1>, index, index) -> !fir.ref<f32>
+ return
+}
+
+// -----
+
+func @array_coor_no_slice_substr(%a : !fir.ref<!fir.array<?x?xf32>>) {
+ %c1 = arith.constant 1 : index
+ %c10 = arith.constant 10 : index
+ %slice = fir.slice %c1, %c10, %c1 substr %c1, %c10 : (index, index, index, index, index) -> !fir.slice<1>
+ // expected-error at +1 {{'fir.array_load' op array_load cannot take a slice with substring}}
+ %v = fir.array_load %a[%slice] : (!fir.ref<!fir.array<?x?xf32>>, !fir.slice<1>) -> !fir.array<?x?xf32>
+ return
+}
+
+// -----
+
+func @array_merge_store_no_slice_substr(%arr1 : !fir.ref<!fir.array<?x?xf32>>, %m : index, %n : index, %o : index, %p : index, %f : f32) {
+ %i10 = arith.constant 10 : index
+ %j20 = arith.constant 20 : index
+ %c1 = arith.constant 1 : index
+ %c10 = arith.constant 10 : index
+ %s = fir.shape_shift %m, %n, %o, %p : (index, index, index, index) -> !fir.shapeshift<2>
+ %slice = fir.slice %c1, %c10, %c1 substr %c1, %c10 : (index, index, index, index, index) -> !fir.slice<1>
+ %av1 = fir.array_load %arr1(%s) : (!fir.ref<!fir.array<?x?xf32>>, !fir.shapeshift<2>) -> !fir.array<?x?xf32>
+ %addr, %av2 = fir.array_modify %av1, %i10, %i10 : (!fir.array<?x?xf32>, index, index) -> (!fir.ref<f32>, !fir.array<?x?xf32>)
+ fir.store %f to %addr : !fir.ref<f32>
+ // expected-error at +1 {{'fir.array_merge_store' op array_merge_store cannot take a slice with substring}}
+ fir.array_merge_store %av1, %av2 to %arr1[%slice] : !fir.array<?x?xf32>, !fir.array<?x?xf32>, !fir.ref<!fir.array<?x?xf32>>, !fir.slice<1>
+ return
+}
More information about the flang-commits
mailing list