From 683408f30b37a84e84ece98ec55703d83604c51d Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 26 Oct 2017 12:22:16 -0700 Subject: [PATCH] Break alias cycles by inserting zero values. --- lib/frontend/src/ssa.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/frontend/src/ssa.rs b/lib/frontend/src/ssa.rs index 3c7e112b56..65d1873fca 100644 --- a/lib/frontend/src/ssa.rs +++ b/lib/frontend/src/ssa.rs @@ -530,13 +530,18 @@ where // so we don't need to have it as an ebb argument. // We need to replace all the occurences of val with pred_val but since // we can't afford a re-writing pass right now we just declare an alias. - func.dfg.remove_ebb_param(temp_arg_val); // Resolve aliases eagerly so that we can check for cyclic aliasing, // which can occur in unreachable code. - let resolved = func.dfg.resolve_aliases(pred_val); - if temp_arg_val != resolved { - func.dfg.change_to_alias(temp_arg_val, resolved); + let mut resolved = func.dfg.resolve_aliases(pred_val); + if temp_arg_val == resolved { + // Cycle detected. Break it by creating a zero value. + resolved = emit_zero( + func.dfg.value_type(temp_arg_val), + FuncCursor::new(func).at_first_insertion_point(dest_ebb), + ); } + func.dfg.remove_ebb_param(temp_arg_val); + func.dfg.change_to_alias(temp_arg_val, resolved); resolved } ZeroOneOrMore::More() => { @@ -1183,6 +1188,11 @@ mod tests { ssa.declare_ebb_predecessor(ebb1, block2, j); } ssa.seal_ebb_header_block(ebb1, &mut func); + let flags = settings::Flags::new(&settings::builder()); + match verify_function(&func, &flags) { + Ok(()) => {} + Err(err) => panic!(err.message), + } } #[test] @@ -1224,5 +1234,10 @@ mod tests { } ssa.seal_ebb_header_block(ebb1, &mut func); ssa.seal_ebb_header_block(ebb2, &mut func); + let flags = settings::Flags::new(&settings::builder()); + match verify_function(&func, &flags) { + Ok(()) => {} + Err(err) => panic!(err.message), + } } }