Simplify the code in make_inst_results_reusing; NFC.

This commit is contained in:
Dan Gohman
2018-02-20 12:15:23 -08:00
parent ad896d9790
commit 21215529fe

View File

@@ -452,29 +452,15 @@ impl DataFlowGraph {
I: Iterator<Item = Option<Value>>, I: Iterator<Item = Option<Value>>,
{ {
let mut reuse = reuse.fuse(); let mut reuse = reuse.fuse();
let constraints = self.insts[inst].opcode().constraints();
let fixed_results = constraints.fixed_results();
let mut total_results = fixed_results;
self.results[inst].clear(&mut self.value_lists); self.results[inst].clear(&mut self.value_lists);
// The fixed results will appear at the front of the list.
for res_idx in 0..fixed_results {
let ty = constraints.result_type(res_idx, ctrl_typevar);
if let Some(Some(v)) = reuse.next() {
debug_assert_eq!(self.value_type(v), ty, "Reused {} is wrong type", ty);
self.attach_result(inst, v);
} else {
self.append_result(inst, ty);
}
}
// Get the call signature if this is a function call. // Get the call signature if this is a function call.
if let Some(sig) = self.call_signature(inst) { if let Some(sig) = self.call_signature(inst) {
// Create result values corresponding to the call return types. // Create result values corresponding to the call return types.
let var_results = self.signatures[sig].returns.len(); debug_assert_eq!(self.insts[inst].opcode().constraints().fixed_results(), 0);
total_results += var_results; let num_results = self.signatures[sig].returns.len();
for res_idx in 0..var_results { for res_idx in 0..num_results {
let ty = self.signatures[sig].returns[res_idx].value_type; let ty = self.signatures[sig].returns[res_idx].value_type;
if let Some(Some(v)) = reuse.next() { if let Some(Some(v)) = reuse.next() {
debug_assert_eq!(self.value_type(v), ty, "Reused {} is wrong type", ty); debug_assert_eq!(self.value_type(v), ty, "Reused {} is wrong type", ty);
@@ -483,9 +469,22 @@ impl DataFlowGraph {
self.append_result(inst, ty); self.append_result(inst, ty);
} }
} }
num_results
} else {
// Create result values corresponding to the opcode's constraints.
let constraints = self.insts[inst].opcode().constraints();
let num_results = constraints.fixed_results();
for res_idx in 0..num_results {
let ty = constraints.result_type(res_idx, ctrl_typevar);
if let Some(Some(v)) = reuse.next() {
debug_assert_eq!(self.value_type(v), ty, "Reused {} is wrong type", ty);
self.attach_result(inst, v);
} else {
self.append_result(inst, ty);
}
}
num_results
} }
total_results
} }
/// Create a `ReplaceBuilder` that will replace `inst` with a new instruction in place. /// Create a `ReplaceBuilder` that will replace `inst` with a new instruction in place.