Skip to content

Commit bab2e56

Browse files
committed
Do not emit alloca for ZST local even if it is uninitialized
1 parent ac1cebb commit bab2e56

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

compiler/rustc_codegen_ssa/src/mir/analyze.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,18 @@ impl<'mir, 'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx>
281281
Some(assignment_location) => {
282282
assignment_location.dominates(location, &self.dominators)
283283
}
284-
None => false,
284+
None => {
285+
debug!("No first assignment found for {:?}", local);
286+
// We have not seen any assignment to the local yet,
287+
// but before marking not_ssa, check if it is a ZST,
288+
// in which case we don't need to initialize the local.
289+
let ty = self.fx.mir.local_decls[local].ty;
290+
let ty = self.fx.monomorphize(ty);
291+
292+
let is_zst = self.fx.cx.layout_of(ty).is_zst();
293+
debug!("is_zst: {}", is_zst);
294+
is_zst
295+
}
285296
};
286297
if !ssa_read {
287298
self.not_ssa(local);

src/test/codegen/naked-functions.rs

-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#[naked]
1010
pub fn naked_empty() {
1111
// CHECK-NEXT: {{.+}}:
12-
// CHECK-NEXT: %0 = alloca {}, align 1
1312
// CHECK-NEXT: ret void
1413
}
1514

@@ -19,7 +18,6 @@ pub fn naked_empty() {
1918
// CHECK-NEXT: define void @naked_with_args(i{{[0-9]+( %a)?}})
2019
pub fn naked_with_args(a: isize) {
2120
// CHECK-NEXT: {{.+}}:
22-
// CHECK-NEXT: %0 = alloca {}, align 1
2321
// CHECK: ret void
2422
}
2523

src/test/run-make/const_fn_mir/dump.mir

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ fn main() -> () {
1414

1515
bb1: {
1616
StorageDead(_1); // scope 0 at main.rs:9:10: 9:11
17-
_0 = const (); // scope 0 at main.rs:8:11: 10:2
1817
return; // scope 0 at main.rs:10:2: 10:2
1918
}
2019
}

0 commit comments

Comments
 (0)