Skip to content

Commit c376ef7

Browse files
author
astojanov
committed
ArrayOps, BooleanOps & OrderingOps optimized.
1 parent a6ae135 commit c376ef7

File tree

6 files changed

+157
-86
lines changed

6 files changed

+157
-86
lines changed

src/common/ArrayOps.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,20 @@ trait ArrayOpsExp extends ArrayOps with EffectExp with VariablesExp {
135135

136136
trait ArrayOpsExpOpt extends ArrayOpsExp {
137137

138+
/**
139+
* @author Alen Stojanov ([email protected])
140+
*/
141+
override def array_length[T:Manifest](a: Exp[Array[T]])(implicit pos: SourceContext) : Rep[Int] = a match {
142+
case Def(ArrayNew(n: Exp[Int])) => n
143+
case Def(ArrayFromSeq(xs)) => Const(xs.size)
144+
case Def(ArraySort(x)) => array_length(x)
145+
case Def(ArrayMap(x, _, _)) => array_length(x)
146+
case Def(Reflect(ArrayNew(n: Exp[Int]), _, _)) => n
147+
case Def(Reflect(ArrayFromSeq(xs), _, _)) => Const(xs.size)
148+
case Def(Reflect(ArraySort(x), _, _)) => array_length(x)
149+
case Def(Reflect(ArrayMap(x, _, _), _, _)) => array_length(x)
150+
case _ => super.array_length(a)
151+
}
138152

139153
override def array_apply[T:Manifest](x: Exp[Array[T]], n: Exp[Int])(implicit pos: SourceContext): Exp[T] = {
140154
if (context ne null) {
@@ -172,8 +186,6 @@ trait ArrayOpsExpOpt extends ArrayOpsExp {
172186
}
173187
}
174188

175-
176-
177189
}
178190

179191

src/common/BooleanOps.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,37 @@ trait BooleanOpsExp extends BooleanOps with EffectExp {
4343
}).asInstanceOf[Exp[A]] // why??
4444
}
4545

46+
47+
/**
48+
* @author Alen Stojanov ([email protected])
49+
*/
4650
trait BooleanOpsExpOpt extends BooleanOpsExp {
51+
4752
override def boolean_negate(lhs: Exp[Boolean])(implicit pos: SourceContext) = lhs match {
4853
case Def(BooleanNegate(x)) => x
54+
case Const(a) => Const(!a)
4955
case _ => super.boolean_negate(lhs)
5056
}
57+
58+
override def boolean_and(lhs: Exp[Boolean], rhs: Exp[Boolean])(implicit pos: SourceContext) : Exp[Boolean] = {
59+
(lhs, rhs) match {
60+
case (Const(false), _) => Const(false)
61+
case (_, Const(false)) => Const(false)
62+
case (Const(true), x) => x
63+
case (x, Const(true)) => x
64+
case _ => super.boolean_and(lhs, rhs)
65+
}
66+
}
67+
68+
override def boolean_or(lhs: Exp[Boolean], rhs: Exp[Boolean])(implicit pos: SourceContext) : Exp[Boolean] = {
69+
(lhs, rhs) match {
70+
case (Const(false), x) => x
71+
case (x, Const(false)) => x
72+
case (Const(true), _) => Const(true)
73+
case (_, Const(true)) => Const(true)
74+
case _ => super.boolean_or(lhs, rhs)
75+
}
76+
}
5177
}
5278

