
#5075: CPR optimisation for sum types if only one constructor is used ---------------------------------+------------------------------------------ Reporter: batterseapower | Owner: simonpj Type: feature request | Status: patch Priority: normal | Milestone: 7.6.2 Component: Compiler | Version: 7.0.3 Keywords: | Os: Unknown/Multiple Architecture: Unknown/Multiple | Failure: None/Unknown Difficulty: Unknown | Testcase: Blockedby: | Blocking: Related: | ---------------------------------+------------------------------------------ Comment(by parcs): I noticed that sum CPR does not trigger for this function, when it seems like it should: {{{ loop :: Int -> Maybe Int -> Maybe Int loop n x = case n of 0 -> x _ -> loop (n-1) (fmap (+1) x) }}} The specializations that the SpecConstr pass creates for this function seem to be perfect candidates for sum CPR: {{{ Rec { loop_$s$wloop loop_$s$wloop = \ sc_sop sc1_sor -> case sc_sop of ds_Xmj { __DEFAULT -> loop_$s$wloop (-# ds_Xmj 1) (case sc1_sor of _ { I# x_amE -> I# (+# x_amE 1) }); 0 -> Just sc1_sor } end Rec } Rec { loop_$s$wloop1 loop_$s$wloop1 = \ sc_soq -> case sc_soq of ds_Xmj { __DEFAULT -> loop_$s$wloop1 (-# ds_Xmj 1); 0 -> Nothing } end Rec } }}} Or am I mistaken? -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/5075#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler