Skip to content

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;

in the -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.

Edited by Ben Gamari
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information