Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit caaa729

Browse files
committed
gvn: promote propagatable local arrays
1 parent db63d18 commit caaa729

File tree

4 files changed

+104
-23
lines changed

4 files changed

+104
-23
lines changed

compiler/rustc_mir_transform/src/gvn.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,24 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
406406
};
407407
let ptr_imm = Immediate::new_pointer_with_meta(data, meta, &self.ecx);
408408
ImmTy::from_immediate(ptr_imm, ty).into()
409+
} else if matches!(kind, AggregateTy::Array) {
410+
let mut mplace = None;
411+
let alloc_id = self.ecx.intern_with_temp_alloc(ty, |ecx, dest| {
412+
for (field_index, op) in fields.iter().copied().enumerate() {
413+
let field_dest = ecx.project_field(dest, field_index)?;
414+
ecx.copy_op(op, &field_dest)?;
415+
}
416+
417+
let dest = dest.assert_mem_place().map_provenance(|prov| prov.as_immutable());
418+
mplace.replace(dest);
419+
Ok(())
420+
}).ok()?;
421+
let GlobalAlloc::Memory(_alloc) = self.tcx.global_alloc(alloc_id) else {
422+
bug!()
423+
};
424+
let mplace = mplace.unwrap();
425+
debug!(?mplace);
426+
return Some(mplace.into());
409427
} else if matches!(ty.abi, Abi::Scalar(..) | Abi::ScalarPair(..)) {
410428
let dest = self.ecx.allocate(ty, MemoryKind::Stack).ok()?;
411429
let variant_dest = if let Some(variant) = variant {
@@ -1347,6 +1365,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
13471365
}
13481366
}
13491367

1368+
#[instrument(level = "trace", skip(ecx), ret)]
13501369
fn op_to_prop_const<'tcx>(
13511370
ecx: &mut InterpCx<'tcx, DummyMachine>,
13521371
op: &OpTy<'tcx>,
@@ -1444,10 +1463,6 @@ impl<'tcx> VnState<'_, 'tcx> {
14441463
}
14451464

14461465
let op = self.evaluated[index].as_ref()?;
1447-
if op.layout.is_unsized() {
1448-
// Do not attempt to propagate unsized locals.
1449-
return None;
1450-
}
14511466

14521467
let value = op_to_prop_const(&mut self.ecx, op)?;
14531468

