[GHC] #8860: Optimized Cmm isn't
GHC
ghc-devs at haskell.org
Sat Mar 8 08:50:42 UTC 2014
#8860: Optimized Cmm isn't
-------------------------------------+------------------------------------
Reporter: tibbe | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Description changed by tibbe:
Old description:
> The optimizer seems to miss very basic optimizations. For example, look
> at this segment (full source below):
>
> {{{
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64,
> _c1Cf::I64);
> }}}
>
> I'd expect all these temporaries (that are only used once) to be inlined,
> but they are not and thus we fail to see the static arguments to the
> `MO_Memset` call, which leads to further missed optimizations.
>
> This used to work in the old codegen.
>
> Furthermore, there are useless basic blocks in the output:
>
> {{{
> c1Cm:
> goto c1C4;
> c1C4:
> }}}
>
> I'd expect them to be eliminated.
>
> .dump-cmm file:
>
> {{{
> ==================== Cmm produced by new codegen ====================
> 2014-03-08 08:25:31.728672 UTC
>
> [section "data" {
> a_r1za_closure:
> const a_r1za_info;
> },
> a_r1za_entry() // []
> { info_tbl: [(c1Cm,
> label: a_r1za_info
> rep:HeapRep static { Fun {arity: 1 fun_type:
> ArgSpec 3} })]
> stack_info: arg_space: 8 updfr_space: Just 8
> }
> {offset
> c1Cm:
> goto c1C4;
> c1C4:
> if ((old + 0) - <highSp> < SpLim) goto c1Cp; else goto c1Cq;
> c1Cq:
> goto c1C3;
> c1C3:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto
> c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64,
> _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> goto c1Ch;
> c1Ch:
> _s1C1::P64 = _s1BY::P64;
> goto c1Ck;
> c1Ck:
> R1 = ()_closure+1;
> call (P64[(old + 8)])(R1) args: 8, res: 0, upd: 8;
> }
> }]
>
> ==================== Post control-flow optimisations ====================
> 2014-03-08 08:25:31.729764 UTC
>
> {offset
> c1Cm:
> if ((old + 0) - <highSp> < SpLim) goto c1Cp; else goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> _s1C1::P64 = _s1BY::P64;
> R1 = ()_closure+1;
> call (P64[(old + 8)])(R1) args: 8, res: 0, upd: 8;
> }
>
> ==================== Layout Stack ====================
> 2014-03-08 08:25:31.730253 UTC
>
> {offset
> c1Cm:
> goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> _s1C1::P64 = _s1BY::P64;
> R1 = ()_closure+1;
> call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
> }
>
> ==================== CAFEnv ====================
> 2014-03-08 08:25:31.73074 UTC
>
> [(c1C8, {}), (c1C9, {}), (c1Ca, {}), (c1Cm, {}), (c1Cp, {}),
> (c1Cq, {}), (c1Cr, {}), (c1Cs, {})]
>
> ==================== after setInfoTableStackMap ====================
> 2014-03-08 08:25:31.730895 UTC
>
> a_r1za_entry() // []
> { info_tbl: [(c1Cm,
> label: a_r1za_info
> rep:HeapRep static { Fun {arity: 1 fun_type:
> ArgSpec 3} })]
> stack_info: arg_space: 8 updfr_space: Just 8
> }
> {offset
> c1Cm:
> goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> _s1C1::P64 = _s1BY::P64;
> R1 = ()_closure+1;
> call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
> }
> }
>
> ==================== Post control-flow optimisations ====================
> 2014-03-08 08:25:31.731383 UTC
>
> a_r1za_entry() // []
> { info_tbl: [(c1Cm,
> label: a_r1za_info
> rep:HeapRep static { Fun {arity: 1 fun_type:
> ArgSpec 3} })]
> stack_info: arg_space: 8 updfr_space: Just 8
> }
> {offset
> c1Cm:
> goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> _s1C1::P64 = _s1BY::P64;
> R1 = ()_closure+1;
> call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
> }
> }
>
> ==================== Post CPS Cmm ====================
> 2014-03-08 08:25:31.731772 UTC
>
> [section "data" {
> a_r1za_closure:
> const a_r1za_info;
> },
> a_r1za_entry() // []
> { info_tbl: [(c1Cm,
> label: a_r1za_info
> rep:HeapRep static { Fun {arity: 1 fun_type:
> ArgSpec 3} })]
> stack_info: arg_space: 8 updfr_space: Just 8
> }
> {offset
> c1Cm:
> goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto
> c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64,
> _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> _s1C1::P64 = _s1BY::P64;
> R1 = ()_closure+1;
> call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
> }
> }]
>
> ==================== Output Cmm ====================
> 2014-03-08 08:25:31.73228 UTC
>
> [section "data" {
> a_r1za_closure:
> const a_r1za_info;
> },
> a_r1za_entry() // []
> { info_tbl: [(c1Cm,
> label: a_r1za_info
> rep:HeapRep static { Fun {arity: 1 fun_type:
> ArgSpec 3} })]
> stack_info: arg_space: 8 updfr_space: Just 8
> }
> {offset
> c1Cm:
> goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > HpLim) goto c1Cs; else goto c1Cr;
> c1Cs:
> HpAlloc = 152;
> goto c1Cp;
> c1Cp:
> R1 = a_r1za_closure;
> call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto
> c1C9;
> c1Ca:
> P64[_c1C7::I64] = ()_closure+1;
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64,
> _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> _s1BY::P64 = _s1BY::P64;
> _s1C1::P64 = _s1BY::P64;
> R1 = ()_closure+1;
> call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
> }
> }]
> }}}
>
> .dump-opt-cmm file:
> {{{
> ==================== Optimised Cmm ====================
> 2014-03-08 08:25:31.732971 UTC
>
> a_r1za_entry() // []
> { [(c1Cm,
> a_r1za_info:
> const 4294967299;
> const 0;
> const 15;)]
> }
> {offset
> c1Cm:
> goto c1Cq;
> c1Cq:
> Hp = Hp + 152;
> if (Hp > I64[BaseReg + 856]) goto c1Cs; else goto c1Cr;
> c1Cs:
> I64[BaseReg + 904] = 152;
> goto c1Cp;
> c1Cp:
> R1 = PicBaseReg + a_r1za_closure;
> call (I64[BaseReg - 8])(R1) args: 8, res: 0, upd: 8;
> c1Cr:
> I64[Hp - 144] = I64[PicBaseReg +
> stg_MUT_ARR_PTRS_DIRTY_info at GOTPCREL];
> I64[Hp - 136] = 16;
> I64[Hp - 128] = 16;
> _c1C6::I64 = Hp - 144;
> _c1C7::I64 = _c1C6::I64 + 24;
> goto c1C8;
> c1C8:
> if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
> c1Ca:
> I64[_c1C7::I64] = PicBaseReg + (()_closure+1);
> _c1C7::I64 = _c1C7::I64 + 8;
> goto c1C8;
> c1C9:
> _c1Cb::I64 = _c1C6::I64 + 24;
> _c1Cc::I64 = _c1Cb::I64 + 128;
> _c1Cd::I64 = 0;
> _c1Ce::I64 = 0;
> _c1Cf::I64 = 8;
> call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
> _s1BY::P64 = _c1C6::I64;
> // nop
> _s1C1::P64 = _s1BY::P64;
> R1 = PicBaseReg + (()_closure+1);
> call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
> }
> }
> }}}
New description:
The optimizer seems to miss very basic optimizations. For example, look at
this segment (full source below):
{{{
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
}}}
I'd expect all these temporaries (that are only used once) to be inlined,
but they are not and thus we fail to see the static arguments to the
`MO_Memset` call, which leads to further missed optimizations.
This used to work in the old codegen.
Furthermore, there are useless basic blocks in the output:
{{{
c1Cm:
goto c1C4;
c1C4:
}}}
I'd expect them to be eliminated.
Here's another non-sensical sequence:
{{{
_s1BY::P64 = _c1C6::I64;
// nop
_s1C1::P64 = _s1BY::P64;
}}}
Neither of these temporaries are ever used.
.dump-cmm file:
{{{
==================== Cmm produced by new codegen ====================
2014-03-08 08:25:31.728672 UTC
[section "data" {
a_r1za_closure:
const a_r1za_info;
},
a_r1za_entry() // []
{ info_tbl: [(c1Cm,
label: a_r1za_info
rep:HeapRep static { Fun {arity: 1 fun_type:
ArgSpec 3} })]
stack_info: arg_space: 8 updfr_space: Just 8
}
{offset
c1Cm:
goto c1C4;
c1C4:
if ((old + 0) - <highSp> < SpLim) goto c1Cp; else goto c1Cq;
c1Cq:
goto c1C3;
c1C3:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
goto c1Ch;
c1Ch:
_s1C1::P64 = _s1BY::P64;
goto c1Ck;
c1Ck:
R1 = ()_closure+1;
call (P64[(old + 8)])(R1) args: 8, res: 0, upd: 8;
}
}]
==================== Post control-flow optimisations ====================
2014-03-08 08:25:31.729764 UTC
{offset
c1Cm:
if ((old + 0) - <highSp> < SpLim) goto c1Cp; else goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
_s1C1::P64 = _s1BY::P64;
R1 = ()_closure+1;
call (P64[(old + 8)])(R1) args: 8, res: 0, upd: 8;
}
==================== Layout Stack ====================
2014-03-08 08:25:31.730253 UTC
{offset
c1Cm:
goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
_s1C1::P64 = _s1BY::P64;
R1 = ()_closure+1;
call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
}
==================== CAFEnv ====================
2014-03-08 08:25:31.73074 UTC
[(c1C8, {}), (c1C9, {}), (c1Ca, {}), (c1Cm, {}), (c1Cp, {}),
(c1Cq, {}), (c1Cr, {}), (c1Cs, {})]
==================== after setInfoTableStackMap ====================
2014-03-08 08:25:31.730895 UTC
a_r1za_entry() // []
{ info_tbl: [(c1Cm,
label: a_r1za_info
rep:HeapRep static { Fun {arity: 1 fun_type: ArgSpec
3} })]
stack_info: arg_space: 8 updfr_space: Just 8
}
{offset
c1Cm:
goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
_s1C1::P64 = _s1BY::P64;
R1 = ()_closure+1;
call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
}
}
==================== Post control-flow optimisations ====================
2014-03-08 08:25:31.731383 UTC
a_r1za_entry() // []
{ info_tbl: [(c1Cm,
label: a_r1za_info
rep:HeapRep static { Fun {arity: 1 fun_type: ArgSpec
3} })]
stack_info: arg_space: 8 updfr_space: Just 8
}
{offset
c1Cm:
goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
_s1C1::P64 = _s1BY::P64;
R1 = ()_closure+1;
call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
}
}
==================== Post CPS Cmm ====================
2014-03-08 08:25:31.731772 UTC
[section "data" {
a_r1za_closure:
const a_r1za_info;
},
a_r1za_entry() // []
{ info_tbl: [(c1Cm,
label: a_r1za_info
rep:HeapRep static { Fun {arity: 1 fun_type:
ArgSpec 3} })]
stack_info: arg_space: 8 updfr_space: Just 8
}
{offset
c1Cm:
goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
_s1C1::P64 = _s1BY::P64;
R1 = ()_closure+1;
call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
}
}]
==================== Output Cmm ====================
2014-03-08 08:25:31.73228 UTC
[section "data" {
a_r1za_closure:
const a_r1za_info;
},
a_r1za_entry() // []
{ info_tbl: [(c1Cm,
label: a_r1za_info
rep:HeapRep static { Fun {arity: 1 fun_type:
ArgSpec 3} })]
stack_info: arg_space: 8 updfr_space: Just 8
}
{offset
c1Cm:
goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > HpLim) goto c1Cs; else goto c1Cr;
c1Cs:
HpAlloc = 152;
goto c1Cp;
c1Cp:
R1 = a_r1za_closure;
call (stg_gc_fun)(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = stg_MUT_ARR_PTRS_DIRTY_info;
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
P64[_c1C7::I64] = ()_closure+1;
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
_s1BY::P64 = _s1BY::P64;
_s1C1::P64 = _s1BY::P64;
R1 = ()_closure+1;
call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
}
}]
}}}
.dump-opt-cmm file:
{{{
==================== Optimised Cmm ====================
2014-03-08 08:25:31.732971 UTC
a_r1za_entry() // []
{ [(c1Cm,
a_r1za_info:
const 4294967299;
const 0;
const 15;)]
}
{offset
c1Cm:
goto c1Cq;
c1Cq:
Hp = Hp + 152;
if (Hp > I64[BaseReg + 856]) goto c1Cs; else goto c1Cr;
c1Cs:
I64[BaseReg + 904] = 152;
goto c1Cp;
c1Cp:
R1 = PicBaseReg + a_r1za_closure;
call (I64[BaseReg - 8])(R1) args: 8, res: 0, upd: 8;
c1Cr:
I64[Hp - 144] = I64[PicBaseReg +
stg_MUT_ARR_PTRS_DIRTY_info at GOTPCREL];
I64[Hp - 136] = 16;
I64[Hp - 128] = 16;
_c1C6::I64 = Hp - 144;
_c1C7::I64 = _c1C6::I64 + 24;
goto c1C8;
c1C8:
if (_c1C7::I64 < (_c1C6::I64 + 128)) goto c1Ca; else goto c1C9;
c1Ca:
I64[_c1C7::I64] = PicBaseReg + (()_closure+1);
_c1C7::I64 = _c1C7::I64 + 8;
goto c1C8;
c1C9:
_c1Cb::I64 = _c1C6::I64 + 24;
_c1Cc::I64 = _c1Cb::I64 + 128;
_c1Cd::I64 = 0;
_c1Ce::I64 = 0;
_c1Cf::I64 = 8;
call MO_Memset(_c1Cc::I64, _c1Cd::I64, _c1Ce::I64, _c1Cf::I64);
_s1BY::P64 = _c1C6::I64;
// nop
_s1C1::P64 = _s1BY::P64;
R1 = PicBaseReg + (()_closure+1);
call (P64[Sp])(R1) args: 8, res: 0, upd: 8;
}
}
}}}
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8860#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list