Skip to content

Commit 6b1a662

Browse files
authored
Merge pull request #13637 from dwijnand/perf/exhaust
2 parents 1003d7c + c6ee5e3 commit 6b1a662

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

bench/profiles/exhaustivity.yml

+9
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ charts:
4747
- key: exhaustivity-i12358
4848
label: bootstrapped
4949

50+
- name: "exhaustivity i13565"
51+
url: https://github.com/lampepfl/dotty/blob/master/tests/pos/i13565.scala
52+
lines:
53+
- key: exhaustivity-i13565
54+
label: bootstrapped
55+
5056
scripts:
5157

5258
patmatexhaust:
@@ -73,5 +79,8 @@ scripts:
7379
exhaustivity-i12358:
7480
- measure -wi 20 -i 40 -f 3 -- $PROG_HOME/dotty/tests/patmat/i12358.scala
7581

82+
exhaustivity-i13565:
83+
- measure 20 40 3 $PROG_HOME/dotty/tests/pos/i13565.scala
84+
7685
config:
7786
pr_base_url: "https://github.com/lampepfl/dotty/pull/"

compiler/src/dotty/tools/dotc/transform/patmat/Space.scala

+5
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,11 @@ class SpaceEngine(using Context) extends SpaceLogic {
531531
else convertConstantType(tp1, tp2)
532532
}
533533

