------- 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