Common Block Elimination pass doesn't eliminate common blocks
In #14222 it was noted that something appears to be broken in
CmmCommonBlockElim. Consider the program from that ticket,
module T14221 where import Data.Text as T isNumeric :: Text -> Bool isNumeric t = T.all isNumeric' t && T.any isNumber t where isNumber c = '0' <= c && c <= '9' isNumeric' c = isNumber c || c == 'e' || c == 'E' || c == '.' || c == '-' || c == '+'
This program produces six copies of a block of the form,
c6JT: R2 = I64[R1 + 7]; R1 = P64[Sp + 8]; Sp = Sp + 16; call $wloop_all_s6CQ_info(R2, R1) args: 8, res: 0, upd: 8;
-ddump-opt-cmm output, which are manifest in the assembler as,
block_c6JT_info: _c6JT: movq 7(%rbx),%r14 movq 8(%rbp),%rbx addq $16,%rbp jmp $wloop_all_s6CQ_info
CBE really ought to be catching these.