Skip to content
  • Simon Peyton Jones's avatar
    074945de
    Two small improvements in the Simplifier · 074945de
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    As #20941 describes, this patch implements a couple of small
    fixes to the Simplifier.  They make a difference principally
    with -O0, so few people will notice.  But with -O0 they can
    reduce the number of Simplifer iterations.
    
    * In occurrence analysis we avoid making x = (a,b) into a loop breaker
      because we want to be able to inline x, or (more likely) do
      case-elimination. But HEAD does not treat
          x = let y = blah in (a,b)
      in the same way.  We should though, because we are going to float
      that y=blah out of the x-binding.  A one-line fix in OccurAnal.
    
    * The crucial function exprIsConApp_maybe uses getUnfoldingInRuleMatch
      (rightly) but the latter was deeply strange.  In HEAD, if
      rule-rewriting was off (-O0) we only looked inside stable
      unfoldings. Very stupid.  The patch simplifies.
    
    * I also noticed that in simplStableUnfolding we were failing to
      delete the DFun binders from the usage.  So I added that.
    
    Practically zero perf change across the board, except that we get more
    compiler allocation in T3064 (which is compiled with -O0). There's a
    good reason: we get better code.  But there are lots of other small
    compiler allocation decreases:
    
    Metrics: compile_time/bytes allocated
    ---------------------
                                       Baseline
                   Test    Metric         value     New value Change
    -----------------------------------------------------------------
      PmSeriesG(normal) ghc/alloc    44,260,817    44,184,920  -0.2%
      PmSeriesS(normal) ghc/alloc    52,967,392    52,891,632  -0.1%
      PmSeriesT(normal) ghc/alloc    75,498,220    75,421,968  -0.1%
      PmSeriesV(normal) ghc/alloc    52,341,849    52,265,768  -0.1%
         T10421(normal) ghc/alloc   109,702,291   109,626,024  -0.1%
        T10421a(normal) ghc/alloc    76,888,308    76,809,896  -0.1%
         T10858(normal) ghc/alloc   125,149,038   125,073,648  -0.1%
         T11276(normal) ghc/alloc    94,159,364    94,081,640  -0.1%
        T11303b(normal) ghc/alloc    40,230,059    40,154,368  -0.2%
         T11822(normal) ghc/alloc   107,424,540   107,346,088  -0.1%
         T12150(optasm) ghc/alloc    76,486,339    76,426,152  -0.1%
         T12234(optasm) ghc/alloc    55,585,046    55,507,352  -0.1%
         T12425(optasm) ghc/alloc    88,343,288    88,265,312  -0.1%
         T13035(normal) ghc/alloc    98,919,768    98,845,600  -0.1%
     T13253-spj(normal) ghc/alloc   121,002,153   120,851,040  -0.1%
         T16190(normal) ghc/alloc   290,313,131   290,074,152  -0.1%
         T16875(normal) ghc/alloc    34,756,121    34,681,440  -0.2%
        T17836b(normal) ghc/alloc    45,198,100    45,120,288  -0.2%
         T17977(normal) ghc/alloc    39,479,952    39,404,112  -0.2%
        T17977b(normal) ghc/alloc    37,213,035    37,137,728  -0.2%
         T18140(normal) ghc/alloc    79,430,588    79,350,680  -0.1%
         T18282(normal) ghc/alloc   128,303,182   128,225,384  -0.1%
         T18304(normal) ghc/alloc    84,904,713    84,831,952  -0.1%
         T18923(normal) ghc/alloc    66,817,241    66,731,984  -0.1%
         T20049(normal) ghc/alloc    86,188,024    86,107,920  -0.1%
          T5837(normal) ghc/alloc    35,540,598    35,464,568  -0.2%
          T6048(optasm) ghc/alloc    99,812,171    99,736,032  -0.1%
          T9198(normal) ghc/alloc    46,380,270    46,304,984  -0.2%
    
              geo. mean                                        -0.0%
    
    Metric Increase:
        T3064
    074945de
    Two small improvements in the Simplifier
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    As #20941 describes, this patch implements a couple of small
    fixes to the Simplifier.  They make a difference principally
    with -O0, so few people will notice.  But with -O0 they can
    reduce the number of Simplifer iterations.
    
    * In occurrence analysis we avoid making x = (a,b) into a loop breaker
      because we want to be able to inline x, or (more likely) do
      case-elimination. But HEAD does not treat
          x = let y = blah in (a,b)
      in the same way.  We should though, because we are going to float
      that y=blah out of the x-binding.  A one-line fix in OccurAnal.
    
    * The crucial function exprIsConApp_maybe uses getUnfoldingInRuleMatch
      (rightly) but the latter was deeply strange.  In HEAD, if
      rule-rewriting was off (-O0) we only looked inside stable
      unfoldings. Very stupid.  The patch simplifies.
    
    * I also noticed that in simplStableUnfolding we were failing to
      delete the DFun binders from the usage.  So I added that.
    
    Practically zero perf change across the board, except that we get more
    compiler allocation in T3064 (which is compiled with -O0). There's a
    good reason: we get better code.  But there are lots of other small
    compiler allocation decreases:
    
    Metrics: compile_time/bytes allocated
    ---------------------
                                       Baseline
                   Test    Metric         value     New value Change
    -----------------------------------------------------------------
      PmSeriesG(normal) ghc/alloc    44,260,817    44,184,920  -0.2%
      PmSeriesS(normal) ghc/alloc    52,967,392    52,891,632  -0.1%
      PmSeriesT(normal) ghc/alloc    75,498,220    75,421,968  -0.1%
      PmSeriesV(normal) ghc/alloc    52,341,849    52,265,768  -0.1%
         T10421(normal) ghc/alloc   109,702,291   109,626,024  -0.1%
        T10421a(normal) ghc/alloc    76,888,308    76,809,896  -0.1%
         T10858(normal) ghc/alloc   125,149,038   125,073,648  -0.1%
         T11276(normal) ghc/alloc    94,159,364    94,081,640  -0.1%
        T11303b(normal) ghc/alloc    40,230,059    40,154,368  -0.2%
         T11822(normal) ghc/alloc   107,424,540   107,346,088  -0.1%
         T12150(optasm) ghc/alloc    76,486,339    76,426,152  -0.1%
         T12234(optasm) ghc/alloc    55,585,046    55,507,352  -0.1%
         T12425(optasm) ghc/alloc    88,343,288    88,265,312  -0.1%
         T13035(normal) ghc/alloc    98,919,768    98,845,600  -0.1%
     T13253-spj(normal) ghc/alloc   121,002,153   120,851,040  -0.1%
         T16190(normal) ghc/alloc   290,313,131   290,074,152  -0.1%
         T16875(normal) ghc/alloc    34,756,121    34,681,440  -0.2%
        T17836b(normal) ghc/alloc    45,198,100    45,120,288  -0.2%
         T17977(normal) ghc/alloc    39,479,952    39,404,112  -0.2%
        T17977b(normal) ghc/alloc    37,213,035    37,137,728  -0.2%
         T18140(normal) ghc/alloc    79,430,588    79,350,680  -0.1%
         T18282(normal) ghc/alloc   128,303,182   128,225,384  -0.1%
         T18304(normal) ghc/alloc    84,904,713    84,831,952  -0.1%
         T18923(normal) ghc/alloc    66,817,241    66,731,984  -0.1%
         T20049(normal) ghc/alloc    86,188,024    86,107,920  -0.1%
          T5837(normal) ghc/alloc    35,540,598    35,464,568  -0.2%
          T6048(optasm) ghc/alloc    99,812,171    99,736,032  -0.1%
          T9198(normal) ghc/alloc    46,380,270    46,304,984  -0.2%
    
              geo. mean                                        -0.0%
    
    Metric Increase:
        T3064
Loading