------- Comment #18 from rguenth at gcc dot gnu dot org 2010-01-03 11:11 ------- Confirmed. This is indeed showing two cases of SRA behaving oddly. First early SRA produces
<bb 2>: _T2 = *sptr_1(D); _ans = _T2; _ans$curr_12 = _T2.curr; D.1965_6 = _ans$curr_12; D.1966_7 = D.1965_6 + -1; _ans$curr_2 = D.1966_7; *sptr_1(D) = _ans; sptr_1(D)->curr = _ans$curr_2; from <bb 2>: _T2 = *sptr_1(D); _ans = _T2; D.1965_6 = _ans.curr; D.1966_7 = D.1965_6 + -1; _ans.curr = D.1966_7; *sptr_1(D) = _ans; then late SRA continues to obfuscate things by producing <bb 2>: _T2 = *sptr_1(D); _T2$curr_14 = sptr_1(D)->curr; _ans = _T2; _ans.curr = _T2$curr_14; _ans$curr_12 = _T2$curr_14; D.1966_7 = _ans$curr_12 + -1; *sptr_1(D) = _ans; sptr_1(D)->curr = D.1966_7; note how both times it increases the amount of variables and their lifetime (I think it's bad we run SRA twice anyway). The first SRA pass should have produced _T2$curr_10 = sptr_1(D)->curr; D.1965_6 = _T2$curr_10; D.1966_7 = D.1965_6 + -1; _T2$curr_11 = D.1966_7; sptr_1(D)->curr = _T2$curr_11; The old ESRA implementation decomposed all structure copies completely and thus left to produce the above by further scalar optimizations: <bb 2>: _T2$last_plus_one_2 = sptr_1(D)->last_plus_one; _T2$base_3 = sptr_1(D)->base; _T2$curr_4 = sptr_1(D)->curr; _ans$last_plus_one_5 = _T2$last_plus_one_2; _ans$base_8 = _T2$base_3; _ans$curr_9 = _T2$curr_4; D.1262_6 = _ans$curr_9; D.1263_7 = D.1262_6 + -1; _ans$curr_10 = D.1263_7; sptr_1(D)->last_plus_one ={v} _ans$last_plus_one_5; sptr_1(D)->base ={v} _ans$base_8; sptr_1(D)->curr ={v} _ans$curr_10; -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |enhancement Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2010-01-03 11:11:22 date| | Summary|New: load-modify-store on |load-modify-store on x86 |x86 should be \ single |should be a single |instruction |instruction http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42586