================
@@ -4563,27 +4563,43 @@ def CIR_ArrayCtor : CIR_Op<"array.ctor"> {
operation has one region, with one single block. The block has an
incoming argument for the current array element to initialize.
- Example:
+ When `num_elements` is absent, `addr` must be a pointer to a fixed-size
+ CIR array type and the element count is derived from that array type.
+
+ When `num_elements` is present, `addr` is a pointer to the first element
+ and `num_elements` provides the runtime element count (for example `new
+ T[n]`).
+
+ Examples:
```mlir
cir.array.ctor(%0 : !cir.ptr<!cir.array<!rec_S x 42>>) {
^bb0(%arg0: !cir.ptr<!rec_S>):
cir.call @some_ctor(%arg0) : (!cir.ptr<!rec_S>) -> ()
cir.yield
}
+
+ cir.array.ctor(%ptr, %n : !cir.ptr<!rec_S>, !u64i) {
+ ^bb0(%arg0: !cir.ptr<!rec_S>):
+ cir.call @some_ctor(%arg0) : (!cir.ptr<!rec_S>) -> ()
+ cir.yield
+ }
```
}];
let arguments = (ins
- Arg<CIR_PtrToArray, "array address", [MemWrite, MemRead]>:$addr
+ Arg<CIR_AnyPtrType, "array or element address", [MemWrite, MemRead]>:$addr,
+ Optional<CIR_AnyIntType>:$num_elements
);
let regions = (region SizedRegion<1>:$body);
let assemblyFormat = [{
- $addr `:` qualified(type($addr)) $body attr-dict
+ $addr (`,` $num_elements^)? `:` qualified(type($addr))
+ (`,` type($num_elements)^)? $body attr-dict
}];
let builders = [
+ // Static form: addr is ptr<array<T x N>>, no num_elements.
----------------
erichkeane wrote:
Can we either assert this is the case, or add this to the verifier?
https://github.com/llvm/llvm-project/pull/190656
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits