]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/match_false_edges.rs
Rollup merge of #68818 - matthiaskrgr:misc_perf, r=Mark-Simulacrum
[rust.git] / src / test / mir-opt / match_false_edges.rs
1 // compile-flags: -Z borrowck=mir
2
3 fn guard() -> bool {
4     false
5 }
6
7 fn guard2(_: i32) -> bool {
8     true
9 }
10
11 // no_mangle to make sure this gets instantiated even in an executable.
12 #[no_mangle]
13 pub fn full_tested_match() {
14     let _ = match Some(42) {
15         Some(x) if guard() => (1, x),
16         Some(y) => (2, y),
17         None => (3, 3),
18     };
19 }
20
21 // no_mangle to make sure this gets instantiated even in an executable.
22 #[no_mangle]
23 pub fn full_tested_match2() {
24     let _ = match Some(42) {
25         Some(x) if guard() => (1, x),
26         None => (3, 3),
27         Some(y) => (2, y),
28     };
29 }
30
31 fn main() {
32     let _ = match Some(1) {
33         Some(_w) if guard() => 1,
34         _x => 2,
35         Some(y) if guard2(y) => 3,
36         _z => 4,
37     };
38 }
39
40 // END RUST SOURCE
41 //
42 // START rustc.full_tested_match.PromoteTemps.after.mir
43 //  bb0: {
44 //      ...
45 //      _2 = std::option::Option::<i32>::Some(const 42i32,);
46 //      FakeRead(ForMatchedPlace, _2);
47 //      _3 = discriminant(_2);
48 //      switchInt(move _3) -> [0isize: bb2, 1isize: bb3, otherwise: bb5];
49 //  }
50 //  bb1 (cleanup): {
51 //      resume;
52 //  }
53 //  bb2: {  // pre_binding3 and arm3
54 //      _1 = (const 3i32, const 3i32);
55 //      goto -> bb11;
56 //  }
57 //  bb3: {
58 //      falseEdges -> [real: bb6, imaginary: bb4]; //pre_binding1
59 //  }
60 //  bb4: {
61 //      falseEdges -> [real: bb10, imaginary: bb2]; //pre_binding2
62 //  }
63 //  bb5: {
64 //      unreachable;
65 //  }
66 //  bb6: { // binding1 and guard
67 //      StorageLive(_6);
68 //      _11 = const full_tested_match::promoted[0];
69 //      _6 = &(((*_11) as Some).0: i32);
70 //      _4 = &shallow _2;
71 //      StorageLive(_7);
72 //      _7 = const guard() -> [return: bb7, unwind: bb1];
73 //  }
74 //  bb7: { // end of guard
75 //      switchInt(move _7) -> [false: bb9, otherwise: bb8];
76 //  }
77 //  bb8: { // arm1
78 //      StorageDead(_7);
79 //      FakeRead(ForMatchGuard, _4);
80 //      FakeRead(ForGuardBinding, _6);
81 //      StorageLive(_5);
82 //      _5 = ((_2 as Some).0: i32);
83 //      StorageLive(_8);
84 //      _8 = _5;
85 //      _1 = (const 1i32, move _8);
86 //      StorageDead(_8);
87 //      StorageDead(_5);
88 //      StorageDead(_6);
89 //      goto -> bb11;
90 //  }
91 //  bb9: { // to pre_binding2
92 //      StorageDead(_7);
93 //      StorageDead(_6);
94 //      goto -> bb4;
95 //  }
96 //  bb10: { // arm2
97 //      StorageLive(_9);
98 //      _9 = ((_2 as Some).0: i32);
99 //      StorageLive(_10);
100 //      _10 = _9;
101 //      _1 = (const 2i32, move _10);
102 //      StorageDead(_10);
103 //      StorageDead(_9);
104 //      goto -> bb11;
105 //  }
106 //  bb11: {
107 //      StorageDead(_2);
108 //      StorageDead(_1);
109 //      _0 = ();
110 //      return;
111 //  }
112 // END rustc.full_tested_match.PromoteTemps.after.mir
113 //
114 // START rustc.full_tested_match2.PromoteTemps.before.mir
115 //  bb0: {
116 //      ...
117 //      _2 = std::option::Option::<i32>::Some(const 42i32,);
118 //      FakeRead(ForMatchedPlace, _2);
119 //      _3 = discriminant(_2);
120 //      switchInt(move _3) -> [0isize: bb2, 1isize: bb3, otherwise: bb5];
121 //  }
122 //  bb1 (cleanup): {
123 //      resume;
124 //  }
125 //  bb2: { // pre_binding2
126 //      falseEdges -> [real: bb10, imaginary: bb4];
127 //  }
128 //  bb3: { // pre_binding1
129 //      falseEdges -> [real: bb6, imaginary: bb2];
130 //  }
131 //  bb4: { // binding3 and arm3
132 //      StorageLive(_9);
133 //      _9 = ((_2 as Some).0: i32);
134 //      StorageLive(_10);
135 //      _10 = _9;
136 //      _1 = (const 2i32, move _10);
137 //      StorageDead(_10);
138 //      StorageDead(_9);
139 //      goto -> bb11;
140 //  }
141 //  bb5: {
142 //      unreachable;
143 //  }
144 //  bb6: {
145 //      StorageLive(_6);
146 //      _6 = &((_2 as Some).0: i32);
147 //      _4 = &shallow _2;
148 //      StorageLive(_7);
149 //      _7 = const guard() -> [return: bb7, unwind: bb1];
150 //  }
151 //  bb7: { // end of guard
152 //      switchInt(move _7) -> [false: bb9, otherwise: bb8];
153 //  }
154 //  bb8: {
155 //      StorageDead(_7);
156 //      FakeRead(ForMatchGuard, _4);
157 //      FakeRead(ForGuardBinding, _6);
158 //      StorageLive(_5);
159 //      _5 = ((_2 as Some).0: i32);
160 //      StorageLive(_8);
161 //      _8 = _5;
162 //      _1 = (const 1i32, move _8);
163 //      StorageDead(_8);
164 //      StorageDead(_5);
165 //      StorageDead(_6);
166 //      goto -> bb11;
167 //  }
168 //  bb9: { // to pre_binding3 (can skip 2 since this is `Some`)
169 //      StorageDead(_7);
170 //      StorageDead(_6);
171 //      falseEdges -> [real: bb4, imaginary: bb2];
172 //  }
173 //  bb10: { // arm2
174 //      _1 = (const 3i32, const 3i32);
175 //      goto -> bb11;
176 //  }
177 //  bb11: {
178 //      StorageDead(_2);
179 //      StorageDead(_1);
180 //      _0 = ();
181 //      return;
182 //  }
183 // END rustc.full_tested_match2.PromoteTemps.before.mir
184 //
185 // START rustc.main.PromoteTemps.before.mir
186 //  bb0: {
187 //     ...
188 //      _2 = std::option::Option::<i32>::Some(const 1i32,);
189 //      FakeRead(ForMatchedPlace, _2);
190 //      _4 = discriminant(_2);
191 //      switchInt(move _4) -> [1isize: bb3, otherwise: bb2];
192 //  }
193 //  bb1 (cleanup): {
194 //      resume;
195 //  }
196 //  bb2: {
197 //      falseEdges -> [real: bb10, imaginary: bb5];
198 //  }
199 //  bb3: {
200 //      falseEdges -> [real: bb6, imaginary: bb2];
201 //  }
202 //  bb4: {
203 //      StorageLive(_14);
204 //      _14 = _2;
205 //      _1 = const 4i32;
206 //      StorageDead(_14);
207 //      goto -> bb15;
208 //  }
209 //  bb5: {
210 //      falseEdges -> [real: bb11, imaginary: bb4];
211 //  }
212 //  bb6: { //end of guard1
213 //      StorageLive(_7);
214 //      _7 = &((_2 as Some).0: i32);
215 //      _5 = &shallow _2;
216 //      StorageLive(_8);
217 //      _8 = const guard() -> [return: bb7, unwind: bb1];
218 //  }
219 //  bb7: {
220 //      switchInt(move _8) -> [false: bb9, otherwise: bb8];
221 //  }
222 //  bb8: {
223 //      StorageDead(_8);
224 //      FakeRead(ForMatchGuard, _5);
225 //      FakeRead(ForGuardBinding, _7);
226 //      StorageLive(_6);
227 //      _6 = ((_2 as Some).0: i32);
228 //      _1 = const 1i32;
229 //      StorageDead(_6);
230 //      StorageDead(_7);
231 //      goto -> bb15;
232 //  }
233 //  bb9: {
234 //      StorageDead(_8);
235 //      StorageDead(_7);
236 //      falseEdges -> [real: bb2, imaginary: bb2];
237 //  }
238 //  bb10: {  // binding2 & arm2
239 //      StorageLive(_9);
240 //      _9 = _2;
241 //      _1 = const 2i32;
242 //      StorageDead(_9);
243 //      goto -> bb15;
244 //  }
245 //  bb11: { // binding3: Some(y) if guard2(y)
246 //      StorageLive(_11);
247 //      _11 = &((_2 as Some).0: i32);
248 //      _5 = &shallow _2;
249 //      StorageLive(_12);
250 //      StorageLive(_13);
251 //      _13 = (*_11);
252 //      _12 = const guard2(move _13) -> [return: bb12, unwind: bb1];
253 //  }
254 //  bb12: { // end of guard2
255 //      StorageDead(_13);
256 //      switchInt(move _12) -> [false: bb14, otherwise: bb13];
257 //  }
258 //  bb13: { // binding4 & arm4
259 //      StorageDead(_12);
260 //      FakeRead(ForMatchGuard, _5);
261 //      FakeRead(ForGuardBinding, _11);
262 //      StorageLive(_10);
263 //      _10 = ((_2 as Some).0: i32);
264 //      _1 = const 3i32;
265 //      StorageDead(_10);
266 //      StorageDead(_11);
267 //      goto -> bb15;
268 //  }
269 //  bb14: {
270 //      StorageDead(_12);
271 //      StorageDead(_11);
272 //      falseEdges -> [real: bb4, imaginary: bb4];
273 //  }
274 //  bb15: {
275 //      StorageDead(_2);
276 //      StorageDead(_1);
277 //      _0 = ();
278 //      return;
279 //  }
280 // END rustc.main.PromoteTemps.before.mir