155 lines · plain
1! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s2 3! CHECK-LABEL: func @_QPm4function m(index)5 ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m"6 ! CHECK: %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>7 ! CHECK: fir.select %[[V_1]] : i32 [1, ^bb6, 2, ^bb5, 3, ^bb4, 4, ^bb3, 5, ^bb2, unit, ^bb1]8 ! CHECK: ^bb1: // pred: ^bb09 ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>10 ! CHECK: cf.br ^bb711 ! CHECK: ^bb2: // pred: ^bb012 ! CHECK: fir.store %c1{{.*}} to %[[V_0]] : !fir.ref<i32>13 ! CHECK: cf.br ^bb714 ! CHECK: ^bb3: // pred: ^bb015 ! CHECK: fir.store %c3{{.*}} to %[[V_0]] : !fir.ref<i32>16 ! CHECK: cf.br ^bb717 ! CHECK: ^bb4: // pred: ^bb018 ! CHECK: fir.store %c5{{.*}} to %[[V_0]] : !fir.ref<i32>19 ! CHECK: cf.br ^bb720 ! CHECK: ^bb5: // pred: ^bb021 ! CHECK: fir.store %c7{{.*}} to %[[V_0]] : !fir.ref<i32>22 ! CHECK: cf.br ^bb723 ! CHECK: ^bb6: // pred: ^bb024 ! CHECK: fir.store %c9{{.*}} to %[[V_0]] : !fir.ref<i32>25 ! CHECK: cf.br ^bb726 ! CHECK: ^bb7: // 6 preds: ^bb1, ^bb2, ^bb3, ^bb4, ^bb5, ^bb627 ! CHECK: %[[V_2:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>28 ! CHECK: return %[[V_2]] : i3229 goto (9,7,5,3,1) index ! + 130 m = 0; return311 m = 1; return323 m = 3; return335 m = 5; return347 m = 7; return359 m = 9; return36end37 38! CHECK-LABEL: func @_QPm139function m1(index)40 ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m1"41 ! CHECK: %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr42 ! CHECK: %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>43 ! CHECK: %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i3244 ! CHECK: cf.cond_br %[[V_3]], ^bb1, ^bb245 ! CHECK: ^bb1: // pred: ^bb046 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr47 ! CHECK: cf.br ^bb348 ! CHECK: ^bb2: // pred: ^bb049 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr50 ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>51 ! CHECK: cf.br ^bb452 ! CHECK: ^bb3: // pred: ^bb153 ! CHECK: fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>54 ! CHECK: cf.br ^bb455 ! CHECK: ^bb4: // 2 preds: ^bb2, ^bb356 ! CHECK: %[[V_4:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>57 ! CHECK: return %[[V_4]] : i3258 block59 goto (10) index60 end block61 m1 = 0; return6210 m1 = 10; return63end64 65! CHECK-LABEL: func @_QPm266function m2(index)67 ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m2"68 ! CHECK: %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr69 ! CHECK: %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>70 ! CHECK: %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i3271 ! CHECK: cf.cond_br %[[V_3]], ^bb1, ^bb272 ! CHECK: ^bb1: // pred: ^bb073 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr74 ! CHECK: cf.br ^bb575 ! CHECK: ^bb2: // pred: ^bb076 ! CHECK: %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i3277 ! CHECK: cf.cond_br %[[V_4]], ^bb3, ^bb478 ! CHECK: ^bb3: // pred: ^bb279 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr80 ! CHECK: cf.br ^bb681 ! CHECK: ^bb4: // pred: ^bb282 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr83 ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>84 ! CHECK: cf.br ^bb785 ! CHECK: ^bb5: // pred: ^bb186 ! CHECK: fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>87 ! CHECK: cf.br ^bb788 ! CHECK: ^bb6: // pred: ^bb389 ! CHECK: fir.store %c20{{.*}} to %[[V_0]] : !fir.ref<i32>90 ! CHECK: cf.br ^bb791 ! CHECK: ^bb7: // 3 preds: ^bb4, ^bb5, ^bb692 ! CHECK: %[[V_5:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>93 ! CHECK: return %[[V_5]] : i3294 block95 goto (10,20) index96 end block97 m2 = 0; return9810 m2 = 10; return9920 m2 = 20; return100end101 102! CHECK-LABEL: func @_QPm3103function m3(index)104 ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m3"105 ! CHECK: %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr106 ! CHECK: %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>107 ! CHECK: %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32108 ! CHECK: cf.cond_br %[[V_3]], ^bb1, ^bb2109 ! CHECK: ^bb1: // pred: ^bb0110 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr111 ! CHECK: cf.br ^bb7112 ! CHECK: ^bb2: // pred: ^bb0113 ! CHECK: %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32114 ! CHECK: cf.cond_br %[[V_4]], ^bb3, ^bb4115 ! CHECK: ^bb3: // pred: ^bb2116 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr117 ! CHECK: cf.br ^bb8118 ! CHECK: ^bb4: // pred: ^bb2119 ! CHECK: %[[V_5:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c3{{.*}} : i32120 ! CHECK: cf.cond_br %[[V_5]], ^bb5, ^bb6121 ! CHECK: ^bb5: // pred: ^bb4122 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr123 ! CHECK: cf.br ^bb9124 ! CHECK: ^bb6: // pred: ^bb4125 ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr126 ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>127 ! CHECK: cf.br ^bb10128 ! CHECK: ^bb7: // pred: ^bb1129 ! CHECK: fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>130 ! CHECK: cf.br ^bb10131 ! CHECK: ^bb8: // pred: ^bb3132 ! CHECK: fir.store %c20{{.*}} to %[[V_0]] : !fir.ref<i32>133 ! CHECK: cf.br ^bb10134 ! CHECK: ^bb9: // pred: ^bb5135 ! CHECK: fir.store %c30{{.*}} to %[[V_0]] : !fir.ref<i32>136 ! CHECK: cf.br ^bb10137 ! CHECK: ^bb10: // 4 preds: ^bb6, ^bb7, ^bb8, ^bb9138 ! CHECK: %[[V_6:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>139 ! CHECK: return %[[V_6]] : i32140 block141 goto (10,20,30) index142 end block143 m3 = 0; return14410 m3 = 10; return14520 m3 = 20; return14630 m3 = 30; return147end148 149program cg150 print*, m(-3), m(1), m(2), m(3), m(4), m(5), m(9) ! 0 9 7 5 3 1 0151 print*, m1(0), m1(1), m1(2) ! 0 10 0152 print*, m2(0), m2(1), m2(2), m2(3) ! 0 10 20 0153 print*, m3(0), m3(1), m3(2), m3(3), m3(4) ! 0 10 20 30 0154end155