xref: /llvm-project/flang/test/Lower/computed-goto.f90 (revision 5aaf384b1614fcef5504d0b16d3e5063f72943c1)
1f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
2b914efc5SValentin Clement
3b914efc5SValentin Clement! CHECK-LABEL: func @_QPm
4b914efc5SValentin Clementfunction m(index)
52c143345SV Donaldson    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m"
62c143345SV Donaldson    ! CHECK:   %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
72c143345SV Donaldson    ! CHECK:   fir.select %[[V_1]] : i32 [1, ^bb6, 2, ^bb5, 3, ^bb4, 4, ^bb3, 5, ^bb2, unit, ^bb1]
82c143345SV Donaldson    ! CHECK: ^bb1:  // pred: ^bb0
92c143345SV Donaldson    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
102c143345SV Donaldson    ! CHECK:   cf.br ^bb7
112c143345SV Donaldson    ! CHECK: ^bb2:  // pred: ^bb0
122c143345SV Donaldson    ! CHECK:   fir.store %c1{{.*}} to %[[V_0]] : !fir.ref<i32>
132c143345SV Donaldson    ! CHECK:   cf.br ^bb7
142c143345SV Donaldson    ! CHECK: ^bb3:  // pred: ^bb0
152c143345SV Donaldson    ! CHECK:   fir.store %c3{{.*}} to %[[V_0]] : !fir.ref<i32>
162c143345SV Donaldson    ! CHECK:   cf.br ^bb7
172c143345SV Donaldson    ! CHECK: ^bb4:  // pred: ^bb0
182c143345SV Donaldson    ! CHECK:   fir.store %c5{{.*}} to %[[V_0]] : !fir.ref<i32>
192c143345SV Donaldson    ! CHECK:   cf.br ^bb7
202c143345SV Donaldson    ! CHECK: ^bb5:  // pred: ^bb0
212c143345SV Donaldson    ! CHECK:   fir.store %c7{{.*}} to %[[V_0]] : !fir.ref<i32>
222c143345SV Donaldson    ! CHECK:   cf.br ^bb7
232c143345SV Donaldson    ! CHECK: ^bb6:  // pred: ^bb0
242c143345SV Donaldson    ! CHECK:   fir.store %c9{{.*}} to %[[V_0]] : !fir.ref<i32>
252c143345SV Donaldson    ! CHECK:   cf.br ^bb7
262c143345SV Donaldson    ! CHECK: ^bb7:  // 6 preds: ^bb1, ^bb2, ^bb3, ^bb4, ^bb5, ^bb6
272c143345SV Donaldson    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
282c143345SV Donaldson    ! CHECK:   return %[[V_2]] : i32
29b914efc5SValentin Clement    goto (9,7,5,3,1) index ! + 1
30b914efc5SValentin Clement    m = 0; return
31b914efc5SValentin Clement1   m = 1; return
32b914efc5SValentin Clement3   m = 3; return
33b914efc5SValentin Clement5   m = 5; return
34b914efc5SValentin Clement7   m = 7; return
35b914efc5SValentin Clement9   m = 9; return
36b914efc5SValentin Clementend
37b914efc5SValentin Clement
382c143345SV Donaldson! CHECK-LABEL: func @_QPm1
392c143345SV Donaldsonfunction m1(index)
402c143345SV Donaldson    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m1"
41*5aaf384bSTom Eccles    ! CHECK:   %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr
422c143345SV Donaldson    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
432c143345SV Donaldson    ! CHECK:   %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32
442c143345SV Donaldson    ! CHECK:   cf.cond_br %[[V_3]], ^bb1, ^bb2
452c143345SV Donaldson    ! CHECK: ^bb1:  // pred: ^bb0
46*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
472c143345SV Donaldson    ! CHECK:   cf.br ^bb3
482c143345SV Donaldson    ! CHECK: ^bb2:  // pred: ^bb0
49*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
502c143345SV Donaldson    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
512c143345SV Donaldson    ! CHECK:   cf.br ^bb4
522c143345SV Donaldson    ! CHECK: ^bb3:  // pred: ^bb1
532c143345SV Donaldson    ! CHECK:   fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>
542c143345SV Donaldson    ! CHECK:   cf.br ^bb4
552c143345SV Donaldson    ! CHECK: ^bb4:  // 2 preds: ^bb2, ^bb3
562c143345SV Donaldson    ! CHECK:   %[[V_4:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
572c143345SV Donaldson    ! CHECK:   return %[[V_4]] : i32
582c143345SV Donaldson    block
592c143345SV Donaldson      goto (10) index
602c143345SV Donaldson    end block
612c143345SV Donaldson    m1 =  0; return
622c143345SV Donaldson10  m1 = 10; return
632c143345SV Donaldsonend
642c143345SV Donaldson
652c143345SV Donaldson! CHECK-LABEL: func @_QPm2
662c143345SV Donaldsonfunction m2(index)
672c143345SV Donaldson    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m2"
68*5aaf384bSTom Eccles    ! CHECK:   %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr
692c143345SV Donaldson    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
702c143345SV Donaldson    ! CHECK:   %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32
712c143345SV Donaldson    ! CHECK:   cf.cond_br %[[V_3]], ^bb1, ^bb2
722c143345SV Donaldson    ! CHECK: ^bb1:  // pred: ^bb0
73*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
742c143345SV Donaldson    ! CHECK:   cf.br ^bb5
752c143345SV Donaldson    ! CHECK: ^bb2:  // pred: ^bb0
762c143345SV Donaldson    ! CHECK:   %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32
772c143345SV Donaldson    ! CHECK:   cf.cond_br %[[V_4]], ^bb3, ^bb4
782c143345SV Donaldson    ! CHECK: ^bb3:  // pred: ^bb2
79*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
802c143345SV Donaldson    ! CHECK:   cf.br ^bb6
812c143345SV Donaldson    ! CHECK: ^bb4:  // pred: ^bb2
82*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
832c143345SV Donaldson    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
842c143345SV Donaldson    ! CHECK:   cf.br ^bb7
852c143345SV Donaldson    ! CHECK: ^bb5:  // pred: ^bb1
862c143345SV Donaldson    ! CHECK:   fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>
872c143345SV Donaldson    ! CHECK:   cf.br ^bb7
882c143345SV Donaldson    ! CHECK: ^bb6:  // pred: ^bb3
892c143345SV Donaldson    ! CHECK:   fir.store %c20{{.*}} to %[[V_0]] : !fir.ref<i32>
902c143345SV Donaldson    ! CHECK:   cf.br ^bb7
912c143345SV Donaldson    ! CHECK: ^bb7:  // 3 preds: ^bb4, ^bb5, ^bb6
922c143345SV Donaldson    ! CHECK:   %[[V_5:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
932c143345SV Donaldson    ! CHECK:   return %[[V_5]] : i32
942c143345SV Donaldson    block
952c143345SV Donaldson      goto (10,20) index
962c143345SV Donaldson    end block
972c143345SV Donaldson    m2 =  0; return
982c143345SV Donaldson10  m2 = 10; return
992c143345SV Donaldson20  m2 = 20; return
1002c143345SV Donaldsonend
1012c143345SV Donaldson
1022c143345SV Donaldson! CHECK-LABEL: func @_QPm3
1032c143345SV Donaldsonfunction m3(index)
1042c143345SV Donaldson    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m3"
105*5aaf384bSTom Eccles    ! CHECK:   %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr
1062c143345SV Donaldson    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
1072c143345SV Donaldson    ! CHECK:   %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32
1082c143345SV Donaldson    ! CHECK:   cf.cond_br %[[V_3]], ^bb1, ^bb2
1092c143345SV Donaldson    ! CHECK: ^bb1:  // pred: ^bb0
110*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
1112c143345SV Donaldson    ! CHECK:   cf.br ^bb7
1122c143345SV Donaldson    ! CHECK: ^bb2:  // pred: ^bb0
1132c143345SV Donaldson    ! CHECK:   %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32
1142c143345SV Donaldson    ! CHECK:   cf.cond_br %[[V_4]], ^bb3, ^bb4
1152c143345SV Donaldson    ! CHECK: ^bb3:  // pred: ^bb2
116*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
1172c143345SV Donaldson    ! CHECK:   cf.br ^bb8
1182c143345SV Donaldson    ! CHECK: ^bb4:  // pred: ^bb2
1192c143345SV Donaldson    ! CHECK:   %[[V_5:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c3{{.*}} : i32
1202c143345SV Donaldson    ! CHECK:   cf.cond_br %[[V_5]], ^bb5, ^bb6
1212c143345SV Donaldson    ! CHECK: ^bb5:  // pred: ^bb4
122*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
1232c143345SV Donaldson    ! CHECK:   cf.br ^bb9
1242c143345SV Donaldson    ! CHECK: ^bb6:  // pred: ^bb4
125*5aaf384bSTom Eccles    ! CHECK:   llvm.intr.stackrestore %[[V_1]] : !llvm.ptr
1262c143345SV Donaldson    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
1272c143345SV Donaldson    ! CHECK:   cf.br ^bb10
1282c143345SV Donaldson    ! CHECK: ^bb7:  // pred: ^bb1
1292c143345SV Donaldson    ! CHECK:   fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>
1302c143345SV Donaldson    ! CHECK:   cf.br ^bb10
1312c143345SV Donaldson    ! CHECK: ^bb8:  // pred: ^bb3
1322c143345SV Donaldson    ! CHECK:   fir.store %c20{{.*}} to %[[V_0]] : !fir.ref<i32>
1332c143345SV Donaldson    ! CHECK:   cf.br ^bb10
1342c143345SV Donaldson    ! CHECK: ^bb9:  // pred: ^bb5
1352c143345SV Donaldson    ! CHECK:   fir.store %c30{{.*}} to %[[V_0]] : !fir.ref<i32>
1362c143345SV Donaldson    ! CHECK:   cf.br ^bb10
1372c143345SV Donaldson    ! CHECK: ^bb10:  // 4 preds: ^bb6, ^bb7, ^bb8, ^bb9
1382c143345SV Donaldson    ! CHECK:   %[[V_6:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
1392c143345SV Donaldson    ! CHECK:   return %[[V_6]] : i32
1402c143345SV Donaldson    block
1412c143345SV Donaldson      goto (10,20,30) index
1422c143345SV Donaldson    end block
1432c143345SV Donaldson    m3 =  0; return
1442c143345SV Donaldson10  m3 = 10; return
1452c143345SV Donaldson20  m3 = 20; return
1462c143345SV Donaldson30  m3 = 30; return
1472c143345SV Donaldsonend
1482c143345SV Donaldson
1492c143345SV Donaldsonprogram cg
1502c143345SV Donaldson  print*, m(-3), m(1), m(2), m(3), m(4), m(5), m(9) ! 0 9 7 5 3 1 0
1512c143345SV Donaldson  print*, m1(0), m1(1), m1(2) ! 0 10 0
1522c143345SV Donaldson  print*, m2(0), m2(1), m2(2), m2(3) ! 0 10 20 0
1532c143345SV Donaldson  print*, m3(0), m3(1), m3(2), m3(3), m3(4) ! 0 10 20 30 0
154b914efc5SValentin Clementend
155