File: computed-goto.f90

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (154 lines) | stat: -rw-r--r-- 5,898 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
! RUN: bbc -emit-fir -o - %s | FileCheck %s

! CHECK-LABEL: func @_QPm
function m(index)
    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m"
    ! CHECK:   %[[V_1:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
    ! CHECK:   fir.select %[[V_1]] : i32 [1, ^bb6, 2, ^bb5, 3, ^bb4, 4, ^bb3, 5, ^bb2, unit, ^bb1]
    ! CHECK: ^bb1:  // pred: ^bb0
    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb2:  // pred: ^bb0
    ! CHECK:   fir.store %c1{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb3:  // pred: ^bb0
    ! CHECK:   fir.store %c3{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb4:  // pred: ^bb0
    ! CHECK:   fir.store %c5{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb5:  // pred: ^bb0
    ! CHECK:   fir.store %c7{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb6:  // pred: ^bb0
    ! CHECK:   fir.store %c9{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb7:  // 6 preds: ^bb1, ^bb2, ^bb3, ^bb4, ^bb5, ^bb6
    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
    ! CHECK:   return %[[V_2]] : i32
    goto (9,7,5,3,1) index ! + 1
    m = 0; return
1   m = 1; return
3   m = 3; return
5   m = 5; return
7   m = 7; return
9   m = 9; return
end

! CHECK-LABEL: func @_QPm1
function m1(index)
    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m1"
    ! CHECK:   %[[V_1:[0-9]+]] = fir.call @llvm.stacksave()
    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
    ! CHECK:   %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32
    ! CHECK:   cf.cond_br %[[V_3]], ^bb1, ^bb2
    ! CHECK: ^bb1:  // pred: ^bb0
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   cf.br ^bb3
    ! CHECK: ^bb2:  // pred: ^bb0
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb4
    ! CHECK: ^bb3:  // pred: ^bb1
    ! CHECK:   fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb4
    ! CHECK: ^bb4:  // 2 preds: ^bb2, ^bb3
    ! CHECK:   %[[V_4:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
    ! CHECK:   return %[[V_4]] : i32
    block
      goto (10) index
    end block
    m1 =  0; return
10  m1 = 10; return
end

! CHECK-LABEL: func @_QPm2
function m2(index)
    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m2"
    ! CHECK:   %[[V_1:[0-9]+]] = fir.call @llvm.stacksave()
    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
    ! CHECK:   %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32
    ! CHECK:   cf.cond_br %[[V_3]], ^bb1, ^bb2
    ! CHECK: ^bb1:  // pred: ^bb0
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   cf.br ^bb5
    ! CHECK: ^bb2:  // pred: ^bb0
    ! CHECK:   %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32
    ! CHECK:   cf.cond_br %[[V_4]], ^bb3, ^bb4
    ! CHECK: ^bb3:  // pred: ^bb2
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   cf.br ^bb6
    ! CHECK: ^bb4:  // pred: ^bb2
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb5:  // pred: ^bb1
    ! CHECK:   fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb6:  // pred: ^bb3
    ! CHECK:   fir.store %c20{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb7:  // 3 preds: ^bb4, ^bb5, ^bb6
    ! CHECK:   %[[V_5:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
    ! CHECK:   return %[[V_5]] : i32
    block
      goto (10,20) index
    end block
    m2 =  0; return
10  m2 = 10; return
20  m2 = 20; return
end

! CHECK-LABEL: func @_QPm3
function m3(index)
    ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m3"
    ! CHECK:   %[[V_1:[0-9]+]] = fir.call @llvm.stacksave()
    ! CHECK:   %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref<i32>
    ! CHECK:   %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32
    ! CHECK:   cf.cond_br %[[V_3]], ^bb1, ^bb2
    ! CHECK: ^bb1:  // pred: ^bb0
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   cf.br ^bb7
    ! CHECK: ^bb2:  // pred: ^bb0
    ! CHECK:   %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32
    ! CHECK:   cf.cond_br %[[V_4]], ^bb3, ^bb4
    ! CHECK: ^bb3:  // pred: ^bb2
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   cf.br ^bb8
    ! CHECK: ^bb4:  // pred: ^bb2
    ! CHECK:   %[[V_5:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c3{{.*}} : i32
    ! CHECK:   cf.cond_br %[[V_5]], ^bb5, ^bb6
    ! CHECK: ^bb5:  // pred: ^bb4
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   cf.br ^bb9
    ! CHECK: ^bb6:  // pred: ^bb4
    ! CHECK:   fir.call @llvm.stackrestore(%[[V_1]])
    ! CHECK:   fir.store %c0{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb10
    ! CHECK: ^bb7:  // pred: ^bb1
    ! CHECK:   fir.store %c10{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb10
    ! CHECK: ^bb8:  // pred: ^bb3
    ! CHECK:   fir.store %c20{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb10
    ! CHECK: ^bb9:  // pred: ^bb5
    ! CHECK:   fir.store %c30{{.*}} to %[[V_0]] : !fir.ref<i32>
    ! CHECK:   cf.br ^bb10
    ! CHECK: ^bb10:  // 4 preds: ^bb6, ^bb7, ^bb8, ^bb9
    ! CHECK:   %[[V_6:[0-9]+]] = fir.load %[[V_0]] : !fir.ref<i32>
    ! CHECK:   return %[[V_6]] : i32
    block
      goto (10,20,30) index
    end block
    m3 =  0; return
10  m3 = 10; return
20  m3 = 20; return
30  m3 = 30; return
end

program cg
  print*, m(-3), m(1), m(2), m(3), m(4), m(5), m(9) ! 0 9 7 5 3 1 0
  print*, m1(0), m1(1), m1(2) ! 0 10 0
  print*, m2(0), m2(1), m2(2), m2(3) ! 0 10 20 0
  print*, m3(0), m3(1), m3(2), m3(3), m3(4) ! 0 10 20 30 0
end