
#12028: Large let bindings are 6x slower (since 6.12.x to 7.10.x) -------------------------------------+------------------------------------- Reporter: tommd | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by bgamari): * cc: simonmar (added) Comment: Cc'ing Simon Marlow, who is quite familiar with the sinking pass. Indeed this example produces an extremely large amount of code (around 2700 lines of C--) in `applyMD5Rounds`. Indeed the sink pass does do a significantly amount of fiddling with this code. For instance, prior to sinking much of the code for this function is bit twiddling, {{{ _cbnY::I64 = _s9Sn::I64 ^ 4294967295; _s9WQ::I64 = _cbnY::I64; _cbo1::I64 = _s9WQ::I64 & _s9Sp::I64; _s9WR::I64 = _cbo1::I64; _cbo4::I64 = _s9Sn::I64 & _s9So::I64; _s9WP::I64 = _cbo4::I64; _cbo7::I64 = _s9WP::I64 | _s9WR::I64; _s9WS::I64 = _cbo7::I64; _cboa::I64 = _s9WS::I64 + _s9SG::I64; _s9WT::I64 = _cboa::I64; _cbod::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9WT::I64)); _s9WU::I64 = _cbod::I64; _cbog::I64 = _s9WU::I64 + 3614090360; _s9WV::I64 = _cbog::I64; _cboj::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9WV::I64)); _s9WW::I64 = _cboj::I64; _cbom::I64 = _s9WW::I64 + _s9Sm::I64; _s9WX::I64 = _cbom::I64; _cbop::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9WX::I64)); _s9WO::I64 = _cbop::I64; _cbos::I64 = _s9WO::I64 >> 25; _s9X0::I64 = _cbos::I64; _cbov::I64 = _s9WO::I64 << 7; _s9WZ::I64 = _cbov::I64; _cboy::I64 = _s9WZ::I64 | _s9X0::I64; _s9X1::I64 = _cboy::I64; _cboB::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9X1::I64)); _s9X2::I64 = _cboB::I64; _cboE::I64 = _s9X2::I64 + _s9Sn::I64; _s9X3::I64 = _cboE::I64; _cboH::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9X3::I64)); _s9WY::I64 = _cboH::I64; _cboK::I64 = _s9WY::I64 ^ 4294967295; }}} Which sinking turns into, {{{ _s9WO::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(%MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(%MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9Sn::I64 & _s9So::I64 | _s9Sn::I64 ^ 4294967295 & _s9Sp::I64 + _s9SG::I64)) + 3614090360)) + I64[Sp + 152])); _s9WY::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(%MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32((_s9WO::I64 << 7) | (_s9WO::I64 >> 25))) + _s9Sn::I64)); _s9X4::I64 = %MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(%MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(%MO_UU_Conv_W32_W64(%MO_UU_Conv_W64_W32(_s9WY::I64 & _s9Sn::I64 | _s9WY::I64 ^ 4294967295 & _s9So::I64 + _s9SX::I64)) + 3905402710)) + _s9Sp::I64)); }}} It would be interesting to know how the code produced by 6.12 differs from that produced by newer compilers. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12028#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler