
#8326: Place heap checks common in case alternatives before the case -------------------------------------+------------------------------------- Reporter: jstolarek | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.7 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: 8317 Related Tickets: #1498 | Differential Revisions: Phab:D343 -------------------------------------+------------------------------------- Comment (by bgamari): Simon, indeed tying the knot would at very least require that two labels be unconditionally allocated and carried rather deeply into `StgCmmHeap`. Another issue is `heapCheck`, which is itself monadic as it ends up calling `getHeapUsage`. My initial thought was that `maybeAltHeapCheck` could look something like, {{{#!hs maybeAltHeapCheck :: (GcPlan,ReturnKind) -> FCode a -> FCode a maybeAltHeapCheck gc_plan code = do label1 <- allocLabelC label2 <- allocLabelC getHeapUsage $ \hpHw -> do emit $ case gc_plan of (NoGcInAlts, _) -> emptyOL (GcInAlts regs, AssignedDirectly) -> ... (GcInAlts regs, ReturnedTo lref off) -> ... code }}} Unfortunately this becomes quite invasive as you must pass those labels and the `CgInfoDownwards` pretty deeply into `StgCmmHeap`. It may be that a refactoring will help here but it seems a bit messy. In summary, as far as I can see there are several paths through the case alternative heap-check code (the code path column below shows the number of `newLabelC`s appearing in each function in parentheses), ||= `gc_plan` =||= `ret_kind` =||= canned entrypt =||= labels needed =||= code path =|| || `NoGcInAlts` || * || * || 0 || just run the code || || `GcInAlts` || `AssignedDirectly` || no || 1 || `altOrNoEscapeHeapCheck` -> `genericGC` (1) || || `GcInAlts` || `AssignedDirectly` || yes || 2 || `altOrNoEscapeHeapCheck` (2) -> `cannedGCReturnsTo` -> `heapCheck` || || `GcInAlts` || `ReturnedTo` || no || 1 || `altHeapCheckReturnsTo` -> `genericGC` (1) -> `heapCheck` || || `GcInAlts` || `ReturnedTo` || yes || 0 || `altHeapCheckReturnsTo` -> `cannedGCReturnsTo` -> `heapCheck` || -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8326#comment:29 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler