From 4237a052330ddc39fc458b42238bdc50c8584d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Mi=C4=85sko?= Date: Thu, 27 May 2021 00:00:00 +0000 Subject: [PATCH] Use preorder traversal when checking for SSA locals When rebuilding the standard library, this change reduces the number of locals that require an alloca from 62452 to 62348. --- compiler/rustc_codegen_ssa/src/mir/analyze.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_codegen_ssa/src/mir/analyze.rs b/compiler/rustc_codegen_ssa/src/mir/analyze.rs index 8a22a74f97c34..49b5e8466bef2 100644 --- a/compiler/rustc_codegen_ssa/src/mir/analyze.rs +++ b/compiler/rustc_codegen_ssa/src/mir/analyze.rs @@ -18,7 +18,10 @@ pub fn non_ssa_locals<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>( let mir = fx.mir; let mut analyzer = LocalAnalyzer::new(fx); - for (bb, data) in mir.basic_blocks().iter_enumerated() { + // If there exists a local definition that dominates all uses of that local, + // the definition should be visited first. Traverse blocks in preorder which + // is a topological sort of dominance partial order. + for (bb, data) in traversal::preorder(&mir) { analyzer.visit_basic_block_data(bb, data); }