@@ -1497,6 +1512,7 @@ impl<'tcx> MutVisitor<'tcx> for VnState<'_, 'tcx> {
14971512
.as_local()
14981513
.and_then(|local| self.locals[local])
14991514
.or_else(|| self.simplify_rvalue(rvalue, location));
1515+
debug!(?value);
15001516
let Some(value) = value else { return };
15011517

15021518
if let Some(const_) = self.try_as_constant(value) {

tests/mir-opt/const_array_locals.main.GVN.diff

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,21 @@
3737
}
3838

3939
bb0: {
40-
- StorageLive(_1);
41-
+ nop;
42-
_1 = [const 255_i32, const 105_i32, const 15_i32, const 39_i32, const 62_i32, const 251_i32, const 191_i32, const 178_i32, const 9_i32, const 4_i32, const 56_i32, const 221_i32, const 193_i32, const 164_i32, const 194_i32, const 197_i32, const 6_i32, const 243_i32, const 218_i32, const 171_i32, const 87_i32, const 247_i32, const 104_i32, const 159_i32, const 22_i32, const 157_i32, const 105_i32, const 31_i32, const 96_i32, const 173_i32, const 50_i32, const 1_i32];
40+
StorageLive(_1);
41+
- _1 = [const 255_i32, const 105_i32, const 15_i32, const 39_i32, const 62_i32, const 251_i32, const 191_i32, const 178_i32, const 9_i32, const 4_i32, const 56_i32, const 221_i32, const 193_i32, const 164_i32, const 194_i32, const 197_i32, const 6_i32, const 243_i32, const 218_i32, const 171_i32, const 87_i32, const 247_i32, const 104_i32, const 159_i32, const 22_i32, const 157_i32, const 105_i32, const 31_i32, const 96_i32, const 173_i32, const 50_i32, const 1_i32];
42+
+ _1 = const [255_i32, 105_i32, 15_i32, 39_i32, 62_i32, 251_i32, 191_i32, 178_i32, 9_i32, 4_i32, 56_i32, 221_i32, 193_i32, 164_i32, 194_i32, 197_i32, 6_i32, 243_i32, 218_i32, 171_i32, 87_i32, 247_i32, 104_i32, 159_i32, 22_i32, 157_i32, 105_i32, 31_i32, 96_i32, 173_i32, 50_i32, 1_i32];
4343
StorageLive(_2);
4444
- _2 = [const 255_i32, const 105_i32, const 15_i32, const 39_i32, const 62_i32, const 251_i32, const 191_i32, const 178_i32, const 9_i32, const 4_i32, const 56_i32, const 221_i32, const 193_i32, const 164_i32, const 194_i32, const 197_i32, const 6_i32, const 243_i32, const 218_i32, const 171_i32, const 87_i32, const 247_i32, const 104_i32, const 159_i32, const 22_i32, const 157_i32, const 105_i32, const 31_i32, const 96_i32, const 173_i32, const 50_i32, const 1_i32];
45-
+ _2 = _1;
45+
+ _2 = const [255_i32, 105_i32, 15_i32, 39_i32, 62_i32, 251_i32, 191_i32, 178_i32, 9_i32, 4_i32, 56_i32, 221_i32, 193_i32, 164_i32, 194_i32, 197_i32, 6_i32, 243_i32, 218_i32, 171_i32, 87_i32, 247_i32, 104_i32, 159_i32, 22_i32, 157_i32, 105_i32, 31_i32, 96_i32, 173_i32, 50_i32, 1_i32];
4646
StorageLive(_3);
4747
StorageLive(_4);
48-
_4 = [const 255_i32, const 105_i32, const 15_i32, const 39_i32, const 62_i32, const 251_i32, const 191_i32, const 178_i32, const 9_i32, const 4_i32, const 56_i32, const 221_i32];
48+
- _4 = [const 255_i32, const 105_i32, const 15_i32, const 39_i32, const 62_i32, const 251_i32, const 191_i32, const 178_i32, const 9_i32, const 4_i32, const 56_i32, const 221_i32];
49+
+ _4 = const [255_i32, 105_i32, 15_i32, 39_i32, 62_i32, 251_i32, 191_i32, 178_i32, 9_i32, 4_i32, 56_i32, 221_i32];
4950
StorageLive(_5);
50-
_5 = [const 193_i32, const 164_i32, const 194_i32, const 197_i32, const 6_i32, const 243_i32, const 218_i32, const 171_i32, const 87_i32, const 247_i32, const 104_i32, const 42_i32];
51-
_3 = [move _4, move _5];
51+
- _5 = [const 193_i32, const 164_i32, const 194_i32, const 197_i32, const 6_i32, const 243_i32, const 218_i32, const 171_i32, const 87_i32, const 247_i32, const 104_i32, const 42_i32];
52+
- _3 = [move _4, move _5];
53+
+ _5 = const [193_i32, 164_i32, 194_i32, 197_i32, 6_i32, 243_i32, 218_i32, 171_i32, 87_i32, 247_i32, 104_i32, 42_i32];
54+
+ _3 = [const [255_i32, 105_i32, 15_i32, 39_i32, 62_i32, 251_i32, 191_i32, 178_i32, 9_i32, 4_i32, 56_i32, 221_i32], const [193_i32, 164_i32, 194_i32, 197_i32, 6_i32, 243_i32, 218_i32, 171_i32, 87_i32, 247_i32, 104_i32, 42_i32]];
5255
StorageDead(_5);
5356
StorageDead(_4);
5457
StorageLive(_6);
@@ -60,26 +63,34 @@
6063
StorageDead(_7);
6164
StorageLive(_9);
6265
StorageLive(_10);
63-
_10 = [const 255_u16, const 105_u16, const 15_u16, const 39_u16, const 62_u16, const 251_u16, const 191_u16, const 178_u16, const 9_u16, const 4_u16, const 56_u16, const 221_u16, const 193_u16, const 164_u16, const 194_u16, const 197_u16, const 6_u16, const 243_u16, const 218_u16, const 171_u16, const 87_u16, const 247_u16, const 104_u16, const 159_u16, const 22_u16, const 157_u16, const 105_u16, const 31_u16, const 96_u16, const 173_u16, const 50_u16, const 1_u16];
64-
_9 = consume(move _10) -> [return: bb1, unwind continue];
66+
- _10 = [const 255_u16, const 105_u16, const 15_u16, const 39_u16, const 62_u16, const 251_u16, const 191_u16, const 178_u16, const 9_u16, const 4_u16, const 56_u16, const 221_u16, const 193_u16, const 164_u16, const 194_u16, const 197_u16, const 6_u16, const 243_u16, const 218_u16, const 171_u16, const 87_u16, const 247_u16, const 104_u16, const 159_u16, const 22_u16, const 157_u16, const 105_u16, const 31_u16, const 96_u16, const 173_u16, const 50_u16, const 1_u16];
67+
- _9 = consume(move _10) -> [return: bb1, unwind continue];
68+
+ _10 = const [255_u16, 105_u16, 15_u16, 39_u16, 62_u16, 251_u16, 191_u16, 178_u16, 9_u16, 4_u16, 56_u16, 221_u16, 193_u16, 164_u16, 194_u16, 197_u16, 6_u16, 243_u16, 218_u16, 171_u16, 87_u16, 247_u16, 104_u16, 159_u16, 22_u16, 157_u16, 105_u16, 31_u16, 96_u16, 173_u16, 50_u16, 1_u16];
69+
+ _9 = consume(const [255_u16, 105_u16, 15_u16, 39_u16, 62_u16, 251_u16, 191_u16, 178_u16, 9_u16, 4_u16, 56_u16, 221_u16, 193_u16, 164_u16, 194_u16, 197_u16, 6_u16, 243_u16, 218_u16, 171_u16, 87_u16, 247_u16, 104_u16, 159_u16, 22_u16, 157_u16, 105_u16, 31_u16, 96_u16, 173_u16, 50_u16, 1_u16]) -> [return: bb1, unwind continue];
6570
}
6671

6772
bb1: {
6873
StorageDead(_10);
6974
StorageDead(_9);
7075
StorageLive(_11);
7176
StorageLive(_12);
72-
_12 = [const 1f32, const 2f32, const 3f32, const 1f32, const 1f32, const 1f32, const 1f32, const 42f32];
73-
_11 = F32x8(move _12);
77+
- _12 = [const 1f32, const 2f32, const 3f32, const 1f32, const 1f32, const 1f32, const 1f32, const 42f32];
78+
- _11 = F32x8(move _12);
79+
+ _12 = const [1f32, 2f32, 3f32, 1f32, 1f32, 1f32, 1f32, 42f32];
80+
+ _11 = F32x8(const [1f32, 2f32, 3f32, 1f32, 1f32, 1f32, 1f32, 42f32]);
7481
StorageDead(_12);
7582
StorageLive(_13);
7683
StorageLive(_14);
77-
_14 = [const 1_i32, const 0_i32, const 0_i32];
84+
- _14 = [const 1_i32, const 0_i32, const 0_i32];
85+
+ _14 = const [1_i32, 0_i32, 0_i32];
7886
StorageLive(_15);
79-
_15 = [const 0_i32, const 1_i32, const 0_i32];
87+
- _15 = [const 0_i32, const 1_i32, const 0_i32];
88+
+ _15 = const [0_i32, 1_i32, 0_i32];
8089
StorageLive(_16);
81-
_16 = [const 0_i32, const 0_i32, const 1_i32];
82-
_13 = [move _14, move _15, move _16];
90+
- _16 = [const 0_i32, const 0_i32, const 1_i32];
91+
- _13 = [move _14, move _15, move _16];
92+
+ _16 = const [0_i32, 0_i32, 1_i32];
93+
+ _13 = [const [1_i32, 0_i32, 0_i32], const [0_i32, 1_i32, 0_i32], const [0_i32, 0_i32, 1_i32]];
8394
StorageDead(_16);
8495
StorageDead(_15);
8596
StorageDead(_14);
@@ -89,9 +100,55 @@
89100
StorageDead(_6);
90101
StorageDead(_3);
91102
StorageDead(_2);
92-
- StorageDead(_1);
93-
+ nop;
103+
StorageDead(_1);
94104
return;
95105
}
106+
+ }
107+
+
108+
+ ALLOC0 (size: 12, align: 4) {
109+
+ 00 00 00 00 00 00 00 00 01 00 00 00 │ ............
110+
+ }
111+
+
112+
+ ALLOC1 (size: 12, align: 4) {
113+
+ 00 00 00 00 01 00 00 00 00 00 00 00 │ ............
114+
+ }
115+
+
116+
+ ALLOC2 (size: 12, align: 4) {
117+
+ 01 00 00 00 00 00 00 00 00 00 00 00 │ ............
118+
+ }
119+
+
120+
+ ALLOC3 (size: 32, align: 4) {
121+
+ 0x00 │ 00 00 80 3f 00 00 00 40 00 00 40 40 00 00 80 3f │ ...?...@..@@...?
122+
+ 0x10 │ 00 00 80 3f 00 00 80 3f 00 00 80 3f 00 00 28 42 │ ...?...?...?..(B
123+
+ }
124+
+
125+
+ ALLOC4 (size: 64, align: 2) {
126+
+ 0x00 │ ff 00 69 00 0f 00 27 00 3e 00 fb 00 bf 00 b2 00 │ ..i...'.>.......
127+
+ 0x10 │ 09 00 04 00 38 00 dd 00 c1 00 a4 00 c2 00 c5 00 │ ....8...........
128+
+ 0x20 │ 06 00 f3 00 da 00 ab 00 57 00 f7 00 68 00 9f 00 │ ........W...h...
129+
+ 0x30 │ 16 00 9d 00 69 00 1f 00 60 00 ad 00 32 00 01 00 │ ....i...`...2...
130+
+ }
131+
+
132+
+ ALLOC5 (size: 48, align: 4) {
133+
+ 0x00 │ c1 00 00 00 a4 00 00 00 c2 00 00 00 c5 00 00 00 │ ................
134+
+ 0x10 │ 06 00 00 00 f3 00 00 00 da 00 00 00 ab 00 00 00 │ ................
135+
+ 0x20 │ 57 00 00 00 f7 00 00 00 68 00 00 00 2a 00 00 00 │ W.......h...*...
136+
+ }
137+
+
138+
+ ALLOC6 (size: 48, align: 4) {
139+
+ 0x00 │ ff 00 00 00 69 00 00 00 0f 00 00 00 27 00 00 00 │ ....i.......'...
140+
+ 0x10 │ 3e 00 00 00 fb 00 00 00 bf 00 00 00 b2 00 00 00 │ >...............
141+
+ 0x20 │ 09 00 00 00 04 00 00 00 38 00 00 00 dd 00 00 00 │ ........8.......
142+
+ }
143+
+
144+
+ ALLOC7 (size: 128, align: 4) {
145+
+ 0x00 │ ff 00 00 00 69 00 00 00 0f 00 00 00 27 00 00 00 │ ....i.......'...
146+
+ 0x10 │ 3e 00 00 00 fb 00 00 00 bf 00 00 00 b2 00 00 00 │ >...............
147+
+ 0x20 │ 09 00 00 00 04 00 00 00 38 00 00 00 dd 00 00 00 │ ........8.......
148+
+ 0x30 │ c1 00 00 00 a4 00 00 00 c2 00 00 00 c5 00 00 00 │ ................
149+
+ 0x40 │ 06 00 00 00 f3 00 00 00 da 00 00 00 ab 00 00 00 │ ................
150+
+ 0x50 │ 57 00 00 00 f7 00 00 00 68 00 00 00 9f 00 00 00 │ W.......h.......
151+
+ 0x60 │ 16 00 00 00 9d 00 00 00 69 00 00 00 1f 00 00 00 │ ........i.......
152+
+ 0x70 │ 60 00 00 00 ad 00 00 00 32 00 00 00 01 00 00 00 │ `.......2.......
96153
}
97154

tests/mir-opt/const_prop/array_index.main.GVN.64bit.panic-unwind.diff

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
bb0: {
1616
StorageLive(_1);
1717
StorageLive(_2);
18-
_2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32];
18+
- _2 = [const 0_u32, const 1_u32, const 2_u32, const 3_u32];
19+
+ _2 = const [0_u32, 1_u32, 2_u32, 3_u32];
1920
StorageLive(_3);
2021
_3 = const 2_usize;
2122
- _4 = Len(_2);
@@ -35,5 +36,9 @@
3536
StorageDead(_1);
3637
return;
3738
}
39+
+ }
40+
+
41+
+ ALLOC0 (size: 16, align: 4) {
42+
+ 00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 │ ................
3843
}
3944

tests/mir-opt/pre-codegen/optimizes_into_variable.main.GVN.64bit.panic-unwind.diff

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
+ _1 = const 4_i32;
3636
StorageLive(_3);
3737
StorageLive(_4);
38-
_4 = [const 0_i32, const 1_i32, const 2_i32, const 3_i32, const 4_i32, const 5_i32];
38+
- _4 = [const 0_i32, const 1_i32, const 2_i32, const 3_i32, const 4_i32, const 5_i32];
39+
+ _4 = const [0_i32, 1_i32, 2_i32, 3_i32, 4_i32, 5_i32];
3940
StorageLive(_5);
4041
_5 = const 3_usize;
4142
_6 = const 6_usize;
@@ -64,4 +65,6 @@
6465
}
6566
+
6667
+ ALLOC0 (size: 8, align: 4) { .. }
68+
+
69+
+ ALLOC1 (size: 24, align: 4) { .. }
6770

0 commit comments

Comments
 (0)