[GHC] #13543: Improve demand analysis for join points

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

[GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
           Reporter:  simonpj        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Consider
 {{{
    g :: (Int,Int) -> Int
    g (p,q) = p+q

    f :: Int -> Int -> Int
    f x p = g (join j y = (p,y)
               in case x of
                    True  -> j 3
                    False -> j 4)
 }}}
 If `j` was a vanilla function definition, we'd analyse its body with
 `evalDmd`, and think that it was lazy in `p`.

 But for a join point we can do better.  We know that
 `j`'s body (if evaluated at all) will be evaluated with the demand that
 consumes the entire
 join-binding, in this case the argument demand from `g`.  Whizzo!  `g`
 evaluates both components of its arugment pair, so j is strict in `p`.

 So, when analysing a join point, we can analyse its body with the
 demand from the entire join-binding.  Another
 win for join points!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * keywords:   => JoinPoints


--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
In reply to this post by GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Simon Peyton Jones <simonpj@…>):

 In [changeset:"b5b7d820afd8fca098bf1f4a7380d425ca6be31d/ghc" b5b7d82/ghc]:
 {{{
 #!CommitTicketReference repository="ghc"
 revision="b5b7d820afd8fca098bf1f4a7380d425ca6be31d"
 Improve demand analysis for join points

 I realised (Trac #13543) that we can improve demand analysis for
 join point quite straightforwardly.

 The idea is explained in
     Note [Demand analysis for join points]
 in DmdAnal
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
In reply to this post by GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * status:  new => closed
 * resolution:   => fixed


Comment:

 Done.  No visible effect on nofib, but still good.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
In reply to this post by GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by alpmestan):

 When running `./validate --slow`, I found out that the `T13543` test fails
 with all 3 of these ways: `hpc`, `optasm`, `optllvm`.

 {{{
 =====> T13543(hpc) 1 of 1 [0, 0, 0]
 cd "./simplCore/should_compile/T13543.run" &&  "/home/alp/ghc/inplace/test
 spaces/ghc-stage2" -c T13543.hs -dcore-lint -dcmm-lint -no-user-package-db
 -rtsopts -fno-warn-missed-specialisations -fshow-warning-groups
 -fdiagnostics-color=never -fno-diagnostics-show-caret -dno-debug-output
 -O -fhpc -ddump-str-signatures
 Actual stderr output differs from expected:
 diff -uw "./simplCore/should_compile/T13543.run/T13543.stderr.normalised"
 "./simplCore/should_compile/T13543.run/T13543.comp.stderr.normalised"
 --- ./simplCore/should_compile/T13543.run/T13543.stderr.normalised
 2018-03-08 14:13:19.867965000 +0100
 +++ ./simplCore/should_compile/T13543.run/T13543.comp.stderr.normalised
 2018-03-08 14:13:19.867965000 +0100
 @@ -1 +1,12 @@

 +==================== Strictness signatures ====================
 +Foo.$trModule: m
 +Foo.f: <S(S),1*U(1*U)><L,1*U><L,1*U>m
 +Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 +
 +
 +
 +==================== Strictness signatures ====================
 +Foo.$trModule: m
 +Foo.f: <S(S),1*U(1*U)><L,1*U><L,1*U>m
 +Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 *** unexpected failure for T13543(hpc)
 }}}

 {{{
 =====> T13543(optasm) 1 of 1 [0, 0, 0]
 cd "./simplCore/should_compile/T13543.run" &&  "/home/alp/ghc/inplace/test
 spaces/ghc-stage2" -c T13543.hs -dcore-lint -dcmm-lint -no-user-package-db
 -rtsopts -fno-warn-missed-specialisations -fshow-warning-groups
 -fdiagnostics-color=never -fno-diagnostics-show-caret -dno-debug-output
 -O -fasm -ddump-str-signatures
 Actual stderr output differs from expected:
 diff -uw "./simplCore/should_compile/T13543.run/T13543.stderr.normalised"
 "./simplCore/should_compile/T13543.run/T13543.comp.stderr.normalised"
 --- ./simplCore/should_compile/T13543.run/T13543.stderr.normalised
 2018-03-08 14:16:02.367965000 +0100
 +++ ./simplCore/should_compile/T13543.run/T13543.comp.stderr.normalised
 2018-03-08 14:16:02.367965000 +0100
 @@ -1 +1,12 @@

 +==================== Strictness signatures ====================
 +Foo.$trModule: m
 +Foo.f: <S(S),1*U(1*U)><S(S),1*U(U)><S(S),1*U(U)>m
 +Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 +
 +
 +
 +==================== Strictness signatures ====================
 +Foo.$trModule: m
 +Foo.f: <S(S),1*U(1*U)><S(S),1*U(U)><S(S),1*U(U)>m
 +Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 *** unexpected failure for T13543(optasm)
 }}}

 {{{
 =====> T13543(optllvm) 1 of 1 [0, 0, 0]
 cd "./simplCore/should_compile/T13543.run" &&  "/home/alp/ghc/inplace/test
 spaces/ghc-stage2" -c T13543.hs -dcore-lint -dcmm-lint -no-user-package-db
 -rtsopts -fno-warn-missed-specialisations -fshow-warning-groups
 -fdiagnostics-color=never -fno-diagnostics-show-caret -dno-debug-output
 -O -fllvm -ddump-str-signatures
 Actual stderr output differs from expected:
 diff -uw "./simplCore/should_compile/T13543.run/T13543.stderr.normalised"
 "./simplCore/should_compile/T13543.run/T13543.comp.stderr.normalised"
 --- ./simplCore/should_compile/T13543.run/T13543.stderr.normalised
 2018-03-08 14:16:28.627965000 +0100
 +++ ./simplCore/should_compile/T13543.run/T13543.comp.stderr.normalised
 2018-03-08 14:16:28.627965000 +0100
 @@ -1 +1,12 @@

 +==================== Strictness signatures ====================
 +Foo.$trModule: m
 +Foo.f: <S(S),1*U(1*U)><S(S),1*U(U)><S(S),1*U(U)>m
 +Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 +
 +
 +
 +==================== Strictness signatures ====================
 +Foo.$trModule: m
 +Foo.f: <S(S),1*U(1*U)><S(S),1*U(U)><S(S),1*U(U)>m
 +Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 *** unexpected failure for T13543(optllvm)
 }}}

 In all 3 cases, we're expecting an empty stderr (that we get with other
 ways like `normal`) but we instead get the strictness signatures dumped
 there, because of the flag that we pass to ghc:

 {{{
 test('T13543', normal, compile, ['-ddump-str-signatures'])
 }}}

 Should I just strip that flag so that these tests pass? It's still odd
 that say `normal` and `optasm` dump things in different places, isn't it?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
In reply to this post by GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by bgamari):

 Hmm, I think the expected test output might just be wrong: the stderr
 output is empty in the `normal` way because GHC is invoked without
 optimisation enabled in that way. I believe the test was supposed to
 expect non-empty output.

 I suspect we should only be running this test in the `optasm` way (since
 the other ways will inevitably differ in their strictness signatures) and
 update the output accordingly. We should ask Simon to look over the new
 output before committing.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
In reply to this post by GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by alpmestan):

 OK, I'll include this change in my WIP testsuite expectations changes
 patch and ask Simon about the "new" expected output (see below for the
 program & output).

 {{{#!hs
 {-# LANGUAGE RankNTypes, GADTs #-}

 module Foo where

 g :: (Int, Int) -> Int
 {-# NOINLINE g #-}
 g (p,q) = p+q

 f :: Int -> Int -> Int -> Int
 f x p q
   = g (let j y = (p,q)
            {-# NOINLINE j #-}
           in
           case x of
             2 -> j 3
             _ -> j 4)
 }}}

 {{{
 ==================== Strictness signatures ====================
 Foo.$trModule: m
 Foo.f: <S(S),1*U(1*U)><S(S),1*U(U)><S(S),1*U(U)>m
 Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m



 ==================== Strictness signatures ====================
 Foo.$trModule: m
 Foo.f: <S(S),1*U(1*U)><S(S),1*U(U)><S(S),1*U(U)>m
 Foo.g: <S(S(S)S(S)),1*U(1*U(U),1*U(U))>m
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets
Reply | Threaded
Open this post in threaded view
|

Re: [GHC] #13543: Improve demand analysis for join points

GHC - devs mailing list
In reply to this post by GHC - devs mailing list
#13543: Improve demand analysis for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by alpmestan):

 * cc: alpmestan (added)


--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13543#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
ghc-tickets mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets