------- Comment #12 from jakub at gcc dot gnu dot org 2008-04-24 09:59 ------- This is actually a tree optimization issue. In optimized dump without -DGOOD we have: bar (&g[0][0] + 288, &g[0][0]); bar (&g[0][0] + 324, &g[1][0]); bar (&g[0][0] + 360, &g[2][0]); bar (&g[0][0] + 396, &g[3][0]); bar (&g[1][0], &g[4][0]); bar (&g[0][0] + 468, &g[5][0]); bar (&g[0][0] + 504, &g[6][0]); bar (&g[0][0] + 540, &g[7][0]); note the bogus first argument for 5th bar call, should have been &g[0][0] + 432 aka &g[12][0]. In *.reassoc2 we have for the 4th and 5th bar calls: i_73 = i_56 + 1; k_80 = i_73 + 8; D.1588_81 = (long unsigned int) k_80; D.1589_82 = D.1588_81 * 36; D.1590_83 = D.1589_82 + -288; D.1591_84 = &g + D.1590_83; D.1592_85 = &(*D.1591_84)[0]; D.1594_86 = &g[0][0] + D.1589_82; bar (D.1594_86, D.1592_85); i_90 = i_73 + 1; k_97 = i_90 + 8; D.1588_98 = (long unsigned int) k_97; D.1589_99 = D.1588_98 * 36; D.1590_100 = D.1589_99 + -288; D.1591_101 = &g + D.1590_100; D.1592_102 = &(*D.1591_101)[0]; D.1594_103 = &g[0][0] + D.1589_99; bar (D.1594_103, D.1592_102); which looks correct, but in *.vrp2: i_73 = 3; k_80 = 11; D.1588_81 = 11; D.1589_82 = 396; D.1590_83 = 108; D.1591_84 = &g[3]; D.1592_85 = &(*D.1591_84)[0]; D.1594_86 = &g[0][0] + 396; bar (D.1594_86, D.1592_85); i_90 = 4; k_97 = 12; D.1588_98 = 12; D.1589_99 = 432; D.1590_100 = 144; D.1591_101 = &g[4]; D.1592_102 = &(*D.1591_101)[0]; D.1594_103 = &g[1][0]; bar (&g[1][0], D.1592_102); which is wrong. So to me this looks like vrp bug.
-- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Component|rtl-optimization |tree-optimization http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36008