Skip to content

Commit

Permalink
[fir] Restrict array type on fir.insert_on_range
Browse files Browse the repository at this point in the history
Sequence type had no restriction on the insert_on_range operation.
This patch adds a restriction for the type to have constant shape
and size.

Reviewed By: mehdi_amini

Differential Revision: https://reviews.llvm.org/D113092
  • Loading branch information
clementval committed Nov 4, 2021
1 parent 629b40d commit c86b450
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
3 changes: 2 additions & 1 deletion flang/include/flang/Optimizer/Dialect/FIROps.td
Expand Up @@ -1978,7 +1978,8 @@ def fir_InsertOnRangeOp : fir_OneResultOp<"insert_on_range", [NoSideEffect]> {
let summary = "insert sub-value into a range on an existing sequence";

let description = [{
Insert copies of a value into an entity with an array type.
Insert copies of a value into an entity with an array type of constant shape
and size.
Returns a new ssa value with the same type as the original entity.
The values are inserted at a contiguous range of indices in Fortran
row-to-column element order as specified by lower and upper bound
Expand Down
2 changes: 2 additions & 0 deletions flang/lib/Optimizer/Dialect/FIROps.cpp
Expand Up @@ -1387,6 +1387,8 @@ void fir::FieldIndexOp::build(mlir::OpBuilder &builder,

/// Range bounds must be nonnegative, and the range must not be empty.
static mlir::LogicalResult verify(fir::InsertOnRangeOp op) {
if (fir::hasDynamicSize(op.seq().getType()))
return op.emitOpError("must have constant shape and size");
if (op.coor().size() < 2 || op.coor().size() % 2 != 0)
return op.emitOpError("has uneven number of values in ranges");
bool rangeIsKnownToBeNonempty = false;
Expand Down
20 changes: 20 additions & 0 deletions flang/test/Fir/invalid.fir
Expand Up @@ -464,6 +464,26 @@ fir.global internal @_QEmultiarray : !fir.array<32x32xi32> {

// -----

fir.global internal @_QEmultiarray : !fir.array<?xi32> {
%c0_i32 = arith.constant 1 : i32
%0 = fir.undefined !fir.array<?xi32>
// expected-error@+1 {{'fir.insert_on_range' op must have constant shape and size}}
%2 = fir.insert_on_range %0, %c0_i32, [0 : index, 10 : index] : (!fir.array<?xi32>, i32) -> !fir.array<?xi32>
fir.has_value %2 : !fir.array<?xi32>
}

// -----

fir.global internal @_QEmultiarray : !fir.array<*:i32> {
%c0_i32 = arith.constant 1 : i32
%0 = fir.undefined !fir.array<*:i32>
// expected-error@+1 {{'fir.insert_on_range' op must have constant shape and size}}
%2 = fir.insert_on_range %0, %c0_i32, [0 : index, 10 : index] : (!fir.array<*:i32>, i32) -> !fir.array<*:i32>
fir.has_value %2 : !fir.array<*:i32>
}

// -----

func @bad_save_result(%buffer : !fir.ref<!fir.array<?xf64>>, %n :index) {
%res = fir.call @array_func() : () -> !fir.array<?xf32>
%shape = fir.shape %n : (index) -> !fir.shape<1>
Expand Down

0 comments on commit c86b450

Please sign in to comment.