[GHC] #8971: Native Code Generator 7.8.1 RC2 is not as optimized as 7.6.3...

GHC ghc-devs at haskell.org
Fri Apr 25 06:23:36 UTC 2014


#8971: Native Code Generator 7.8.1 RC2 is not as optimized as 7.6.3...
--------------------------------------------+------------------------------
        Reporter:  GordonBGood              |            Owner:
            Type:  bug                      |           Status:  new
        Priority:  normal                   |        Milestone:
       Component:  Compiler (NCG)           |          Version:  7.8.1-rc2
      Resolution:                           |         Keywords:
Operating System:  Unknown/Multiple         |     Architecture:
 Type of failure:  Runtime performance bug  |  Unknown/Multiple
       Test Case:                           |       Difficulty:  Unknown
        Blocking:                           |       Blocked By:
                                            |  Related Tickets:
--------------------------------------------+------------------------------

Comment (by GordonBGood):

 Replying to [comment:11 jstolarek]:
 > I know nothing about 7.6 Cmm generation, but I worked on 7.8 Cmm
 pipeline this summer so I can offer some guidance. First I'd like to
 clarify a few things:

 Thanks for your explanations and clarifications, some of which I have dug
 out for myself in the last few minutes - I had already edit added
 something to the post to which you are replying:

 > > both NCG and LLVM will share the same C-- output
 >
 > No, they will not. LLVM backend requires "proc-point splitting". This
 means we need to turn every Cmm block that is succcesor of more than one
 block into a separate procedure (at least that is my understanding). See
 [https://github.com/ghc/ghc/blob/f8e12e2b396e0c475e1403ab8ac3fc4d63c1681e/compiler/cmm/CmmPipeline.hs#L104
 here] and
 [https://github.com/ghc/ghc/blob/f8e12e2b396e0c475e1403ab8ac3fc4d63c1681e/compiler/cmm/CmmPipeline.hs#L77
 here] to see source of differences between Cmm generated for both
 backends.
 [https://github.com/ghc/ghc/blob/f8e12e2b396e0c475e1403ab8ac3fc4d63c1681e/compiler/cmm/CmmProcPoint.hs#L35
 Here] you'll find more on proc-points.

 Learned something new here.  OK, end result is that using LLVM as a proof
 that the problem is in NCG because they use the same CMM code is invalid,
 so it was worth checking the CMM code.

 > > straight cmm dump has regressed to have lost even the basic
 optimizations that were there with the older version.
 >
 > I'm not sure what was the philosophy behind 7.6 Cmm geneartion but in
 7.8 we just generate Cmm from STG in the simplest possible way and then
 optimize that Cmm. This is similar to generating Core from Haskell and
 then doing a series of core-to-core transformations. So you need to look
 at the final Cmm, not the one that comes out from the Cmm->STG pass.

 OK, I dug that out for myself and now see that in the final pass the CMM
 code is almost identical for the code that triggers the symptom (other
 than for the constants recorded as 32-bit depth for 32-bit registers where
 they used to be recorded as 64-bit even though only 32-bits were used).

 > > It may be that the NCG is using the non-optimized version of CMM as a
 source
 >
 > It is using the optimized version. You can see for yourself in the
 [https://github.com/ghc/ghc/blob/f8e12e2b396e0c475e1403ab8ac3fc4d63c1681e/compiler/main/HscMain.hs#L1237
 tryNewCodeGen function] and its
 [https://github.com/ghc/ghc/blob/f8e12e2b396e0c475e1403ab8ac3fc4d63c1681e/compiler/main/HscMain.hs#L1159
 call site].

 OK, so given (almost) identical final CMM code, the problem is (likely)
 not in the CMM code but in the NCG.

 > >  Anticipating your next request to look at the STG output
 >
 > Wrong anticipation :-) Look at generated assembly. Only this can tell
 you what is the real difference between generated code. I wouldn't be
 surprised to see something in the lines of #8048.
 >
 > > Thus, the bug/regression appears to be go further back than just the
 new NCG (which is likely using the non-optimized CMM code as input) but
 also to the CMM code generator in that it is producing much less efficient
 CMM code.

 I had already posted the inner loop from the assembly as part of the
 original bug report; someone requested that I post CMM output, which shows
 it is not (likely) the problem and we are back to NCG as you confirm here.

 > Let me repeat: a) NCG is using optimized Cmm (look at the code); b)
 don't look at the un-optimized Cmm - it's irrelevant.

 Yup, you have made that clear:  I never want to look at CMM code ever
 again.

 > Finally, I you want to learn more about Cmm pipeline and Cmm debugging
 see [wiki:Commentary/Compiler/CodeGen].
 >
 > Hope that helps.

 Yes, I found that link on my own which is how I came to a fuller
 understanding of the contents of the new CMM file and its relationship to
 the final opt-cmm file.  But you have been most helpful in explaining that
 LLVM and NCG do not (can not) use the same CMM source.

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


More information about the ghc-tickets mailing list