Skip to content

Commit 6ab44fb

Browse files
committed
Add test for jump-threading assume.
1 parent 8d2a617 commit 6ab44fb

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
- // MIR for `assume` before JumpThreading
2+
+ // MIR for `assume` after JumpThreading
3+
4+
fn assume(_1: u8, _2: bool) -> u8 {
5+
let mut _0: u8;
6+
7+
bb0: {
8+
switchInt(_1) -> [7: bb1, otherwise: bb2];
9+
}
10+
11+
bb1: {
12+
assume(_2);
13+
- goto -> bb3;
14+
+ goto -> bb6;
15+
}
16+
17+
bb2: {
18+
goto -> bb3;
19+
}
20+
21+
bb3: {
22+
switchInt(_2) -> [0: bb4, otherwise: bb5];
23+
}
24+
25+
bb4: {
26+
_0 = const 4_u8;
27+
return;
28+
}
29+
30+
bb5: {
31+
_0 = const 5_u8;
32+
return;
33+
+ }
34+
+
35+
+ bb6: {
36+
+ goto -> bb5;
37+
}
38+
}
39+
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
- // MIR for `assume` before JumpThreading
2+
+ // MIR for `assume` after JumpThreading
3+
4+
fn assume(_1: u8, _2: bool) -> u8 {
5+
let mut _0: u8;
6+
7+
bb0: {
8+
switchInt(_1) -> [7: bb1, otherwise: bb2];
9+
}
10+
11+
bb1: {
12+
assume(_2);
13+
- goto -> bb3;
14+
+ goto -> bb6;
15+
}
16+
17+
bb2: {
18+
goto -> bb3;
19+
}
20+
21+
bb3: {
22+
switchInt(_2) -> [0: bb4, otherwise: bb5];
23+
}
24+
25+
bb4: {
26+
_0 = const 4_u8;
27+
return;
28+
}
29+
30+
bb5: {
31+
_0 = const 5_u8;
32+
return;
33+
+ }
34+
+
35+
+ bb6: {
36+
+ goto -> bb5;
37+
}
38+
}
39+

tests/mir-opt/jump_threading.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,52 @@ fn disappearing_bb(x: u8) -> u8 {
453453
)
454454
}
455455

456+
/// Verify that we can leverage the existence of an `Assume` terminator.
457+
#[custom_mir(dialect = "runtime", phase = "post-cleanup")]
458+
fn assume(a: u8, b: bool) -> u8 {
459+
// CHECK-LABEL: fn assume(
460+
mir!(
461+
{
462+
// CHECK: bb0: {
463+
// CHECK-NEXT: switchInt(_1) -> [7: bb1, otherwise: bb2]
464+
match a { 7 => bb1, _ => bb2 }
465+
}
466+
bb1 = {
467+
// CHECK: bb1: {
468+
// CHECK-NEXT: assume(_2);
469+
// CHECK-NEXT: goto -> bb6;
470+
Assume(b);
471+
Goto(bb3)
472+
}
473+
bb2 = {
474+
// CHECK: bb2: {
475+
// CHECK-NEXT: goto -> bb3;
476+
Goto(bb3)
477+
}
478+
bb3 = {
479+
// CHECK: bb3: {
480+
// CHECK-NEXT: switchInt(_2) -> [0: bb4, otherwise: bb5];
481+
match b { false => bb4, _ => bb5 }
482+
}
483+
bb4 = {
484+
// CHECK: bb4: {
485+
// CHECK-NEXT: _0 = const 4_u8;
486+
// CHECK-NEXT: return;
487+
RET = 4;
488+
Return()
489+
}
490+
bb5 = {
491+
// CHECK: bb5: {
492+
// CHECK-NEXT: _0 = const 5_u8;
493+
// CHECK-NEXT: return;
494+
RET = 5;
495+
Return()
496+
}
497+
// CHECK: bb6: {
498+
// CHECK-NEXT: goto -> bb5;
499+
)
500+
}
501+
456502
fn main() {
457503
too_complex(Ok(0));
458504
identity(Ok(0));
@@ -464,6 +510,7 @@ fn main() {
464510
mutable_ref();
465511
renumbered_bb(true);
466512
disappearing_bb(7);
513+
assume(7, false);
467514
}
468515

469516
// EMIT_MIR jump_threading.too_complex.JumpThreading.diff
@@ -476,3 +523,4 @@ fn main() {
476523
// EMIT_MIR jump_threading.mutable_ref.JumpThreading.diff
477524
// EMIT_MIR jump_threading.renumbered_bb.JumpThreading.diff
478525
// EMIT_MIR jump_threading.disappearing_bb.JumpThreading.diff
526+
// EMIT_MIR jump_threading.assume.JumpThreading.diff

0 commit comments

Comments
 (0)