Skip to content

Commit 8d48733

Browse files
committed
Basic block predecessors in mir textual representation
Similiar to how LLVM-IR includes `; preds = %bb1` in its textual output. Makes it a bit nicer to read mir dumps.
1 parent e08d569 commit 8d48733

File tree

307 files changed

+1390
-1353
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

307 files changed

+1390
-1353
lines changed

compiler/rustc_middle/src/mir/pretty.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,9 @@ where
351351

352352
// Basic block label at the top.
353353
let cleanup_text = if data.is_cleanup { " (cleanup)" } else { "" };
354-
writeln!(w, "{}{:?}{}: {{", INDENT, block, cleanup_text)?;
354+
let indented_body = format!("{}{:?}{}: {{", INDENT, block, cleanup_text);
355+
let predecessors = &body.predecessors()[block];
356+
writeln!(w, "{:A$} // preds: {:?}", indented_body, predecessors, A = ALIGN)?;
355357

356358
// List of statements in the middle.
357359
let mut current_location = Location { block, statement_index: 0 };

src/test/mir-opt/76803_regression.encode.SimplifyBranchSame.diff

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@
66
let mut _0: Type; // return place in scope 0 at $DIR/76803_regression.rs:10:27: 10:31
77
let mut _2: isize; // in scope 0 at $DIR/76803_regression.rs:12:9: 12:16
88