5379
trait ScalaGenBooleanOps extends ScalaGenBase {

src/common/OrderingOps.scala

Lines changed: 115 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -12,41 +12,33 @@ trait OrderingOps extends Base with Variables with OverloadHack {
1212
implicit def varOrderingToOrderingOps[T:Ordering:Manifest](n: Var[T]) = new OrderingOpsCls(readVar(n))
1313

1414
class OrderingOpsCls[T:Ordering:Manifest](lhs: Rep[T]){
15-
def <(rhs: Rep[T])(implicit pos: SourceContext) = ordering_lt(lhs, rhs)
16-
def <=(rhs: Rep[T])(implicit pos: SourceContext) = ordering_lteq(lhs, rhs)
17-
def >(rhs: Rep[T])(implicit pos: SourceContext) = ordering_gt(lhs, rhs)
18-
def >=(rhs: Rep[T])(implicit pos: SourceContext) = ordering_gteq(lhs, rhs)
19-
def equiv(rhs: Rep[T])(implicit pos: SourceContext) = ordering_equiv(lhs, rhs)
20-
def max(rhs: Rep[T])(implicit pos: SourceContext) = ordering_max(lhs, rhs)
21-
def min(rhs: Rep[T])(implicit pos: SourceContext) = ordering_min(lhs, rhs)
22-
def compare(rhs: Rep[T])(implicit pos: SourceContext) = ordering_compare(lhs, rhs)
23-
24-
def <[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_lt(lhs, c(rhs))
25-
def <=[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_lteq(lhs, c(rhs))
26-
def >[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_gt(lhs, c(rhs))
27-
def >=[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_gteq(lhs, c(rhs))
28-
def equiv[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_equiv(lhs, c(rhs))
29-
def max[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_max(lhs, c(rhs))
30-
def min[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_min(lhs, c(rhs))
31-
def compare[B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_compare(lhs, c(rhs))
15+
def < (rhs: Rep[T])(implicit pos: SourceContext) = ordering_lt(lhs, rhs)
16+
def <= (rhs: Rep[T])(implicit pos: SourceContext) = ordering_lteq(lhs, rhs)
17+
def > (rhs: Rep[T])(implicit pos: SourceContext) = ordering_gt(lhs, rhs)
18+
def >= (rhs: Rep[T])(implicit pos: SourceContext) = ordering_gteq(lhs, rhs)
19+
def equiv (rhs: Rep[T])(implicit pos: SourceContext) = ordering_equiv(lhs, rhs)
20+
def max (rhs: Rep[T])(implicit pos: SourceContext) = ordering_max(lhs, rhs)
21+
def min (rhs: Rep[T])(implicit pos: SourceContext) = ordering_min(lhs, rhs)
22+
def compare (rhs: Rep[T])(implicit pos: SourceContext) = ordering_compare(lhs, rhs)
23+
24+
def < [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_lt(lhs, c(rhs))
25+
def <= [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_lteq(lhs, c(rhs))
26+
def > [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_gt(lhs, c(rhs))
27+
def >= [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_gteq(lhs, c(rhs))
28+
def equiv [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_equiv(lhs, c(rhs))
29+
def max [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_max(lhs, c(rhs))
30+
def min [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_min(lhs, c(rhs))
31+
def compare [B](rhs: B)(implicit c: B => Rep[T], pos: SourceContext) = ordering_compare(lhs, c(rhs))
3232
}
3333

34-
// def infix_<[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_lt(lhs,c(rhs))
35-
// def infix_<=[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_lteq(lhs,c(rhs))
36-
// def infix_>[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_gt(lhs,c(rhs))
37-
// def infix_>=[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_gteq(lhs,c(rhs))
38-
// def infix_equiv[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_equiv(lhs,c(rhs))
39-
// def infix_max[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_max(lhs,c(rhs))
40-
// def infix_min[T,B](lhs: Rep[T], rhs: B)(implicit o: Ordering[T], c: B => Rep[T], mT: Manifest[T]) = ordering_min(lhs,c(rhs))
41-
42-
def ordering_lt[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
43-
def ordering_lteq[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
44-
def ordering_gt[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
45-
def ordering_gteq[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
46-
def ordering_equiv[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
47-
def ordering_max[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[T]
48-
def ordering_min[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[T]
49-
def ordering_compare[T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Int]
34+
def ordering_lt [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
35+
def ordering_lteq [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
36+
def ordering_gt [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
37+
def ordering_gteq [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
38+
def ordering_equiv [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Boolean]
39+
def ordering_max [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[T]
40+
def ordering_min [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[T]
41+
def ordering_compare [T:Ordering:Manifest](lhs: Rep[T], rhs: Rep[T])(implicit pos: SourceContext): Rep[Int]
5042
}
5143

5244

@@ -55,47 +47,101 @@ trait OrderingOpsExp extends OrderingOps with VariablesExp {
5547
def mev = manifest[T]
5648
def aev = implicitly[Ordering[T]]
5749
}
58-
case class OrderingLT[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
59-
case class OrderingLTEQ[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
60-
case class OrderingGT[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
61-
case class OrderingGTEQ[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
62-
case class OrderingEquiv[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
63-
case class OrderingMax[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,T]
64-
case class OrderingMin[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,T]
65-
case class OrderingCompare[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Int]
66-
67-
def ordering_lt[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingLT(lhs,rhs)
68-
def ordering_lteq[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingLTEQ(lhs,rhs)
69-
def ordering_gt[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingGT(lhs,rhs)
70-
def ordering_gteq[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingGTEQ(lhs,rhs)
71-
def ordering_equiv[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingEquiv(lhs,rhs)
72-
def ordering_max[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[T] = OrderingMax(lhs,rhs)
73-
def ordering_min[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[T] = OrderingMin(lhs,rhs)
74-
def ordering_compare[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Int] = OrderingCompare(lhs,rhs)
75-
76-
override def mirror[A:Manifest](e: Def[A], f: Transformer)(implicit pos: SourceContext): Exp[A] = {
77-
(e match {
78-
case e@OrderingLT(a,b) => ordering_lt(f(a),f(b))(e.aev,e.mev,pos)
79-
case e@OrderingLTEQ(a,b) => ordering_lteq(f(a),f(b))(e.aev,e.mev,pos)
80-
case e@OrderingGT(a,b) => ordering_gt(f(a),f(b))(e.aev,e.mev,pos)
81-
case e@OrderingGTEQ(a,b) => ordering_gteq(f(a),f(b))(e.aev,e.mev,pos)
82-
case e@OrderingEquiv(a,b) => ordering_equiv(f(a),f(b))(e.aev,e.mev,pos)
83-
case e@OrderingMax(a,b) => ordering_max(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev),pos)
84-
case e@OrderingMin(a,b) => ordering_min(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev),pos)
85-
case e@OrderingCompare(a,b) => ordering_compare(f(a),f(b))(e.aev,e.mev,pos)
86-
case Reflect(e@OrderingLT(a,b), u, es) => reflectMirrored(Reflect(OrderingLT(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
87-
case Reflect(e@OrderingLTEQ(a,b), u, es) => reflectMirrored(Reflect(OrderingLTEQ(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
88-
case Reflect(e@OrderingGT(a,b), u, es) => reflectMirrored(Reflect(OrderingGT(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
89-
case Reflect(e@OrderingGTEQ(a,b), u, es) => reflectMirrored(Reflect(OrderingGTEQ(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
90-
case Reflect(e@OrderingEquiv(a,b), u, es) => reflectMirrored(Reflect(OrderingEquiv(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
91-
case Reflect(e@OrderingMax(a,b), u, es) => reflectMirrored(Reflect(OrderingMax(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev)), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
92-
case Reflect(e@OrderingMin(a,b), u, es) => reflectMirrored(Reflect(OrderingMin(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev)), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
50+
case class OrderingLT [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
51+
case class OrderingLTEQ [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
52+
case class OrderingGT [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
53+
case class OrderingGTEQ [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
54+
case class OrderingEquiv [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Boolean]
55+
case class OrderingMax [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,T]
56+
case class OrderingMin [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,T]
57+
case class OrderingCompare [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T]) extends DefMN[T,Int]
58+
59+
def ordering_lt [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingLT(lhs,rhs)
60+
def ordering_lteq [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingLTEQ(lhs,rhs)
61+
def ordering_gt [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingGT(lhs,rhs)
62+
def ordering_gteq [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingGTEQ(lhs,rhs)
63+
def ordering_equiv [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = OrderingEquiv(lhs,rhs)
64+
def ordering_max [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[T] = OrderingMax(lhs,rhs)
65+
def ordering_min [T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[T] = OrderingMin(lhs,rhs)
66+
def ordering_compare[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Int] = OrderingCompare(lhs,rhs)
67+
68+
override def mirror[A:Manifest](e: Def[A], f: Transformer)(implicit pos: SourceContext): Exp[A] = (e match {
69+
case e@OrderingLT(a,b) => ordering_lt(f(a),f(b))(e.aev,e.mev,pos)
70+
case e@OrderingLTEQ(a,b) => ordering_lteq(f(a),f(b))(e.aev,e.mev,pos)
71+
case e@OrderingGT(a,b) => ordering_gt(f(a),f(b))(e.aev,e.mev,pos)
72+
case e@OrderingGTEQ(a,b) => ordering_gteq(f(a),f(b))(e.aev,e.mev,pos)
73+
case e@OrderingEquiv(a,b) => ordering_equiv(f(a),f(b))(e.aev,e.mev,pos)
74+
case e@OrderingMax(a,b) => ordering_max(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev),pos)
75+
case e@OrderingMin(a,b) => ordering_min(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev),pos)
76+
case e@OrderingCompare(a,b) => ordering_compare(f(a),f(b))(e.aev,e.mev,pos)
77+
case Reflect(e@OrderingLT(a,b), u, es) => reflectMirrored(Reflect(OrderingLT(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
78+
case Reflect(e@OrderingLTEQ(a,b), u, es) => reflectMirrored(Reflect(OrderingLTEQ(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
79+
case Reflect(e@OrderingGT(a,b), u, es) => reflectMirrored(Reflect(OrderingGT(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
80+
case Reflect(e@OrderingGTEQ(a,b), u, es) => reflectMirrored(Reflect(OrderingGTEQ(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
81+
case Reflect(e@OrderingEquiv(a,b), u, es) => reflectMirrored(Reflect(OrderingEquiv(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
82+
case Reflect(e@OrderingMax(a,b), u, es) => reflectMirrored(Reflect(OrderingMax(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev)), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
83+
case Reflect(e@OrderingMin(a,b), u, es) => reflectMirrored(Reflect(OrderingMin(f(a),f(b))(e.aev.asInstanceOf[Ordering[A]],mtype(e.mev)), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
9384
case Reflect(e@OrderingCompare(a,b), u, es) => reflectMirrored(Reflect(OrderingCompare(f(a),f(b))(e.aev,e.mev), mapOver(f,u), f(es)))(mtype(manifest[A]), pos)
9485
case _ => super.mirror(e, f)
95-
}).asInstanceOf[Exp[A]]
86+
}).asInstanceOf[Exp[A]]
87+
}
88+
89+
/**
90+
* @author Alen Stojanov ([email protected])
91+
*/
92+
trait OrderingOpsExpOpt extends OrderingOpsExp {
93+
94+
override def ordering_lt[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs, rhs) match {
95+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].lt(a, b))
96+
case (a, b) if a.equals(b) => Const(false)
97+
case _ => super.ordering_lt(lhs, rhs)
98+
}
99+
100+
override def ordering_lteq[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs, rhs) match {
101+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].lteq(a, b))
102+
case (a, b) if a.equals(b) => Const(true)
103+
case _ => super.ordering_lteq(lhs, rhs)
104+
}
105+
106+
override def ordering_gt[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs, rhs) match {
107+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].gt(a, b))
108+
case (a, b) if a.equals(b) => Const(false)
109+
case _ => super.ordering_gt(lhs, rhs)
110+
}
111+
112+
override def ordering_gteq[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs, rhs) match {
113+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].gteq(a, b))
114+
case (a, b) if a.equals(b) => Const(true)
115+
case _ => super.ordering_gteq(lhs, rhs)
116+
}
117+
118+
override def ordering_equiv[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs, rhs) match {
119+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].equiv(a, b))
120+
case (a, b) if a.equals(b) => Const(true)
121+
case _ => super.ordering_equiv(lhs, rhs)
96122
}
123+
124+
override def ordering_max[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[T] = (lhs, rhs) match {
125+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].max(a, b))
126+
case (a, b) if a.equals(b) => a
127+
case _ => super.ordering_max(lhs, rhs)
128+
}
129+
130+
override def ordering_min[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[T] = (lhs, rhs) match {
131+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].min(a, b))
132+
case (a, b) if a.equals(b) => a
133+
case _ => super.ordering_min(lhs, rhs)
134+
}
135+
136+
override def ordering_compare[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Int] = (lhs, rhs) match {
137+
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].compare(a, b))
138+
case (a, b) if a.equals(b) => Const[Int](0)
139+
case _ => super.ordering_compare(lhs, rhs)
140+
}
141+
97142
}
98143

144+
99145
trait ScalaGenOrderingOps extends ScalaGenBase {
100146
val IR: OrderingOpsExp
101147
import IR._

test-src/epfl/test11-shonan/TestHMM.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package test11
55
import common._
66
import test1._
77
import test7._
8-
import test8.{ArrayMutation,ArrayMutationExp,ScalaGenArrayMutation,OrderingOpsExpOpt}
8+
import test8.{ArrayMutation,ArrayMutationExp,ScalaGenArrayMutation}
99

1010
import util.OverloadHack
1111
import scala.reflect.SourceContext

test-src/epfl/test11-shonan/TestStencil.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ package test11
55
import common._
66
import test1._
77
import test7._
8-
import test8.{ArrayMutation,ArrayMutationExp,ScalaGenArrayMutation,OrderingOpsExpOpt}
8+
import test8.{ArrayMutation,ArrayMutationExp,ScalaGenArrayMutation}
99

1010
import util.OverloadHack
1111
import scala.reflect.SourceContext

test-src/epfl/test8-effects/TestSpeculative.scala

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,6 @@ import util.OverloadHack
1313
import java.io.{PrintWriter,StringWriter,FileOutputStream}
1414
import scala.reflect.SourceContext
1515

16-
17-
trait OrderingOpsExpOpt extends OrderingOpsExp {
18-
override def ordering_lt[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs,rhs) match {
19-
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].lt(a,b))
20-
case _ => super.ordering_lt(lhs,rhs)
21-
}
22-
override def ordering_gt[T:Ordering:Manifest](lhs: Exp[T], rhs: Exp[T])(implicit pos: SourceContext): Rep[Boolean] = (lhs,rhs) match {
23-
case (Const(a), Const(b)) => Const(implicitly[Ordering[T]].gt(a,b))
24-
case _ => super.ordering_gt(lhs,rhs)
25-
}
26-
}
27-
28-
2916
class TestSpeculative extends FileDiffSuite {
3017

3118
val prefix = home + "test-out/epfl/test8-"

0 commit comments

Comments
 (0)