Skip to content
Snippets Groups Projects
Commit ad6aeaa2 authored by Etienne Kneuss's avatar Etienne Kneuss
Browse files

Remove Let/LetTuple madness, rely on constructors

parent 595dd5d1
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ import purescala.Trees._ ...@@ -8,6 +8,7 @@ import purescala.Trees._
import purescala.TypeTrees._ import purescala.TypeTrees._
import purescala.TreeOps._ import purescala.TreeOps._
import purescala.Definitions._ import purescala.Definitions._
import purescala.Constructors._
object ConvertHoles extends LeonPhase[Program, Program] { object ConvertHoles extends LeonPhase[Program, Program] {
val name = "Convert Holes to Choose" val name = "Convert Holes to Choose"
...@@ -62,11 +63,7 @@ object ConvertHoles extends LeonPhase[Program, Program] { ...@@ -62,11 +63,7 @@ object ConvertHoles extends LeonPhase[Program, Program] {
BooleanLiteral(true) BooleanLiteral(true)
} }
val withChoose = if (holes.size > 1) { val withChoose = letTuple(holes, Choose(cids, pred), newBody)
LetTuple(holes, Choose(cids, pred), newBody)
} else {
Let(holes.head, Choose(cids, pred), newBody)
}
fd.body = Some(withChoose) fd.body = Some(withChoose)
} }
......
...@@ -7,6 +7,7 @@ import purescala.Common._ ...@@ -7,6 +7,7 @@ import purescala.Common._
import purescala.Trees._ import purescala.Trees._
import purescala.TreeOps._ import purescala.TreeOps._
import purescala.Definitions._ import purescala.Definitions._
import purescala.Constructors._
object ConvertWithOracle extends LeonPhase[Program, Program] { object ConvertWithOracle extends LeonPhase[Program, Program] {
val name = "Convert WithOracle to Choose" val name = "Convert WithOracle to Choose"
...@@ -53,11 +54,7 @@ object ConvertWithOracle extends LeonPhase[Program, Program] { ...@@ -53,11 +54,7 @@ object ConvertWithOracle extends LeonPhase[Program, Program] {
BooleanLiteral(true) BooleanLiteral(true)
} }
if (chooseOs.size > 1) { Some(letTuple(os, Choose(chooseOs, pred), b))
Some(LetTuple(os, Choose(chooseOs, pred), b))
} else {
Some(Let(os.head, Choose(chooseOs, pred), b))
}
case None => case None =>
None None
} }
......
...@@ -10,6 +10,7 @@ import purescala.Common._ ...@@ -10,6 +10,7 @@ import purescala.Common._
import purescala.TypeTrees._ import purescala.TypeTrees._
import purescala.TreeOps._ import purescala.TreeOps._
import purescala.Extractors._ import purescala.Extractors._
import purescala.Constructors._
case object DetupleOutput extends Rule("Detuple Out") { case object DetupleOutput extends Rule("Detuple Out") {
...@@ -39,13 +40,12 @@ case object DetupleOutput extends Rule("Detuple Out") { ...@@ -39,13 +40,12 @@ case object DetupleOutput extends Rule("Detuple Out") {
}.unzip }.unzip
val newOuts = subOuts.flatten val newOuts = subOuts.flatten
//sctx.reporter.warning("newOuts: " + newOuts.toString)
val sub = Problem(p.as, p.pc, subProblem, newOuts) val sub = Problem(p.as, p.pc, subProblem, newOuts)
val onSuccess: List[Solution] => Option[Solution] = { val onSuccess: List[Solution] => Option[Solution] = {
case List(sol) => case List(sol) =>
Some(Solution(sol.pre, sol.defs, LetTuple(newOuts, sol.term, Tuple(outerOuts)))) Some(Solution(sol.pre, sol.defs, letTuple(newOuts, sol.term, Tuple(outerOuts))))
case _ => case _ =>
None None
} }
......
...@@ -8,6 +8,7 @@ import purescala.Common._ ...@@ -8,6 +8,7 @@ import purescala.Common._
import purescala.Trees._ import purescala.Trees._
import purescala.TreeOps._ import purescala.TreeOps._
import purescala.Extractors._ import purescala.Extractors._
import purescala.Constructors._
case object OnePoint extends NormalizingRule("One-point") { case object OnePoint extends NormalizingRule("One-point") {
def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = {
...@@ -32,14 +33,9 @@ case object OnePoint extends NormalizingRule("One-point") { ...@@ -32,14 +33,9 @@ case object OnePoint extends NormalizingRule("One-point") {
val newProblem = Problem(p.as, p.pc, subst(x -> e, And(others)), oxs) val newProblem = Problem(p.as, p.pc, subst(x -> e, And(others)), oxs)
val onSuccess: List[Solution] => Option[Solution] = { val onSuccess: List[Solution] => Option[Solution] = {
case List(Solution(pre, defs, term)) => case List(Solution(pre, defs, term)) =>
if (oxs.isEmpty) { Some(Solution(pre, defs, letTuple(oxs, term, subst(x -> e, Tuple(p.xs.map(Variable(_)))))))
Some(Solution(pre, defs, Tuple(e :: Nil)))
} else {
Some(Solution(pre, defs, LetTuple(oxs, term, subst(x -> e, Tuple(p.xs.map(Variable(_)))))))
}
case _ => case _ =>
None None
} }
......
...@@ -7,6 +7,7 @@ package rules ...@@ -7,6 +7,7 @@ package rules
import purescala.Trees._ import purescala.Trees._
import purescala.TreeOps._ import purescala.TreeOps._
import purescala.Extractors._ import purescala.Extractors._
import purescala.Constructors._
case object UnconstrainedOutput extends NormalizingRule("Unconstr.Output") { case object UnconstrainedOutput extends NormalizingRule("Unconstr.Output") {
def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = {
...@@ -17,13 +18,8 @@ case object UnconstrainedOutput extends NormalizingRule("Unconstr.Output") { ...@@ -17,13 +18,8 @@ case object UnconstrainedOutput extends NormalizingRule("Unconstr.Output") {
val onSuccess: List[Solution] => Option[Solution] = { val onSuccess: List[Solution] => Option[Solution] = {
case List(s) => case List(s) =>
val term = if (sub.xs.size > 1) { val term = letTuple(sub.xs, s.term, Tuple(p.xs.map(id => if (unconstr(id)) simplestValue(id.getType) else Variable(id))))
LetTuple(sub.xs, s.term, Tuple(p.xs.map(id => if (unconstr(id)) simplestValue(id.getType) else Variable(id))))
} else if (sub.xs.size == 1) {
Let(sub.xs.head, s.term, Tuple(p.xs.map(id => if (unconstr(id)) simplestValue(id.getType) else Variable(id))))
} else {
Tuple(p.xs.map(id => simplestValue(id.getType)))
}
Some(Solution(s.pre, s.defs, term)) Some(Solution(s.pre, s.defs, term))
case _ => case _ =>
None None
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment