Re: [GHC] #7198: New codegen more than doubles compile time of T3294

#7198: New codegen more than doubles compile time of T3294 -------------------------------------+------------------------------------- Reporter: simonmar | Owner: simonmar Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.4.2 (CodeGen) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: #4258 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): Distinguish between * Global registers, like R1, Sp, which are part of the calling convention, and live in fixed places * Local registers, written `x`, `y`, etc in Cmm, which are just like local variables in a programming language. There are an infinite number of them. You can't take their address. We do indeed generate loads into a local register at the start; but we expect those loads to sink downstream to their use sites, so they don't necessarily cause register pressure. It's not safe to replace them with memory loads. Example {{{ x = R1[4] call f( p, q ) ...use x... }}} We must save `x` on the stack across the call. R1 is involved in f's calling convention, so it may well change a lot. Indeed any modification to R1 is going to invalidate your saved "x = R1[4]" delayed load. Plus the double-load efficiency problem that Simon mentions. Better to load into a local variable and then sink it. Does that make sense? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/7198#comment:13 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler
participants (1)
-
GHC