Add hlfir.designate operation definition. This is the HLFIR building
blocks to represent Fortran designator. An hlfir.designator is a
Fortran "part-ref" and an optional susbstring or part ref.
See the operation added description for more detail, and
https://github.com/llvm/llvm-project/blob/main/flang/docs/HighLevelFIR.md
for the rational of this operation.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
Things build OK and generally look good, but when I run tests, I get failures in the tests for .../HLFIR/designate.fir and .../HLFIR/invalid.fir. Here's the relevant excerpts from the log file:
******************** TEST 'Flang :: HLFIR/designate.fir' FAILED ******************** Script: -- : 'RUN: at line 3'; fir-opt /local/home/psteinfeld/main/designate/flang/test/HLFIR/designate.fir | fir-opt | /local/home/psteinfeld/main/designate/build/bin/FileCheck /local/home/psteinfeld/main/designate/flang/test/HLFIR/designate.fir -- Exit Code: 1 Command Output (stderr): -- /local/home/psteinfeld/main/designate/flang/test/HLFIR/designate.fir:68:8: error: 'hlfir.designate' op result type rank is not consistent with operands, expected rank 21867 %0 = hlfir.designate %arg0 substr %c3, %c4 typeparams %c2: (!fir.boxchar<1>, index, index, index) -> !fir.boxchar<1> ^ /local/home/psteinfeld/main/designate/flang/test/HLFIR/designate.fir:68:8: note: see current operation: %3 = "hlfir.designate"(%arg0, %1, %2, %0) {is_triplet = array<i1>, operand_segment_sizes = array<i32: 1, 0, 0, 2, 0, 1>} : (!fir.boxchar<1>, index, index, index) -> !fir.boxchar<1> /local/home/psteinfeld/main/designate/flang/test/HLFIR/designate.fir:11:17: error: CHECK-LABEL: expected string not found in input // CHECK-LABEL: func.func @array_ref( ^ <stdin>:1:1: note: scanning from here module { ^ Input file: <stdin> Check file: /local/home/psteinfeld/main/designate/flang/test/HLFIR/designate.fir -dump-input=help explains the following input dump. Input was: <<<<<< 1: module { label:11 X~~~~~~~~ error: no match found 2: } label:11 ~~ 3: label:11 ~ >>>>>> -- ******************** .... ******************** TEST 'Flang :: HLFIR/invalid.fir' FAILED ******************** Script: -- : 'RUN: at line 3'; fir-opt -split-input-file -verify-diagnostics /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir -- Exit Code: 1 Command Output (stdout): -- // ----- // ----- // ----- module { func.func @bad_array_declare(%arg0: !fir.ref<!fir.array<?x?xf32>>) { %0:2 = hlfir.declare %arg0 {uniq_name = "x"} : (!fir.ref<!fir.array<?x?xf32>>) -> (!fir.box<!fir.array<?x?xf32>>, !fir.ref<!fir.array<?x?xf32>>) return } } // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- // ----- -- Command Output (stderr): -- within split at /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir:204 offset :4:8: error: unexpected error: 'hlfir.designate' op result type rank is not consistent with operands, expected rank 21981 %0 = hlfir.designate %arg0 imag: (!fir.ref<!fir.complex<4>>) -> !fir.ref<!fir.complex<4>> ^ within split at /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir:204 offset :3:6: error: expected error "'hlfir.designate' op result element type is not consistent with operands, expected '!fir.real<4>'" was not produced // expected-error@+1 {{'hlfir.designate' op result element type is not consistent with operands, expected '!fir.real<4>'}} ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ within split at /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir:211 offset :4:8: error: unexpected error: 'hlfir.designate' op result type rank is not consistent with operands, expected rank 21981 %0 = hlfir.designate %arg0 imag: (!fir.ref<!fir.box<!fir.complex<4>>>) -> !fir.ref<!fir.box<!fir.real<4>>> ^ within split at /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir:211 offset :3:6: error: expected error "'hlfir.designate' op result type must only be a box address type if it designates a component that is a fir.box or fir.class and if there are no indices, substrings, and complex part" was not produced // expected-error@+1 {{'hlfir.designate' op result type must only be a box address type if it designates a component that is a fir.box or fir.class and if there are no indices, substrings, and complex part}} ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ within split at /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir:235 offset :5:8: error: unexpected error: 'hlfir.designate' op result type rank is not consistent with operands, expected rank 21981 %0 = hlfir.designate %arg0 substr %c1, %c1: (!fir.ref<!fir.char<1,10>>, index, index) -> !fir.boxchar<1> ^ within split at /local/home/psteinfeld/main/designate/flang/test/HLFIR/invalid.fir:235 offset :4:6: error: expected error "'hlfir.designate' op must be provided one length parameter when the result is a character" was not produced // expected-error@+1 {{'hlfir.designate' op must be provided one length parameter when the result is a character}} ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ********************
flang/include/flang/Optimizer/HLFIR/HLFIRDialect.h | ||
---|---|---|
45 | Should read "If this is the type..." | |
flang/include/flang/Optimizer/HLFIR/HLFIROps.td | ||
141 | Should read "This operation represents ..." | |
142 | Should read "a substring or ..." |
Fix uninitialized variable in DesignateOp verifier and fix
a couple typos in comments and descriptions.
Thanks @PeteSteinfeld, that should be fixed now. I did not set the expected output rank to 0 when there is not component ref and the base is not an array. Serves me right for not initializing my variables.
flang/include/flang/Optimizer/HLFIR/HLFIROps.td | ||
---|---|---|
202 | Just curious if it is possible to use llvm::ArrayRef<Subscript> here. |
flang/include/flang/Optimizer/HLFIR/HLFIROps.td | ||
---|---|---|
202 | That would have been nice, but the "extraClassDeclaration" definitions are emitted after the builder declarations (I guess this could be changed by modifying MLIR tablegen processor, but I think it is not worth it just for this). |
flang/include/flang/Optimizer/HLFIR/HLFIROps.td | ||
---|---|---|
202 | I see. Thank you for checking! |
Should read "If this is the type..."