
#9660: unnecessary indirect jump when returning a case scrutinee -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.3 (CodeGen) | Keywords: Resolution: | Architecture: Unknown/Multiple Operating System: | Difficulty: Unknown Unknown/Multiple | Blocked By: Type of failure: Runtime | Related Tickets: performance bug | Test Case: | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Changes (by rwbarton): * cc: dfeuer (removed) Comment: In fact it doesn't seem strictly necessary to add a new constructor to LambdaFormInfo... this proof-of-concept patch validates and produces the expected improved Cmm; nofib coming next... {{{ diff --git a/compiler/codeGen/StgCmmClosure.hs b/compiler/codeGen/StgCmmClosure.hs index b65d56b..df0f6be 100644 --- a/compiler/codeGen/StgCmmClosure.hs +++ b/compiler/codeGen/StgCmmClosure.hs @@ -22,7 +22,7 @@ module StgCmmClosure ( LambdaFormInfo, -- Abstract StandardFormInfo, -- ...ditto... mkLFThunk, mkLFReEntrant, mkConLFInfo, mkSelectorLFInfo, - mkApLFInfo, mkLFImported, mkLFArgument, mkLFLetNoEscape, + mkApLFInfo, mkLFImported, mkLFArgument, mkLFLetNoEscape, mkLFUnknownCon, lfDynTag, maybeIsLFCon, isLFThunk, isLFReEntrant, lfUpdatable, @@ -241,6 +241,9 @@ mkLFThunk thunk_ty top fvs upd_flag NonStandardThunk (might_be_a_function thunk_ty) +mkLFUnknownCon :: LambdaFormInfo +mkLFUnknownCon = LFCon $ error "tried to access constructor of case binder at compile time" + -------------- might_be_a_function :: Type -> Bool -- Return False only if we are *sure* it's a data type diff --git a/compiler/codeGen/StgCmmExpr.hs b/compiler/codeGen/StgCmmExpr.hs index b2b64f8..6b6ffef 100644 --- a/compiler/codeGen/StgCmmExpr.hs +++ b/compiler/codeGen/StgCmmExpr.hs @@ -441,7 +441,11 @@ cgCase scrut bndr alt_type alts ; let sequel = AssignTo alt_regs do_gc{- Note [scrut sequel] -} ; ret_kind <- withSequel sequel (cgExpr scrut) ; restoreCurrentCostCentre mb_cc - ; _ <- bindArgsToRegs ret_bndrs + ; case alt_type of + AlgAlt _ -> case ret_bndrs of + [ret_bndr] -> void $ bindToReg ret_bndr mkLFUnknownCon + _ -> error "wat" + _ -> void $ bindArgsToRegs ret_bndrs ; cgAlts (gc_plan,ret_kind) (NonVoid bndr) alt_type alts } }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9660#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler