
#9157: cmm common block not eliminated -------------------------------------+------------------------------------ Reporter: wojteknar | Owner: jstolarek Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Unknown/Multiple Type of failure: Other | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: -------------------------------------+------------------------------------ Comment (by simonpj): I suspect that we ignore the labels the first time so that this works: {{{ L1: x = x+1; goto L2 L2: y = y+1; goto Lend L3: x = x+1; goto L3 L4: y = y+1; goto Lend }}} Now L1 and L3 would be different if we took account of labels, but once L2 and L4 are commoned up, L1 and L3 can be as well. Waiting for the sinking pass may well help, and I don't know why we don't do CBE at the end. But it isn't enough in general. Consider {{{ L1: x = r+1; Sp[4] = x; Sp[8] = x*2; goto Lend L2: y = r+1; Sp[4] = y; Sp[8] = y*2; goto Lend }}} Here x and y look different but they are simply local temporaries. If we did a liveness analysis, the equality-comparing function could make- equivalent assignments to dead variables. So when comparing L1 and L2, since x and y are dead, the first statements will compare ''equal'', and make x and y equivalent; hence the second statements will compare equal too. Anyway, I'm no expert here; I have not looked at the code. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9157#comment:4 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler