Files
clang-p2996/flang/test/Lower/unstructured-control-flow.f90
Krzysztof Parzyszek c1b5b7c19b [flang][Lower] Emit exiting branches from within constructs (#92455)
When lowering IfConstruct, CaseConstruct, and SelectTypeConstruct, emit
branches that exit the construct in each block that is still
unterminated after the FIR has been generated in it.

The same thing may be needed for SelectRankConstruct, once it's
supported.

This eliminates the need for inserting branches in `genFIR(Evaluation)`.

Follow-up to PR https://github.com/llvm/llvm-project/pull/91614.
2024-05-21 08:19:54 -05:00

32 lines
1.1 KiB
Fortran

!RUN: bbc -emit-hlfir -o - %s | FileCheck %s
!CHECK-LABEL: func.func @_QPunstructured1
!CHECK: fir.select %{{[0-9]+}} : i32 [{{.*}}, ^bb[[BLOCK3:[0-9]+]], {{.*}}, ^bb[[BLOCK4:[0-9]+]], {{.*}}, ^bb[[BLOCK5:[0-9]+]], {{.*}}, ^bb[[BLOCK1:[0-9]+]]]
!CHECK: ^bb[[BLOCK1]]:
!CHECK: cf.cond_br %{{[0-9]+}}, ^bb[[BLOCK2:[0-9]+]], ^bb[[BLOCK4]]
!CHECK: ^bb[[BLOCK2]]:
!CHECK: fir.if
!CHECK: cf.br ^bb[[BLOCK3]]
!CHECK: ^bb[[BLOCK3]]:
!CHECK: %[[C10:[a-z0-9_]+]] = arith.constant 10 : i32
!CHECK: arith.addi {{.*}}, %[[C10]]
!CHECK: cf.br ^bb[[BLOCK4]]
!CHECK: ^bb[[BLOCK4]]:
!CHECK: %[[C100:[a-z0-9_]+]] = arith.constant 100 : i32
!CHECK: arith.addi {{.*}}, %[[C100]]
!CHECK: cf.br ^bb[[BLOCK5]]
!CHECK: ^bb[[BLOCK5]]:
!CHECK: %[[C1000:[a-z0-9_]+]] = arith.constant 1000 : i32
!CHECK: arith.addi {{.*}}, %[[C1000]]
!CHECK: return
subroutine unstructured1(j, k)
goto (11, 22, 33) j-3 ! computed goto - an expression outside [1,3] is a nop
if (j == 2) goto 22
if (j == 1) goto 11
k = k + 1
11 k = k + 10
22 k = k + 100
33 k = k + 1000
end