
#14226: Common Block Elimination pass doesn't eliminate common blocks -------------------------------------+------------------------------------- Reporter: bgamari | Owner: (none) Type: bug | Status: new Priority: high | Milestone: 8.4.1 Component: Compiler | Version: 8.2.1 (CodeGen) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by bgamari): To make my objection in comment:4 more concrete, consider that you have the following two blocks (from the example in #14226), {{{ c2VZ: // global _c2Yd::I64 = _s2Se::I64 + 1; _s2Sx::I64 = _c2Yd::I64; _s2Se::I64 = _s2Sx::I64; goto c2TE; c2VY: // global _c2Yb::I64 = _s2Se::I64 + 1; _s2Sw::I64 = _c2Yb::I64; _s2Se::I64 = _s2Sw::I64; goto c2TE; }}} They differ in only two local register names, both of which are dead outside of their respective blocks. Ignoring the fact that the sinking pass should eliminate both intermediate locals, it seems to me like CBE should really consider these blocks to be duplicates. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14226#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler