From 35566bfd7dd2e316d190078703de54a4dadda062 Mon Sep 17 00:00:00 2001 From: Simon Vandel Sillesen Date: Sun, 3 Jan 2021 15:45:15 +0100 Subject: [PATCH] Do not emit alloca for ZST local even if it is uninitialized --- compiler/rustc_codegen_ssa/src/mir/analyze.rs | 13 ++++++++++++- src/test/codegen/naked-functions.rs | 2 -- src/test/run-make/const_fn_mir/dump.mir | 1 - 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/mir/analyze.rs b/compiler/rustc_codegen_ssa/src/mir/analyze.rs index 289629d92154..31d5c87182d3 100644 --- a/compiler/rustc_codegen_ssa/src/mir/analyze.rs +++ b/compiler/rustc_codegen_ssa/src/mir/analyze.rs @@ -281,7 +281,18 @@ impl<'mir, 'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx> Some(assignment_location) => { assignment_location.dominates(location, &self.dominators) } - None => false, + None => { + debug!("No first assignment found for {:?}", local); + // We have not seen any assignment to the local yet, + // but before marking not_ssa, check if it is a ZST, + // in which case we don't need to initialize the local. + let ty = self.fx.mir.local_decls[local].ty; + let ty = self.fx.monomorphize(ty); + + let is_zst = self.fx.cx.layout_of(ty).is_zst(); + debug!("is_zst: {}", is_zst); + is_zst + } }; if !ssa_read { self.not_ssa(local); diff --git a/src/test/codegen/naked-functions.rs b/src/test/codegen/naked-functions.rs index 974f174de827..43a6be465bcf 100644 --- a/src/test/codegen/naked-functions.rs +++ b/src/test/codegen/naked-functions.rs @@ -9,7 +9,6 @@ #[naked] pub fn naked_empty() { // CHECK-NEXT: {{.+}}: - // CHECK-NEXT: %0 = alloca {}, align 1 // CHECK-NEXT: ret void } @@ -19,7 +18,6 @@ pub fn naked_empty() { // CHECK-NEXT: define void @naked_with_args(i{{[0-9]+( %a)?}}) pub fn naked_with_args(a: isize) { // CHECK-NEXT: {{.+}}: - // CHECK-NEXT: %0 = alloca {}, align 1 // CHECK: ret void } diff --git a/src/test/run-make/const_fn_mir/dump.mir b/src/test/run-make/const_fn_mir/dump.mir index 45d018cf305c..724b26300839 100644 --- a/src/test/run-make/const_fn_mir/dump.mir +++ b/src/test/run-make/const_fn_mir/dump.mir @@ -12,7 +12,6 @@ fn main() -> () { } bb1: { - _0 = const (); // scope 0 at main.rs:8:11: 10:2 return; // scope 0 at main.rs:10:2: 10:2 } }