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

Reply via email to