Skip to content

Commit 1e88f13

Browse files
committed
Stop allowing Indirect(..) values to be propagated
Closes #72679 Closes #72372 Closes #72285
1 parent 20abc70 commit 1e88f13

File tree

4 files changed

+73
-83
lines changed

4 files changed

+73
-83
lines changed

src/librustc_mir/transform/const_prop.rs

-1
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,6 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
707707
ScalarMaybeUninit::Scalar(l),
708708
ScalarMaybeUninit::Scalar(r),
709709
)) => l.is_bits() && r.is_bits(),
710-
interpret::Operand::Indirect(_) if mir_opt_level >= 2 => true,
711710
_ => false,
712711
}
713712
}

src/test/mir-opt/const_prop/discriminant.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// compile-flags: -O
22

3+
// FIXME(wesleywiser): Ideally, we could const-prop away all of this and just be left with
4+
// `let x = 42` but that doesn't work because const-prop doesn't support `Operand::Indirect`
5+
// and `InterpCx::eval_place()` always forces an allocation which creates the `Indirect`.
6+
// Fixing either of those will allow us to const-prop this away.
7+
38
// EMIT_MIR_FOR_EACH_BIT_WIDTH
49
// EMIT_MIR rustc.main.ConstProp.diff
510
fn main() {

src/test/mir-opt/const_prop/discriminant/32bit/rustc.main.ConstProp.diff

+34-41
Original file line numberDiff line numberDiff line change
@@ -2,100 +2,93 @@
22
+ // MIR for `main` after ConstProp
33

44
fn main() -> () {
5-
let mut _0: (); // return place in scope 0 at $DIR/discriminant.rs:5:11: 5:11
6-
let _1: i32; // in scope 0 at $DIR/discriminant.rs:6:9: 6:10
7-
let mut _2: i32; // in scope 0 at $DIR/discriminant.rs:6:13: 6:64
8-
let mut _3: std::option::Option<bool>; // in scope 0 at $DIR/discriminant.rs:6:34: 6:44
9-
let mut _4: isize; // in scope 0 at $DIR/discriminant.rs:6:21: 6:31
5+
let mut _0: (); // return place in scope 0 at $DIR/discriminant.rs:10:11: 10:11
6+
let _1: i32; // in scope 0 at $DIR/discriminant.rs:11:9: 11:10
7+
let mut _2: i32; // in scope 0 at $DIR/discriminant.rs:11:13: 11:64
8+
let mut _3: std::option::Option<bool>; // in scope 0 at $DIR/discriminant.rs:11:34: 11:44
9+
let mut _4: isize; // in scope 0 at $DIR/discriminant.rs:11:21: 11:31
1010
scope 1 {
11-
debug x => _1; // in scope 1 at $DIR/discriminant.rs:6:9: 6:10
11+
debug x => _1; // in scope 1 at $DIR/discriminant.rs:11:9: 11:10
1212
}
1313

1414
bb0: {
15-
StorageLive(_1); // scope 0 at $DIR/discriminant.rs:6:9: 6:10
16-
StorageLive(_2); // scope 0 at $DIR/discriminant.rs:6:13: 6:64
17-
StorageLive(_3); // scope 0 at $DIR/discriminant.rs:6:34: 6:44
18-
- _3 = std::option::Option::<bool>::Some(const true); // scope 0 at $DIR/discriminant.rs:6:34: 6:44
19-
+ _3 = const std::option::Option::<bool>::Some(true); // scope 0 at $DIR/discriminant.rs:6:34: 6:44
15+
StorageLive(_1); // scope 0 at $DIR/discriminant.rs:11:9: 11:10
16+
StorageLive(_2); // scope 0 at $DIR/discriminant.rs:11:13: 11:64
17+
StorageLive(_3); // scope 0 at $DIR/discriminant.rs:11:34: 11:44
18+
- _3 = std::option::Option::<bool>::Some(const true); // scope 0 at $DIR/discriminant.rs:11:34: 11:44
19+
+ _3 = const std::option::Option::<bool>::Some(true); // scope 0 at $DIR/discriminant.rs:11:34: 11:44
2020
// ty::Const
2121
- // + ty: bool
2222
+ // + ty: std::option::Option<bool>
2323
// + val: Value(Scalar(0x01))
2424
// mir::Constant
25-
- // + span: $DIR/discriminant.rs:6:39: 6:43
25+
- // + span: $DIR/discriminant.rs:11:39: 11:43
2626
- // + literal: Const { ty: bool, val: Value(Scalar(0x01)) }
27-
- _4 = discriminant(_3); // scope 0 at $DIR/discriminant.rs:6:21: 6:31
28-
- switchInt(move _4) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:6:21: 6:31
29-
+ // + span: $DIR/discriminant.rs:6:34: 6:44
27+
- _4 = discriminant(_3); // scope 0 at $DIR/discriminant.rs:11:21: 11:31
28+
- switchInt(move _4) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31
29+
+ // + span: $DIR/discriminant.rs:11:34: 11:44
3030
+ // + literal: Const { ty: std::option::Option<bool>, val: Value(Scalar(0x01)) }
31-
+ _4 = const 1isize; // scope 0 at $DIR/discriminant.rs:6:21: 6:31
31+
+ _4 = const 1isize; // scope 0 at $DIR/discriminant.rs:11:21: 11:31
3232
+ // ty::Const
3333
+ // + ty: isize
3434
+ // + val: Value(Scalar(0x00000001))
3535
+ // mir::Constant
36-
+ // + span: $DIR/discriminant.rs:6:21: 6:31
36+
+ // + span: $DIR/discriminant.rs:11:21: 11:31
3737
+ // + literal: Const { ty: isize, val: Value(Scalar(0x00000001)) }
38-
+ switchInt(const 1isize) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:6:21: 6:31
38+
+ switchInt(const 1isize) -> [1isize: bb2, otherwise: bb1]; // scope 0 at $DIR/discriminant.rs:11:21: 11:31
3939
+ // ty::Const
4040
+ // + ty: isize
4141
+ // + val: Value(Scalar(0x00000001))
4242
+ // mir::Constant
43-
+ // + span: $DIR/discriminant.rs:6:21: 6:31
43+
+ // + span: $DIR/discriminant.rs:11:21: 11:31
4444
+ // + literal: Const { ty: isize, val: Value(Scalar(0x00000001)) }
4545
}
4646

4747
bb1: {
48-
_2 = const 10i32; // scope 0 at $DIR/discriminant.rs:6:59: 6:61
48+
_2 = const 10i32; // scope 0 at $DIR/discriminant.rs:11:59: 11:61
4949
// ty::Const
5050
// + ty: i32
5151
// + val: Value(Scalar(0x0000000a))
5252
// mir::Constant
53-
// + span: $DIR/discriminant.rs:6:59: 6:61
53+
// + span: $DIR/discriminant.rs:11:59: 11:61
5454
// + literal: Const { ty: i32, val: Value(Scalar(0x0000000a)) }
55-
goto -> bb4; // scope 0 at $DIR/discriminant.rs:6:13: 6:64
55+
goto -> bb4; // scope 0 at $DIR/discriminant.rs:11:13: 11:64
5656
}
5757

5858
bb2: {
59-
- switchInt(((_3 as Some).0: bool)) -> [false: bb1, otherwise: bb3]; // scope 0 at $DIR/discriminant.rs:6:26: 6:30
60-
+ switchInt(const true) -> [false: bb1, otherwise: bb3]; // scope 0 at $DIR/discriminant.rs:6:26: 6:30
61-
+ // ty::Const
62-
+ // + ty: bool
63-
+ // + val: Value(Scalar(0x01))
64-
+ // mir::Constant
65-
+ // + span: $DIR/discriminant.rs:6:26: 6:30
66-
+ // + literal: Const { ty: bool, val: Value(Scalar(0x01)) }
59+
switchInt(((_3 as Some).0: bool)) -> [false: bb1, otherwise: bb3]; // scope 0 at $DIR/discriminant.rs:11:26: 11:30
6760
}
6861

6962
bb3: {
70-
_2 = const 42i32; // scope 0 at $DIR/discriminant.rs:6:47: 6:49
63+
_2 = const 42i32; // scope 0 at $DIR/discriminant.rs:11:47: 11:49
7164
// ty::Const
7265
// + ty: i32
7366
// + val: Value(Scalar(0x0000002a))
7467
// mir::Constant
75-
// + span: $DIR/discriminant.rs:6:47: 6:49
68+
// + span: $DIR/discriminant.rs:11:47: 11:49
7669
// + literal: Const { ty: i32, val: Value(Scalar(0x0000002a)) }
77-
goto -> bb4; // scope 0 at $DIR/discriminant.rs:6:13: 6:64
70+
goto -> bb4; // scope 0 at $DIR/discriminant.rs:11:13: 11:64
7871
}
7972

8073
bb4: {
81-
_1 = Add(move _2, const 0i32); // scope 0 at $DIR/discriminant.rs:6:13: 6:68
74+
_1 = Add(move _2, const 0i32); // scope 0 at $DIR/discriminant.rs:11:13: 11:68
8275
// ty::Const
8376
// + ty: i32
8477
// + val: Value(Scalar(0x00000000))
8578
// mir::Constant
86-
// + span: $DIR/discriminant.rs:6:67: 6:68
79+
// + span: $DIR/discriminant.rs:11:67: 11:68
8780
// + literal: Const { ty: i32, val: Value(Scalar(0x00000000)) }
88-
StorageDead(_2); // scope 0 at $DIR/discriminant.rs:6:67: 6:68
89-
StorageDead(_3); // scope 0 at $DIR/discriminant.rs:6:68: 6:69
90-
_0 = const (); // scope 0 at $DIR/discriminant.rs:5:11: 7:2
81+
StorageDead(_2); // scope 0 at $DIR/discriminant.rs:11:67: 11:68
82+
StorageDead(_3); // scope 0 at $DIR/discriminant.rs:11:68: 11:69
83+
_0 = const (); // scope 0 at $DIR/discriminant.rs:10:11: 12:2
9184
// ty::Const
9285
// + ty: ()
9386
// + val: Value(Scalar(<ZST>))
9487
// mir::Constant
95-
// + span: $DIR/discriminant.rs:5:11: 7:2
88+
// + span: $DIR/discriminant.rs:10:11: 12:2
9689
// + literal: Const { ty: (), val: Value(Scalar(<ZST>)) }
97-
StorageDead(_1); // scope 0 at $DIR/discriminant.rs:7:1: 7:2
98-
return; // scope 0 at $DIR/discriminant.rs:7:2: 7:2
90+
StorageDead(_1); // scope 0 at $DIR/discriminant.rs:12:1: 12:2
91+
return; // scope 0 at $DIR/discriminant.rs:12:2: 12:2
9992
}
10093
}
10194

0 commit comments

Comments
 (0)