[meta] Fix legalization in presence of varargs

This commit is contained in:
bjorn3
2019-06-29 16:21:52 +02:00
committed by Dan Gohman
parent d9ee08c088
commit 8d0e8f8931

View File

@@ -61,10 +61,10 @@ fn unwrap_inst(
fmtln!(fmt, "{},", field.member); fmtln!(fmt, "{},", field.member);
} }
if iform.num_value_operands == 1 { if iform.has_value_list || iform.num_value_operands > 1 {
fmt.line("arg,");
} else if iform.has_value_list || iform.num_value_operands > 1 {
fmt.line("ref args,"); fmt.line("ref args,");
} else if iform.num_value_operands == 1 {
fmt.line("arg,");
} }
fmt.line(".."); fmt.line("..");
@@ -87,6 +87,11 @@ fn unwrap_inst(
} else if op.is_value() { } else if op.is_value() {
let n = inst.value_opnums.iter().position(|&i| i == op_num).unwrap(); let n = inst.value_opnums.iter().position(|&i| i == op_num).unwrap();
fmtln!(fmt, "func.dfg.resolve_aliases(args[{}]),", n); fmtln!(fmt, "func.dfg.resolve_aliases(args[{}]),", n);
} else if op.is_varargs() {
let n = inst.imm_opnums.iter().chain(inst.value_opnums.iter()).max().map(|n| n + 1).unwrap_or(0);
fmtln!(fmt, "\
args.iter().skip({}).map(|&arg| func.dfg.resolve_aliases(arg)).collect::<Vec<_>>(),\
", n);
} }
} }
@@ -104,6 +109,14 @@ fn unwrap_inst(
}); });
fmtln!(fmt, "};"); fmtln!(fmt, "};");
assert_eq!(inst.operands_in.len(), apply.args.len());
for (i, op) in inst.operands_in.iter().enumerate() {
if op.is_varargs() {
let name = var_pool.get(apply.args[i].maybe_var().expect("vararg without name")).name;
fmtln!(fmt, "let {} = &{};", name, name);
}
}
for &op_num in &inst.value_opnums { for &op_num in &inst.value_opnums {
let arg = &apply.args[op_num]; let arg = &apply.args[op_num];
if let Some(var_index) = arg.maybe_var() { if let Some(var_index) = arg.maybe_var() {