1
1
// RUN: %target-swift-frontend -Xllvm -sil-full-demangle -profile-generate -profile-coverage-mapping -emit-sorted-sil -emit-sil -module-name coverage_switch %s | %FileCheck %s
2
2
// RUN: %target-swift-frontend -profile-generate -profile-coverage-mapping -emit-ir %s
3
3
4
+ // CHECK-LABEL: sil hidden @$s15coverage_switch2f1yys5Int32VF : $@convention(thin) (Int32) -> ()
5
+ // CHECK: string_literal
6
+ // CHECK-NEXT: integer_literal $Builtin.Int64, 0
7
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 4
8
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 0
9
+ // CHECK-NEXT: int_instrprof_increment
10
+
11
+ // CHECK: integer_literal $Builtin.Int32, 1
12
+ // CHECK: cmp_eq_Int32
13
+ // CHECK: cond_br {{%[0-9]+}}, [[CASE1:bb[0-9]+]], [[NOTCASE1:bb[0-9]+]]
14
+
15
+ // CHECK: [[NOTCASE1]]
16
+ // CHECK: integer_literal $Builtin.Int32, 2
17
+ // CHECK: cmp_eq_Int32
18
+ // CHECK: cond_br {{%[0-9]+}}, [[CASE2:bb[0-9]+]], [[NOTCASE2:bb[0-9]+]]
19
+
20
+ // CHECK: [[NOTCASE2]]
21
+ // CHECK-NEXT: string_literal
22
+ // CHECK-NEXT: integer_literal $Builtin.Int64, 0
23
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 4
24
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 3
25
+ // CHECK-NEXT: int_instrprof_increment
26
+ // CHECK-NEXT: br [[DEFAULT:bb[0-9]+]]
27
+
28
+ // CHECK: [[CASE2]]
29
+ // CHECK-NEXT: string_literal
30
+ // CHECK-NEXT: integer_literal $Builtin.Int64, 0
31
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 4
32
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 2
33
+ // CHECK-NEXT: int_instrprof_increment
34
+ // CHECK-NEXT: br [[DEFAULT]]
35
+
36
+ // CHECK: [[DEFAULT]]
37
+ // CHECK: function_ref @$s15coverage_switch2f1yys5Int32VF : $@convention(thin) (Int32) -> ()
38
+
39
+ // CHECK: [[CASE1]]
40
+ // CHECK-NEXT: string_literal
41
+ // CHECK-NEXT: integer_literal $Builtin.Int64, 0
42
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 4
43
+ // CHECK-NEXT: integer_literal $Builtin.Int32, 1
44
+ // CHECK-NEXT: int_instrprof_increment
45
+
4
46
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f1
5
- func f1( _ x : Int32 ) {
6
- switch ( x) {
7
- case 1 : // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:10 : 2
47
+ func f1( _ x : Int32 ) { // CHECK-NEXT: [[@LINE]]:22 -> [[@LINE+11]]:2 : 0
48
+ switch ( x) { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:13 : 0
49
+ case 1 : // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:10 : 1
8
50
break
9
- case 2 : // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:16 : 3
51
+ case 2 : // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:16 : 2
10
52
fallthrough
11
- default : // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:14 : (3 + 4 )
53
+ default : // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:14 : (2 + 3 )
12
54
f1 ( x - 1 )
13
- } // CHECK: [[@LINE]]:4 -> [[@LINE+3]]:2 : 1
55
+ } // CHECK-NEXT : [[@LINE]]:4 -> [[@LINE+3]]:2 : ((1 + 2) + 3)
14
56
15
57
var y = x
16
- }
58
+ } // CHECK-NEXT: }
17
59
18
60
enum Algebraic {
19
61
case Type1( Int32 , Int32 )
@@ -25,41 +67,96 @@ enum Algebraic {
25
67
func nop( ) { }
26
68
27
69
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f2
28
- func f2( _ x : Algebraic ) -> Int32 {
29
- switch ( x) {
30
- case let . Type1( y, z) : // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:10 : 2
70
+ func f2( _ x : Algebraic ) -> Int32 { // CHECK-NEXT: [[@LINE]]:35 -> [[@LINE+15]]:2 : 0
71
+ switch ( x) { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:12 : 0
72
+ case let . Type1( y, z) : // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:10 : 1
31
73
nop ( )
32
- case . Type2( let b) : // CHECK: [[@LINE]]:3 -> [[@LINE+2]]:16 : 3
74
+ case . Type2( let b) : // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+2]]:16 : 2
33
75
nop ( )
34
76
fallthrough
35
- case . Type3: // CHECK: [[@LINE]]:3 -> [[@LINE+3]]:6 : (3 + 4 )
36
- if ( false ) { // CHECK: [[@LINE]]:16 -> [[@LINE+2 ]]:6 : 5
37
- fallthrough
38
- }
39
- case . Type4: // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:10 : (5 + 6 )
77
+ case . Type3: // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+3]]:6 : (2 + 3 )
78
+ if ( false ) { // CHECK-NEXT : [[@LINE]]:8 -> [[@LINE]]:15 : (2 + 3)
79
+ fallthrough // CHECK-NEXT: [[@LINE-1]]:16 -> [[@LINE+1]]:6 : 4
80
+ } // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE]]:6 : ((2 + 3) - 4)
81
+ case . Type4: // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:10 : (4 + 5 )
40
82
break
41
- } // CHECK: [[@LINE]]:4 -> [[@LINE+1]]:11 : 1
83
+ } // CHECK-NEXT : [[@LINE]]:4 -> [[@LINE+1]]:11 : (((1 + 2) + 3) + 5)
42
84
return 0
43
- }
85
+ } // CHECK-NEXT: }
44
86
45
87
public enum Simple {
46
88
case First, Second
47
89
}
48
90
49
91
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f3
50
- func f3( _ x : Simple ) -> Int32 {
51
- switch ( x) {
52
- case . First: // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:13 : 2
92
+ func f3( _ x : Simple ) -> Int32 { // CHECK-NEXT: [[@LINE]]:32 -> [[@LINE+9]]:2 : 0
93
+ switch ( x) { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:13 : 0
94
+ case . First: // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:13 : 1
53
95
return 1
54
- case . Second: // CHECK: [[@LINE]]:3 -> [[@LINE+1]]:10 : 3
96
+ case . Second: // CHECK-NEXT : [[@LINE]]:3 -> [[@LINE+1]]:10 : 2
55
97
break
56
- } // CHECK: [[@LINE]]:4 -> [[@LINE+2]]:11 : 1
98
+ } // CHECK: [[@LINE]]:4 -> [[@LINE+2]]:11 : 2
57
99
58
100
return 0
59
- }
101
+ } // CHECK-NEXT: }
60
102
61
103
f1 ( 3 )
62
104
f2 ( Algebraic . Type1 ( 1 , 1 ) )
63
105
f2 ( Algebraic . Type2 ( false ) )
64
106
f2 ( Algebraic . Type3)
65
107
f3 ( Simple . Second)
108
+
109
+ // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f4
110
+ func f4( _ x: Int ) throws -> Int { // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+21]]:2 : 0
111
+ y: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+18]]:4 : 0
112
+ switch x { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE]]:13 : 0
113
+ case 1 , 2 , 3 : // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:18 : 1
114
+ if . random( ) { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 1
115
+ return 5 // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 2
116
+ } // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:18 : (1 - 2)
117
+ fallthrough
118
+ case 4 : // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:8 : ((1 + 3) - 2)
119
+ if . random( ) { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : ((1 + 3) - 2)
120
+ struct E : Error { } // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+2]]:8 : 4
121
+ throw E ( )
122
+ } // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:8 : (((1 + 3) - 2) - 4)
123
+ default : // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+3]]:8 : 5
124
+ if . random( ) { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 5
125
+ break y // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 6
126
+ } // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:8 : (5 - 6)
127
+ }
128
+ f1 ( 0 ) // CHECK-NEXT: [[@LINE-1]]:6 -> [[@LINE+1]]:4 : (((((1 + 3) + 5) - 2) - 4) - 6)
129
+ }
130
+ return 1 // CHECK-NEXT: [[@LINE-1]]:4 -> [[@LINE]]:11 : ((((1 + 3) + 5) - 2) - 4)
131
+ } // CHECK-NEXT: }
132
+
133
+ // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f5
134
+ func f5( _ x: Simple ) -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+7]]:2 : 0
135
+ switch x { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:11 : 0
136
+ case . First: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:13 : 1
137
+ return 0
138
+ case . Second: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:13 : 2
139
+ return 1
140
+ }
141
+ } // CHECK-NEXT: }
142
+
143
+ // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f6
144
+ func f6( _ x: Simple ) -> Int { // CHECK-NEXT: [[@LINE]]:29 -> [[@LINE+5]]:2 : 0
145
+ switch x { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:11 : 0
146
+ case . First: return 0 // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE]]:25 : 1
147
+ case . Second: return 1 // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE]]:25 : 2
148
+ }
149
+ } // CHECK-NEXT: }
150
+
151
+ // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f7
152
+ func f7( ) -> Int { // CHECK-NEXT: [[@LINE]]:18 -> [[@LINE+10]]:2 : 0
153
+ switch . random( ) ? Simple . First : . Second {
154
+ // CHECK-NEXT: [[@LINE-1]]:10 -> [[@LINE-1]]:44 : 0
155
+ // CHECK-NEXT: [[@LINE-2]]:22 -> [[@LINE-2]]:34 : 1
156
+ // CHECK-NEXT: [[@LINE-3]]:37 -> [[@LINE-3]]:44 : (0 - 1)
157
+ case . First: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:13 : 2
158
+ return 0
159
+ case . Second: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:13 : 3
160
+ return 1
161
+ }
162
+ } // CHECK-NEXT: }
0 commit comments