9-
bb0: {
9+
bb0: { // preds: []
1010
_2 = discriminant(_1); // scope 0 at $DIR/76803_regression.rs:11:11: 11:12
1111
switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/76803_regression.rs:11:5: 11:12
1212
}
1313

14-
bb1: {
14+
bb1: { // preds: [bb0]
1515
_0 = move _1; // scope 0 at $DIR/76803_regression.rs:13:14: 13:15
1616
goto -> bb3; // scope 0 at $DIR/76803_regression.rs:13:14: 13:15
1717
}
1818

19-
bb2: {
19+
bb2: { // preds: [bb0]
2020
discriminant(_0) = 1; // scope 0 at $DIR/76803_regression.rs:12:20: 12:27
2121
goto -> bb3; // scope 0 at $DIR/76803_regression.rs:12:20: 12:27
2222
}
2323

24-
bb3: {
24+
bb3: { // preds: [bb1, bb2]
2525
return; // scope 0 at $DIR/76803_regression.rs:15:2: 15:2
2626
}
2727
}

src/test/mir-opt/address_of.address_of_reborrow.SimplifyCfg-initial.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ fn address_of_reborrow() -> () {
125125
}
126126
}
127127

128-
bb0: {
128+
bb0: { // preds: []
129129
StorageLive(_1); // scope 0 at $DIR/address-of.rs:4:9: 4:10
130130
StorageLive(_2); // scope 0 at $DIR/address-of.rs:4:14: 4:21
131131
_2 = [const 0_i32; 10]; // scope 0 at $DIR/address-of.rs:4:14: 4:21

src/test/mir-opt/address_of.borrow_and_cast.SimplifyCfg-initial.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fn borrow_and_cast(_1: i32) -> () {
1919
}
2020
}
2121

22-
bb0: {
22+
bb0: { // preds: []
2323
StorageLive(_2); // scope 0 at $DIR/address-of.rs:42:9: 42:10
2424
StorageLive(_3); // scope 0 at $DIR/address-of.rs:42:13: 42:15
2525
_3 = &_1; // scope 0 at $DIR/address-of.rs:42:13: 42:15

src/test/mir-opt/array_index_is_temporary.main.SimplifyCfg-elaborate-drops.after.32bit.mir

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn main() -> () {
2323
}
2424
}
2525

26-
bb0: {
26+
bb0: { // preds: []
2727
StorageLive(_1); // scope 0 at $DIR/array-index-is-temporary.rs:13:9: 13:14
2828
_1 = [const 42_u32, const 43_u32, const 44_u32]; // scope 0 at $DIR/array-index-is-temporary.rs:13:17: 13:29
2929
StorageLive(_2); // scope 1 at $DIR/array-index-is-temporary.rs:14:9: 14:14
@@ -42,7 +42,7 @@ fn main() -> () {
4242
// + literal: Const { ty: unsafe fn(*mut usize) -> u32 {foo}, val: Value(Scalar(<ZST>)) }
4343
}
4444

45-
bb1: {
45+
bb1: { // preds: [bb0]
4646
StorageDead(_6); // scope 4 at $DIR/array-index-is-temporary.rs:16:26: 16:27
4747
StorageLive(_7); // scope 3 at $DIR/array-index-is-temporary.rs:16:7: 16:8
4848
_7 = _2; // scope 3 at $DIR/array-index-is-temporary.rs:16:7: 16:8
@@ -51,7 +51,7 @@ fn main() -> () {
5151
assert(move _9, "index out of bounds: the length is {} but the index is {}", move _8, _7) -> bb2; // scope 3 at $DIR/array-index-is-temporary.rs:16:5: 16:9
5252
}
5353

54-
bb2: {
54+
bb2: { // preds: [bb1]
5555
_1[_7] = move _5; // scope 3 at $DIR/array-index-is-temporary.rs:16:5: 16:29
5656
StorageDead(_5); // scope 3 at $DIR/array-index-is-temporary.rs:16:28: 16:29
5757
StorageDead(_7); // scope 3 at $DIR/array-index-is-temporary.rs:16:29: 16:30

src/test/mir-opt/array_index_is_temporary.main.SimplifyCfg-elaborate-drops.after.64bit.mir

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn main() -> () {
2323
}
2424
}
2525

26-
bb0: {
26+
bb0: { // preds: []
2727
StorageLive(_1); // scope 0 at $DIR/array-index-is-temporary.rs:13:9: 13:14
2828
_1 = [const 42_u32, const 43_u32, const 44_u32]; // scope 0 at $DIR/array-index-is-temporary.rs:13:17: 13:29
2929
StorageLive(_2); // scope 1 at $DIR/array-index-is-temporary.rs:14:9: 14:14
@@ -42,7 +42,7 @@ fn main() -> () {
4242
// + literal: Const { ty: unsafe fn(*mut usize) -> u32 {foo}, val: Value(Scalar(<ZST>)) }
4343
}
4444

45-
bb1: {
45+
bb1: { // preds: [bb0]
4646
StorageDead(_6); // scope 4 at $DIR/array-index-is-temporary.rs:16:26: 16:27
4747
StorageLive(_7); // scope 3 at $DIR/array-index-is-temporary.rs:16:7: 16:8
4848
_7 = _2; // scope 3 at $DIR/array-index-is-temporary.rs:16:7: 16:8
@@ -51,7 +51,7 @@ fn main() -> () {
5151
assert(move _9, "index out of bounds: the length is {} but the index is {}", move _8, _7) -> bb2; // scope 3 at $DIR/array-index-is-temporary.rs:16:5: 16:9
5252
}
5353

54-
bb2: {
54+
bb2: { // preds: [bb1]
5555
_1[_7] = move _5; // scope 3 at $DIR/array-index-is-temporary.rs:16:5: 16:29
5656
StorageDead(_5); // scope 3 at $DIR/array-index-is-temporary.rs:16:28: 16:29
5757
StorageDead(_7); // scope 3 at $DIR/array-index-is-temporary.rs:16:29: 16:30

src/test/mir-opt/basic_assignment.main.SimplifyCfg-initial.after.mir

+9-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fn main() -> () {
2525
}
2626
}
2727

28-
bb0: {
28+
bb0: { // preds: []
2929
StorageLive(_1); // scope 0 at $DIR/basic_assignment.rs:11:9: 11:17
3030
_1 = const false; // scope 0 at $DIR/basic_assignment.rs:11:20: 11:25
3131
FakeRead(ForLet(None), _1); // scope 0 at $DIR/basic_assignment.rs:11:9: 11:17
@@ -44,41 +44,41 @@ fn main() -> () {
4444
replace(_5 <- move _6) -> [return: bb1, unwind: bb5]; // scope 4 at $DIR/basic_assignment.rs:23:5: 23:11
4545
}
4646

47-
bb1: {
47+
bb1: { // preds: [bb0]
4848
drop(_6) -> [return: bb2, unwind: bb6]; // scope 4 at $DIR/basic_assignment.rs:23:19: 23:20
4949
}
5050

51-
bb2: {
51+
bb2: { // preds: [bb1]
5252
StorageDead(_6); // scope 4 at $DIR/basic_assignment.rs:23:19: 23:20
5353
_0 = const (); // scope 0 at $DIR/basic_assignment.rs:10:11: 24:2
5454
drop(_5) -> [return: bb3, unwind: bb7]; // scope 3 at $DIR/basic_assignment.rs:24:1: 24:2
5555
}
5656

57-
bb3: {
57+
bb3: { // preds: [bb2]
5858
StorageDead(_5); // scope 3 at $DIR/basic_assignment.rs:24:1: 24:2
5959
drop(_4) -> [return: bb4, unwind: bb8]; // scope 2 at $DIR/basic_assignment.rs:24:1: 24:2
6060
}
6161

62-
bb4: {
62+
bb4: { // preds: [bb3]
6363
StorageDead(_4); // scope 2 at $DIR/basic_assignment.rs:24:1: 24:2
6464
StorageDead(_2); // scope 1 at $DIR/basic_assignment.rs:24:1: 24:2
6565
StorageDead(_1); // scope 0 at $DIR/basic_assignment.rs:24:1: 24:2
6666
return; // scope 0 at $DIR/basic_assignment.rs:24:2: 24:2
6767
}
6868

69-
bb5 (cleanup): {
69+
bb5 (cleanup): { // preds: [bb0]
7070
drop(_6) -> bb6; // scope 4 at $DIR/basic_assignment.rs:23:19: 23:20
7171
}
7272

73-
bb6 (cleanup): {
73+
bb6 (cleanup): { // preds: [bb1, bb5]
7474
drop(_5) -> bb7; // scope 3 at $DIR/basic_assignment.rs:24:1: 24:2
7575
}
7676

77-
bb7 (cleanup): {
77+
bb7 (cleanup): { // preds: [bb2, bb6]
7878
drop(_4) -> bb8; // scope 2 at $DIR/basic_assignment.rs:24:1: 24:2
7979
}
8080

81-
bb8 (cleanup): {
81+
bb8 (cleanup): { // preds: [bb3, bb7]
8282
resume; // scope 0 at $DIR/basic_assignment.rs:10:1: 24:2
8383
}
8484
}

src/test/mir-opt/bool_compare.opt1.InstCombine.diff

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let mut _2: bool; // in scope 0 at $DIR/bool_compare.rs:3:8: 3:17
88
let mut _3: bool; // in scope 0 at $DIR/bool_compare.rs:3:8: 3:9
99

10-
bb0: {
10+
bb0: { // preds: []
1111
StorageLive(_2); // scope 0 at $DIR/bool_compare.rs:3:8: 3:17
1212
StorageLive(_3); // scope 0 at $DIR/bool_compare.rs:3:8: 3:9
1313
_3 = _1; // scope 0 at $DIR/bool_compare.rs:3:8: 3:9
@@ -17,17 +17,17 @@
1717
switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/bool_compare.rs:3:8: 3:17
1818
}
1919

20-
bb1: {
20+
bb1: { // preds: [bb0]
2121
_0 = const 0_u32; // scope 0 at $DIR/bool_compare.rs:3:20: 3:21
2222
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:3:5: 3:34
2323
}
2424

25-
bb2: {
25+
bb2: { // preds: [bb0]
2626
_0 = const 1_u32; // scope 0 at $DIR/bool_compare.rs:3:31: 3:32
2727
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:3:5: 3:34
2828
}
2929

30-
bb3: {
30+
bb3: { // preds: [bb1, bb2]
3131
StorageDead(_2); // scope 0 at $DIR/bool_compare.rs:3:33: 3:34
3232
return; // scope 0 at $DIR/bool_compare.rs:4:2: 4:2
3333
}

src/test/mir-opt/bool_compare.opt2.InstCombine.diff

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let mut _2: bool; // in scope 0 at $DIR/bool_compare.rs:8:8: 8:17
88
let mut _3: bool; // in scope 0 at $DIR/bool_compare.rs:8:16: 8:17
99

10-
bb0: {
10+
bb0: { // preds: []
1111
StorageLive(_2); // scope 0 at $DIR/bool_compare.rs:8:8: 8:17
1212
StorageLive(_3); // scope 0 at $DIR/bool_compare.rs:8:16: 8:17
1313
_3 = _1; // scope 0 at $DIR/bool_compare.rs:8:16: 8:17
@@ -17,17 +17,17 @@
1717
switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/bool_compare.rs:8:8: 8:17
1818
}
1919

20-
bb1: {
20+
bb1: { // preds: [bb0]
2121
_0 = const 0_u32; // scope 0 at $DIR/bool_compare.rs:8:20: 8:21
2222
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:8:5: 8:34
2323
}
2424

25-
bb2: {
25+
bb2: { // preds: [bb0]
2626
_0 = const 1_u32; // scope 0 at $DIR/bool_compare.rs:8:31: 8:32
2727
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:8:5: 8:34
2828
}
2929

30-
bb3: {
30+
bb3: { // preds: [bb1, bb2]
3131
StorageDead(_2); // scope 0 at $DIR/bool_compare.rs:8:33: 8:34
3232
return; // scope 0 at $DIR/bool_compare.rs:9:2: 9:2
3333
}

src/test/mir-opt/bool_compare.opt3.InstCombine.diff

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let mut _2: bool; // in scope 0 at $DIR/bool_compare.rs:13:8: 13:18
88
let mut _3: bool; // in scope 0 at $DIR/bool_compare.rs:13:8: 13:9
99

10-
bb0: {
10+
bb0: { // preds: []
1111
StorageLive(_2); // scope 0 at $DIR/bool_compare.rs:13:8: 13:18
1212
StorageLive(_3); // scope 0 at $DIR/bool_compare.rs:13:8: 13:9
1313
_3 = _1; // scope 0 at $DIR/bool_compare.rs:13:8: 13:9
@@ -17,17 +17,17 @@
1717
switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/bool_compare.rs:13:8: 13:18
1818
}
1919

20-
bb1: {
20+
bb1: { // preds: [bb0]
2121
_0 = const 0_u32; // scope 0 at $DIR/bool_compare.rs:13:21: 13:22
2222
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:13:5: 13:35
2323
}
2424

25-
bb2: {
25+
bb2: { // preds: [bb0]
2626
_0 = const 1_u32; // scope 0 at $DIR/bool_compare.rs:13:32: 13:33
2727
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:13:5: 13:35
2828
}
2929

30-
bb3: {
30+
bb3: { // preds: [bb1, bb2]
3131
StorageDead(_2); // scope 0 at $DIR/bool_compare.rs:13:34: 13:35
3232
return; // scope 0 at $DIR/bool_compare.rs:14:2: 14:2
3333
}

src/test/mir-opt/bool_compare.opt4.InstCombine.diff

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let mut _2: bool; // in scope 0 at $DIR/bool_compare.rs:18:8: 18:18
88
let mut _3: bool; // in scope 0 at $DIR/bool_compare.rs:18:17: 18:18
99

10-
bb0: {
10+
bb0: { // preds: []
1111
StorageLive(_2); // scope 0 at $DIR/bool_compare.rs:18:8: 18:18
1212
StorageLive(_3); // scope 0 at $DIR/bool_compare.rs:18:17: 18:18
1313
_3 = _1; // scope 0 at $DIR/bool_compare.rs:18:17: 18:18
@@ -17,17 +17,17 @@
1717
switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/bool_compare.rs:18:8: 18:18
1818
}
1919

20-
bb1: {
20+
bb1: { // preds: [bb0]
2121
_0 = const 0_u32; // scope 0 at $DIR/bool_compare.rs:18:21: 18:22
2222
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:18:5: 18:35
2323
}
2424

25-
bb2: {
25+
bb2: { // preds: [bb0]
2626
_0 = const 1_u32; // scope 0 at $DIR/bool_compare.rs:18:32: 18:33
2727
goto -> bb3; // scope 0 at $DIR/bool_compare.rs:18:5: 18:35
2828
}
2929

30-
bb3: {
30+
bb3: { // preds: [bb1, bb2]
3131
StorageDead(_2); // scope 0 at $DIR/bool_compare.rs:18:34: 18:35
3232
return; // scope 0 at $DIR/bool_compare.rs:19:2: 19:2
3333
}

src/test/mir-opt/box_expr.main.ElaborateDrops.before.mir

+10-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn main() -> () {
1515
scope 2 {
1616
}
1717

18-
bb0: {
18+
bb0: { // preds: []
1919
StorageLive(_1); // scope 0 at $DIR/box_expr.rs:7:9: 7:10
2020
_2 = SizeOf(S); // scope 2 at $DIR/box_expr.rs:7:13: 7:25
2121
_3 = AlignOf(S); // scope 2 at $DIR/box_expr.rs:7:13: 7:25
@@ -25,7 +25,7 @@ fn main() -> () {
2525
// + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(Scalar(<ZST>)) }
2626
}
2727

28-
bb1: {
28+
bb1: { // preds: [bb0]
2929
StorageLive(_5); // scope 0 at $DIR/box_expr.rs:7:13: 7:25
3030
_5 = ShallowInitBox(move _4, S); // scope 0 at $DIR/box_expr.rs:7:13: 7:25
3131
(*_5) = S::new() -> [return: bb2, unwind: bb8]; // scope 0 at $DIR/box_expr.rs:7:17: 7:25
@@ -34,12 +34,12 @@ fn main() -> () {
3434
// + literal: Const { ty: fn() -> S {S::new}, val: Value(Scalar(<ZST>)) }
3535
}
3636

37-
bb2: {
37+
bb2: { // preds: [bb1]
3838
_1 = move _5; // scope 0 at $DIR/box_expr.rs:7:13: 7:25
3939
drop(_5) -> bb3; // scope 0 at $DIR/box_expr.rs:7:24: 7:25
4040
}
4141

42-
bb3: {
42+
bb3: { // preds: [bb2]
4343
StorageDead(_5); // scope 0 at $DIR/box_expr.rs:7:24: 7:25
4444
StorageLive(_6); // scope 1 at $DIR/box_expr.rs:8:5: 8:12
4545
StorageLive(_7); // scope 1 at $DIR/box_expr.rs:8:10: 8:11
@@ -50,31 +50,31 @@ fn main() -> () {
5050
// + literal: Const { ty: fn(std::boxed::Box<S>) {std::mem::drop::<std::boxed::Box<S>>}, val: Value(Scalar(<ZST>)) }
5151
}
5252

53-
bb4: {
53+
bb4: { // preds: [bb3]
5454
StorageDead(_7); // scope 1 at $DIR/box_expr.rs:8:11: 8:12
5555
StorageDead(_6); // scope 1 at $DIR/box_expr.rs:8:12: 8:13
5656
_0 = const (); // scope 0 at $DIR/box_expr.rs:6:11: 9:2
5757
drop(_1) -> bb5; // scope 0 at $DIR/box_expr.rs:9:1: 9:2
5858
}
5959

60-
bb5: {
60+
bb5: { // preds: [bb4]
6161
StorageDead(_1); // scope 0 at $DIR/box_expr.rs:9:1: 9:2
6262
return; // scope 0 at $DIR/box_expr.rs:9:2: 9:2
6363
}
6464

65-
bb6 (cleanup): {
65+
bb6 (cleanup): { // preds: [bb3]
6666
drop(_7) -> bb7; // scope 1 at $DIR/box_expr.rs:8:11: 8:12
6767
}
6868

69-
bb7 (cleanup): {
69+
bb7 (cleanup): { // preds: [bb6]
7070
drop(_1) -> bb9; // scope 0 at $DIR/box_expr.rs:9:1: 9:2
7171
}
7272

73-
bb8 (cleanup): {
73+
bb8 (cleanup): { // preds: [bb1]
7474
drop(_5) -> bb9; // scope 0 at $DIR/box_expr.rs:7:24: 7:25
7575
}
7676

77-
bb9 (cleanup): {
77+
bb9 (cleanup): { // preds: [bb7, bb8]
7878
resume; // scope 0 at $DIR/box_expr.rs:6:1: 9:2
7979
}
8080
}

src/test/mir-opt/byte_slice.main.SimplifyCfg-elaborate-drops.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ fn main() -> () {
1111
}
1212
}
1313

14-
bb0: {
14+
bb0: { // preds: []
1515
StorageLive(_1); // scope 0 at $DIR/byte_slice.rs:5:9: 5:10
1616
_1 = const b"foo"; // scope 0 at $DIR/byte_slice.rs:5:13: 5:19
1717
// ty::Const

src/test/mir-opt/combine_array_len.norm2.InstCombine.32bit.diff

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
}
2626
}
2727

28-
bb0: {
28+
bb0: { // preds: []
2929
StorageLive(_2); // scope 0 at $DIR/combine_array_len.rs:5:9: 5:10
3030
StorageLive(_3); // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16
3131
_3 = const 0_usize; // scope 0 at $DIR/combine_array_len.rs:5:15: 5:16
@@ -35,7 +35,7 @@
3535
assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> bb1; // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17
3636
}
3737

38-
bb1: {
38+
bb1: { // preds: [bb0]
3939
_2 = _1[_3]; // scope 0 at $DIR/combine_array_len.rs:5:13: 5:17
4040
StorageDead(_3); // scope 0 at $DIR/combine_array_len.rs:5:17: 5:18
4141
StorageLive(_6); // scope 1 at $DIR/combine_array_len.rs:6:9: 6:10
@@ -47,7 +47,7 @@
4747
assert(move _9, "index out of bounds: the length is {} but the index is {}", move _8, _7) -> bb2; // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17
4848
}
4949

50-
bb2: {
50+
bb2: { // preds: [bb1]
5151
_6 = _1[_7]; // scope 1 at $DIR/combine_array_len.rs:6:13: 6:17
5252
StorageDead(_7); // scope 1 at $DIR/combine_array_len.rs:6:17: 6:18
5353
StorageLive(_10); // scope 2 at $DIR/combine_array_len.rs:7:5: 7:8

0 commit comments

Comments
 (0)