534+
private val isSubspaceCache = mutable.HashMap.empty[(Space, Space, Context), Boolean]
535+
536+
override def isSubspace(a: Space, b: Space)(using Context): Boolean =
537+
isSubspaceCache.getOrElseUpdate((a, b, ctx), super.isSubspace(a, b))
538+
534539
/** Is `tp1` a subtype of `tp2`? */
535540
def isSubType(tp1: Type, tp2: Type): Boolean = trace(i"$tp1 <:< $tp2", debug, show = true) {
536541
if tp1 == constantNullType && !ctx.explicitNulls then tp2 == constantNullType

tests/pos/i13565.scala

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package ips.clang
2+
3+
sealed trait PrimaryExpression extends PostfixExpression
4+
sealed trait PostfixExpression extends UnaryExpression
5+
sealed trait UnaryExpression extends CastExpression
6+
sealed trait CastExpression extends MultiplicativeExpression
7+
sealed trait MultiplicativeExpression extends AdditiveExpression
8+
sealed trait AdditiveExpression extends ShiftExpression
9+
sealed trait ShiftExpression extends RelationalExpression
10+
sealed trait RelationalExpression extends EqualityExpression
11+
sealed trait EqualityExpression extends PrecAndExpression
12+
sealed trait PrecAndExpression extends PrecExclusiveOrExpression
13+
sealed trait PrecExclusiveOrExpression extends PrecInclusiveOrExpression
14+
sealed trait PrecInclusiveOrExpression extends PrecLogicalAndExpression
15+
sealed trait PrecLogicalAndExpression extends PrecLogicalOrExpression
16+
sealed trait PrecLogicalOrExpression extends PrecConditionalExpression
17+
sealed trait PrecConditionalExpression extends PrecAssigmentExpression
18+
sealed trait PrecAssigmentExpression extends Expression
19+
sealed trait Expression
20+
sealed trait BinaryExpression { def op: String; def frs: Expression; def snd: Expression }
21+
22+
type TypeName = String
23+
case class Identifier(value: String) extends PrimaryExpression
24+
case class IntConstant(value: Int) extends PrimaryExpression
25+
case class CharConstant(value: Char) extends PrimaryExpression
26+
case class StringLiteral(value: String) extends PrimaryExpression
27+
case class WrappedExpression(value: Expression) extends PrimaryExpression
28+
case class ArrayIndexExpression(base: PostfixExpression, index: Expression) extends PostfixExpression
29+
case class FunctionCallExpression(fun: PostfixExpression, arguments: List[PrecAssigmentExpression]) extends PostfixExpression
30+
case class DotSelectExpression(qualifier: PostfixExpression, select: Identifier) extends PostfixExpression
31+
case class ArrowSelectExpression(qualifier: PostfixExpression, select: Identifier) extends PostfixExpression
32+
case class PostfixIncrementExpression(base: PostfixExpression) extends PostfixExpression
33+
case class PostfixDecrementExpression(base: PostfixExpression) extends PostfixExpression
34+
case class CompoundLiteral(typeName: TypeName, initializers: List[Int]) extends PostfixExpression
35+
case class PrefixIncrementExpression(base: UnaryExpression) extends UnaryExpression
36+
case class PrefixDecrementExpression(base: UnaryExpression) extends UnaryExpression
37+
case class UnaryOperatorExpression(op: String, argument: CastExpression) extends UnaryExpression
38+
case class SizeofConstExpression(expression: UnaryExpression) extends UnaryExpression
39+
case class SizeofTypeExpression(typeName: TypeName) extends UnaryExpression
40+
case class Cast(typeName: TypeName, argument: CastExpression) extends CastExpression
41+
case class MultiplicativeBinaryExpression(op: String, frs: MultiplicativeExpression, snd: CastExpression) extends MultiplicativeExpression with BinaryExpression
42+
case class AdditiveBinaryExpression(op: String, frs: MultiplicativeExpression, snd: CastExpression) extends MultiplicativeExpression with BinaryExpression
43+
case class ShiftBinaryExpression(op: String, frs: MultiplicativeExpression, snd: CastExpression) extends MultiplicativeExpression with BinaryExpression
44+
case class RelationalBinaryExpression(op: String, frs: RelationalExpression, snd: ShiftExpression) extends RelationalExpression with BinaryExpression
45+
case class EqualityBinaryExpression(op: String, frs: RelationalExpression, snd: ShiftExpression) extends EqualityExpression with BinaryExpression
46+
case class AndBinaryExpression(op: String, frs: PrecAndExpression, snd: EqualityExpression) extends PrecAndExpression with BinaryExpression
47+
case class ExclusiveOrBinaryExpression(op: String, frs: PrecExclusiveOrExpression, snd: PrecAndExpression) extends PrecExclusiveOrExpression with BinaryExpression
48+
case class InclusiveOrBinaryExpression(op: String, frs: PrecExclusiveOrExpression, snd: PrecAndExpression) extends PrecInclusiveOrExpression with BinaryExpression
49+
case class LogicalAndBinaryExpression(op: String, frs: PrecLogicalAndExpression, snd: PrecInclusiveOrExpression) extends PrecLogicalAndExpression with BinaryExpression
50+
case class LogicalOrBinaryExpression(op: String, frs: PrecLogicalAndExpression, snd: PrecInclusiveOrExpression) extends PrecLogicalOrExpression with BinaryExpression
51+
case class ConditionalExpression(cond: PrecLogicalOrExpression, frs: Expression, snd: PrecConditionalExpression) extends PrecConditionalExpression
52+
case class AssigmentExpression(op: String, frs: UnaryExpression, snd: PrecAssigmentExpression) extends PrecAssigmentExpression
53+
case class CommaExpression(frs: Expression, snd: Expression) extends Expression
54+
case class AltCommaExpression(frs: Expression, snd: Expression) extends Expression
55+
56+
// each AdditionalUnaryExpressionX increase compilation time
57+
sealed trait AdditionalUnaryExpression1 extends UnaryExpression
58+
sealed trait AdditionalUnaryExpression2 extends UnaryExpression
59+
sealed trait AdditionalUnaryExpression3 extends UnaryExpression
60+
sealed trait AdditionalUnaryExpression4 extends UnaryExpression
61+
sealed trait AdditionalUnaryExpression5 extends UnaryExpression
62+
63+
class LongCompilation:
64+
// this match used to take 2m30 to compile, with 1 cache it now takes 5s (30x speedup, aka 3000%)
65+
def toCastExpression(expr: Expression): CastExpression = expr match
66+
case x: CastExpression => x
67+
case _ => WrappedExpression(expr)

0 commit comments

Comments
 (0)