
#11158: Combine exprIsTrivial and cpe_ExprIsTrivial -------------------------------------+------------------------------------- Reporter: simonpj | Owner: Type: task | Status: infoneeded Priority: highest | Milestone: 8.2.1 Component: Compiler | Version: 7.10.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Phab:D1656 Wiki Page: | -------------------------------------+------------------------------------- Comment (by nomeata): I get {{{ T11158.f :: forall a1_aDG a2_aDF t_aDp. t_aDp -> (GHC.Base.Maybe a2_aDF, GHC.Base.Maybe a1_aDG) [GblId, Arity=1, Caf=NoCafRefs, Unf=OtherCon []] = \r [x_sNH] let { sat_sNJ [Occ=Once] :: GHC.Base.Maybe a_aDG [LclId] = NO_CCS GHC.Base.Nothing! []; } in let { sat_sNI [Occ=Once] :: GHC.Base.Maybe a1_aDF [LclId] = NO_CCS GHC.Base.Nothing! []; } in (,) [sat_sNI sat_sNJ]; }}} and {{{ ==================== Output Cmm ==================== [section ""data" . T11158.f_closure" { T11158.f_closure: const T11158.f_info; }, T11158.f_entry() // [R2] { info_tbl: [(cNQ, label: T11158.f_info rep:HeapRep static { Fun {arity: 1 fun_type: ArgSpec 5} })] stack_info: arg_space: 8 updfr_space: Just 8 } {offset cNQ: _sNG::P64 = R2; goto cNS; cNS: Hp = Hp + 24; if (Hp > HpLim) goto cNU; else goto cNT; cNU: HpAlloc = 24; goto cNR; cNR: R2 = _sNG::P64; R1 = T11158.f_closure; call (stg_gc_fun)(R2, R1) args: 8, res: 0, upd: 8; cNT: I64[Hp - 16] = (,)_con_info; P64[Hp - 8] = GHC.Base.Nothing_closure+1; P64[Hp] = GHC.Base.Nothing_closure+1; _cNP::P64 = Hp - 15; R1 = _cNP::P64; call (P64[Sp])(R1) args: 8, res: 0, upd: 8; } }] }}} which looks reasonable, doesn’t it? But here is an interesting difference, which might be a clue. Before my patch: {{{ ==================== Output Cmm ==================== [section ""relreadonly" . SOb_srt" { SOb_srt: const GHC.Base.$fMonadIO_closure; }] }}} After my patch: {{{ ==================== Output Cmm ==================== [section ""relreadonly" . SNV_srt" { SNV_srt: const GHC.Base.Nothing_closure; const GHC.Base.$fMonadIO_closure; const sat_sNJ_closure; }] }}} Is it kosher to add a static constructor closure to the `srt` table? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11158#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler