fold assignee in shallow ssa
This commit is contained in:
parent
2afdbcb47b
commit
f72c210a4f
1 changed files with 13 additions and 23 deletions
|
@ -121,6 +121,16 @@ impl<'ast, 'a> ShallowTransformer<'ast, 'a> {
|
||||||
|
|
||||||
fold_function(self, f)
|
fold_function(self, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fold_assignee<T: Field>(&mut self, a: TypedAssignee<'ast, T>) -> TypedAssignee<'ast, T> {
|
||||||
|
match a {
|
||||||
|
TypedAssignee::Identifier(v) => {
|
||||||
|
let v = self.issue_next_ssa_variable(v);
|
||||||
|
TypedAssignee::Identifier(self.fold_variable(v))
|
||||||
|
}
|
||||||
|
a => fold_assignee(self, a),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ast, 'a, T: Field> Folder<'ast, T> for ShallowTransformer<'ast, 'a> {
|
impl<'ast, 'a, T: Field> Folder<'ast, T> for ShallowTransformer<'ast, 'a> {
|
||||||
|
@ -131,13 +141,7 @@ impl<'ast, 'a, T: Field> Folder<'ast, T> for ShallowTransformer<'ast, 'a> {
|
||||||
match s {
|
match s {
|
||||||
TypedAssemblyStatement::Assignment(a, e) => {
|
TypedAssemblyStatement::Assignment(a, e) => {
|
||||||
let e = self.fold_expression(e);
|
let e = self.fold_expression(e);
|
||||||
let a = match a {
|
let a = self.fold_assignee(a);
|
||||||
TypedAssignee::Identifier(v) => {
|
|
||||||
let v = self.issue_next_ssa_variable(v);
|
|
||||||
TypedAssignee::Identifier(self.fold_variable(v))
|
|
||||||
}
|
|
||||||
a => fold_assignee(self, a),
|
|
||||||
};
|
|
||||||
vec![TypedAssemblyStatement::Assignment(a, e)]
|
vec![TypedAssemblyStatement::Assignment(a, e)]
|
||||||
}
|
}
|
||||||
s => fold_assembly_statement(self, s),
|
s => fold_assembly_statement(self, s),
|
||||||
|
@ -147,26 +151,12 @@ impl<'ast, 'a, T: Field> Folder<'ast, T> for ShallowTransformer<'ast, 'a> {
|
||||||
match s {
|
match s {
|
||||||
TypedStatement::Definition(a, DefinitionRhs::Expression(e)) => {
|
TypedStatement::Definition(a, DefinitionRhs::Expression(e)) => {
|
||||||
let e = self.fold_expression(e);
|
let e = self.fold_expression(e);
|
||||||
|
let a = self.fold_assignee(a);
|
||||||
let a = match a {
|
|
||||||
TypedAssignee::Identifier(v) => {
|
|
||||||
let v = self.issue_next_ssa_variable(v);
|
|
||||||
TypedAssignee::Identifier(self.fold_variable(v))
|
|
||||||
}
|
|
||||||
a => fold_assignee(self, a),
|
|
||||||
};
|
|
||||||
|
|
||||||
vec![TypedStatement::definition(a, e)]
|
vec![TypedStatement::definition(a, e)]
|
||||||
}
|
}
|
||||||
TypedStatement::Definition(assignee, DefinitionRhs::EmbedCall(embed_call)) => {
|
TypedStatement::Definition(assignee, DefinitionRhs::EmbedCall(embed_call)) => {
|
||||||
let assignee = match assignee {
|
|
||||||
TypedAssignee::Identifier(v) => {
|
|
||||||
let v = self.issue_next_ssa_variable(v);
|
|
||||||
TypedAssignee::Identifier(self.fold_variable(v))
|
|
||||||
}
|
|
||||||
a => fold_assignee(self, a),
|
|
||||||
};
|
|
||||||
let embed_call = self.fold_embed_call(embed_call);
|
let embed_call = self.fold_embed_call(embed_call);
|
||||||
|
let assignee = self.fold_assignee(assignee);
|
||||||
vec![TypedStatement::embed_call_definition(assignee, embed_call)]
|
vec![TypedStatement::embed_call_definition(assignee, embed_call)]
|
||||||
}
|
}
|
||||||
TypedStatement::For(v, from, to, stats) => {
|
TypedStatement::For(v, from, to, stats) => {
|
||||||
|
|
Loading…
Reference in a new issue