diff --git a/src/alloy/compiler/compiler.cc b/src/alloy/compiler/compiler.cc index 2ad7ca527..b74ada3cf 100644 --- a/src/alloy/compiler/compiler.cc +++ b/src/alloy/compiler/compiler.cc @@ -33,7 +33,8 @@ int Compiler::Compile(HIRBuilder* builder) { // TODO(benvanik): sophisticated stuff. Run passes in parallel, run until they // stop changing things, etc. - for (auto& pass : passes_) { + for (size_t i = 0; i < passes_.size(); ++i) { + auto& pass = passes_[i]; scratch_arena_.Reset(); if (pass->Run(builder)) { return 1; diff --git a/src/alloy/compiler/passes/control_flow_analysis_pass.cc b/src/alloy/compiler/passes/control_flow_analysis_pass.cc index 312fa3441..85b2bcfe4 100644 --- a/src/alloy/compiler/passes/control_flow_analysis_pass.cc +++ b/src/alloy/compiler/passes/control_flow_analysis_pass.cc @@ -30,10 +30,18 @@ ControlFlowAnalysisPass::~ControlFlowAnalysisPass() {} int ControlFlowAnalysisPass::Run(HIRBuilder* builder) { SCOPE_profile_cpu_f("alloy"); - // TODO(benvanik): reset edges for all blocks? Needed to be re-runnable. + // Reset edges for all blocks. Needed to be re-runnable. + // Note that this wastes a bunch of arena memory, so we shouldn't + // re-run too often. + auto block = builder->first_block(); + while (block) { + block->incoming_edge_head = nullptr; + block->outgoing_edge_head = nullptr; + block = block->next; + } // Add edges. - auto block = builder->first_block(); + block = builder->first_block(); while (block) { auto instr = block->instr_tail; while (instr) {