| | 388 | |
| | 389 | == Noppy proc-points == |
| | 390 | |
| | 391 | Consider |
| | 392 | |
| | 393 | {{{ |
| | 394 | f :: Int -> Int -> Int -> Int |
| | 395 | f a b c |
| | 396 | = let x = a + b |
| | 397 | y = b + c |
| | 398 | z = a + c |
| | 399 | in x `seq` case g x y z of |
| | 400 | True -> x |
| | 401 | False -> 0 |
| | 402 | |
| | 403 | {-# NOINLINE g #-} |
| | 404 | g :: Int -> Int -> Int -> Bool |
| | 405 | g x y 0 = x == y |
| | 406 | g _ _ _ = False |
| | 407 | }}} |
| | 408 | |
| | 409 | {{{ |
| | 410 | cnm: |
| | 411 | // directEntry else |
| | 412 | // emitCall: Sequel: Assign |
| | 413 | I32[(young<cmM> + 8)] = base_GHCziNum_zdfNumInt_closure; |
| | 414 | I32[(young<cmM> + 4)] = cmM; |
| | 415 | call base_GHCziNum_zp_info(...) returns to Just cmM (8) (4) with update frame 4; |
| | 416 | cmM: |
| | 417 | _cmN::I32 = R1; |
| | 418 | // slow_call for _cmN::I32 with pat stg_ap_pp |
| | 419 | R1 = _cmN::I32; |
| | 420 | // emitCall: Sequel: Assign |
| | 421 | I32[(young<cmP> + 8)] = _skO::I32; |
| | 422 | I32[(young<cmP> + 12)] = _skN::I32; |
| | 423 | I32[(young<cmP> + 4)] = cmP; |
| | 424 | call stg_ap_pp_fast(...) returns to Just cmP (12) (4) with update frame 4; |
| | 425 | }}} |
| | 426 | |
| | 427 | We generate an extra proc-point for ``cmM``, where in theory we ought to be able to stick the subsequent ``stg_ap_pp_fast`` onto the stack as another return point. |