Skip to content

Exponential compilation time in pattern matching #2140

@OlivierBlanvillain

Description

@OlivierBlanvillain

This compiles in 9 seconds, with case 12 uncommented it goes to 21 seconds and so on. Adding : Any ascriptions on every tuple brings things back to normal.

object Test {
  def main(args: Array[String]): Unit = {
    val s = 1
    val t: Any = 23 match {
      case 0  => (s)
      case 1  => (s, s)
      case 2  => (s, s, s)
      case 3  => (s, s, s, s)
      case 4  => (s, s, s, s, s)
      case 5  => (s, s, s, s, s, s)
      case 6  => (s, s, s, s, s, s, s)
      case 7  => (s, s, s, s, s, s, s, s)
      case 8  => (s, s, s, s, s, s, s, s, s)
      case 9  => (s, s, s, s, s, s, s, s, s, s)
      case 10 => (s, s, s, s, s, s, s, s, s, s, s)
      case 11 => (s, s, s, s, s, s, s, s, s, s, s, s) // 9s
      // case 12 => (s, s, s, s, s, s, s, s, s, s, s, s, s) // 21s
      // case 13 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s) // 67s
      // case 14 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 15 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 16 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 17 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 18 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 19 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 20 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 21 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
      // case 22 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
    }
  }
}

It looks like most of the time is spent in isSubType, probably when computing the least upper bound?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions