------- Comment #3 from jakub at gcc dot gnu dot org 2010-06-25 11:26 ------- This goes wrong with -O2 -funroll-loops already during tree opts. In vrp2 we have: b[2][1]{lb: 1 sz: 1} = D.1599_148; b[3][1]{lb: 1 sz: 1} = D.1599_154; D.1635_152 = 2; D.1636_151 = &b[2][1]{lb: 1 sz: 1}; D.1637_146 = 3; D.1638_145 = &b[3][1]{lb: 1 sz: 1}; __builtin_memcpy (D.1638_145, D.1636_151, 1); ... D.1647_84 = b[3][1]{lb: 1 sz: 1}; D.1648_85 = A.5[3]; D.1649_86 = (*D.1648_85)[1]{lb: 1 sz: 1}; if (D.1647_84 != D.1649_86)
but in dom2: b[2][1]{lb: 1 sz: 1} = D.1599_148; b[3][1]{lb: 1 sz: 1} = D.1599_154; D.1635_152 = 2; D.1636_151 = &b[2][1]{lb: 1 sz: 1}; D.1637_146 = 3; D.1638_145 = &b[3][1]{lb: 1 sz: 1}; D.1680_170 = b[2][1]{lb: 1 sz: 1}; b[3][1]{lb: 1 sz: 1} = D.1680_170; ... D.1647_84 = D.1599_154; D.1648_85 = A.5[3]; D.1649_86 = (*D.1648_85)[1]{lb: 1 sz: 1}; if (D.1649_86 != D.1599_154) b[3] at that point isn't D.1599_154 though, but D.1599_148 (== D.1680_170). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44592