# Changes between Version 25 and Version 26 of Commentary/Compiler/NewCodeGenStupidity

Show
Ignore:
Timestamp:
04/27/11 02:57:20 (2 years ago)
Comment:

Unmodified
Removed
Modified
• ## Commentary/Compiler/NewCodeGenStupidity

v25 v26
282282== Stupid spills ==
283283
284 If something is already in memory, why do we have to spill it again? Well, it's because the spiller isn't clever enough:
284If something is already in memory, why do we have to spill it again?
285
286{{{
287module Foo where
288foo a b c d e f g h
289    = case baz a of
290        True -> bar a b c d e f g h
291        False -> 0
292
293baz 3 = True
294baz _ = False
295bar a b c d e f g h = a * b + c * d + e * f * g * h
296}}}
297
298Well, it's because the spiller isn't clever enough:
285299
286300{{{

329343}}}
330344
331 Ick!
345Ick! The old codegen was much better...
346
347{{{
348Foo.foo_entry()
349        { [const Foo.foo_slow-Foo.foo_info;, const 9;,
350       const Foo.foo_srt-Foo.foo_info;, const 589824;, const 0;,
351const 196623;]
352        }
353    cqM:
354        if ((Sp + -12) < I32[BaseReg + 84]) goto cqO;
355        I32[Sp - 8] = I32[Sp + 4];
356        I32[Sp - 12] = I32[Sp + 0];
357        I32[Sp - 4] = smz_info;
358        Sp = Sp - 12;
359        jump Foo.baz_info ();
360    cqO:
361        R1 = Foo.foo_closure;
362        Sp = Sp + 0;
363        jump (I32[BaseReg - 4]) ();
364}
365
366smz_ret()
367        { [const Foo.foo_srt-smz_info;, const 9;, const 65568;]
368        }
369    cqx:
370        if (R1 & 3 >= 2) goto cqC;
371        Hp = Hp + 8;
372        if (Hp > I32[BaseReg + 92]) goto cqA;
373        I32[Hp - 4] = sat_smA_info;
374        I32[Sp + 36] = Hp - 4;
375        I32[Sp + 32] = stg_ap_p_info;
376        I32[Sp + 28] = I32[Sp + 4];
377        Sp = Sp + 28;
378        jump GHC.Num.fromInteger_info ();
379    cqC:
380        Sp = Sp + 4;
381        jump Foo.bar_info ();
382    cqB: jump (I32[BaseReg - 8]) ();
383    cqA:
384        I32[BaseReg + 112] = 8;
385        goto cqB;
386}
387}}}