------- Additional Comments From rguenth at gcc dot gnu dot org  2005-02-09 
11:15 -------
Another testcase is the following:

xtern void link_error(void);
void foo(int i)
{
        int a[4];
        if ((char*)&a[1] + 4*i + 4 != (char*)&a[i+2])
                link_error();
        if (&a[1] + i + 1 != &a[i+2])
                link_error();
}

which I have a patch for that works for C++ by extending the existing
try_move_mult_to_index and trying to avoid inserting (unsinged) casts
there.

Unfortunately, for C (whose initial trees do not contain ARRAY_REF exprs),
the frontend already inserts casts to unsigned (.03.generic):

foo (i)
{
  charD.1 * a.0D.1129;
  intD.0 D.1130;
  charD.1 * D.1131;
  charD.1 * D.1132;
  charD.1 * D.1133;
  unsigned intD.3 i.1D.1134;
  unsigned intD.3 D.1135;
  intD.0 * D.1136;
  intD.0 * D.1137;
  intD.0 * D.1138;
  charD.1 * D.1139;
  intD.0 aD.1128[4];

  a.0D.1129 = (charD.1 *) &aD.1128;
  D.1130 = iD.1125 * 4;
  D.1131 = (charD.1 *) D.1130;
  D.1132 = a.0D.1129 + D.1131;
  D.1133 = D.1132 + 8B;
  i.1D.1134 = (unsigned intD.3) iD.1125;
  D.1135 = i.1D.1134 * 4;
  D.1136 = (intD.0 *) D.1135;
  D.1137 = &aD.1128 + D.1136;
  D.1138 = D.1137 + 8B;
  D.1139 = (charD.1 *) D.1138;
  if (D.1133 != D.1139)
    {
      link_error ();
    }
  else
    {

    }
  if (0)
    {
      link_error ();
    }
  else
    {

    }
}

which maybe even wrong, if not hindering optimizations at least.

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |rguenth at gcc dot gnu dot
                   |dot org                     |org
             Status|NEW                         |ASSIGNED
   Last reconfirmed|2005-02-07 19:30:41         |2005-02-09 11:15:29
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19807

Reply via email to