We decided to solve this by removing the NOINLINE stuff from the 7.2 branch, 
rather than by merging all the rewrite rules. We have more to do on the Integer 
front; #5284, #5152.  Ian has the token on all of this.

Simon

| -----Original Message-----
| From: Ben Lippmeier [mailto:[email protected]]
| Sent: 01 August 2011 09:01
| To: Ian Lynagh
| Cc: [email protected] list; Roman Leshchinskiy; Manuel M T Chakravarty; 
Simon
| Peyton-Jones
| Subject: Re: [commit: integer-gmp] ghc-7.2: Don't inline most integer 
operations
| (9506f95)
| 
| 
| On 25/07/2011, at 4:27 AM, Ian Lynagh wrote:
| >
| > commit 9506f95ac32c91a9fa6ce659a4474d6f85e55268
| > Author: Ian Lynagh <[email protected]>
| > Date:   Sat Jul 23 17:56:40 2011 +0100
| >
| >    Don't inline most integer operations
| >
| >    We get lots of code, and the simplifier generally can't do much with
| >    it. We'll instead use builtin rules to do constant folding where
| >    possible.
| 
| 
| This patch completely breaks Repa and DPH programs. More than 6000% slowdown 
in some
| cases. The problem appears to be that constants in source programs are 
compiled via
| the Integer library, and if we have applications of floatFromInteger lying 
around
| then other things don't get inlined.
| 
| Here is some code from the final stage of the simplifier when compiling the 
Repa
| Sobel example:
| 
| 
| lvl4_r7Zh :: GHC.Integer.Type.Integer
| [GblId, Caf=NoCafRefs]
| lvl4_r7Zh = GHC.Integer.Type.S# 0
| 
| 
| lvl5_r7Zi :: Data.Array.Repa.Stencil.Base.Stencil Data.Array.Repa.Index.DIM2
| GHC.Types.Float
| [GblId, Str=DmdType]
| lvl5_r7Zi =
|   let { __DEFAULT ~ wild_a1NR <- GHC.Integer.Type.floatFromInteger lvl4_r7Zh 
} in
|   Data.Array.Repa.Stencil.Base.StencilStatic
|     @ Data.Array.Repa.Index.DIM2 @ GHC.Types.Float lvl2_r7Zf (GHC.Types.F# 
wild_a1NR)
| lvl3_r7Zg
| 
| 
| Solver.gradientX [InlPrag=NOINLINE] :: Solver.Image -> Solver.Image
| [GblId, Arity=1, Str=DmdType U(S(U(U()U(A))U(A))S)]
| Solver.gradientX =
|   \ (img_apv :: Solver.Image) ->
|   ...
|      ((\ (s_a1A8 :: GHC.Prim.State# GHC.Prim.RealWorld) ->
|       let { __DEFAULT ~ s'_a1A9 <- GHC.Prim.noDuplicate# s_a1A8 } in
|       let { Data.Array.Repa.Stencil.Base.StencilStatic sExtent_a1Oy zero_a1Oz
| load_a1OA ~ wild4_a1Ou <- lvl5_r7Zi } in
|       let { Data.Array.Repa.Index.:. ds5_s3sG sWidth_s3sH ~ _ <- sExtent_a1Oy 
} in
|       let { Data.Array.Repa.Index.:. ds1_a1SG sHeight_a1SH ~ _ <- ds5_s3sG } 
in
|       let { GHC.Types.I# ww_a2E9 ~ _ <- sHeight_a1SH } in
|       let { __DEFAULT ~ ww1_a2Eh <- GHC.Base.divInt# ww_a2E9 2 } in
|       let { GHC.Types.I# ww2_X2FJ ~ _ <- sWidth_s3sH } in
|       let { __DEFAULT ~ ww3_X2Fa <- GHC.Base.divInt# ww2_X2FJ 2 } in
|       ...
| 
| 
| The problem is that lvl5_r7Zi isn't being inlined anymore, which in turn 
means the
| constant zero_a1Oz and function bound to load_a1OA isn't being inlined 
either. This
| completely breaks follow-on fusion. Note that the lvl5_r7Zi binding itself 
was lifted
| out by the simplifier, so I can't attach an INLINE pragma to it to force it 
back in.
| 
| There is only that single use of lvl5_r7Zi in the program, and I compile Repa
| programs with the "-funfolding-use-threshold100 -funfolding-keeness-factor100"
| sledgehammer, so I don't know why it's not being inlined.
| 
| When I remove all the NOINLINEs from integer-gmp:GHC.Integer.Type it works 
again.
| 
| 
| Ben.
| 
| 
| 


_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to