------- Additional Comments From dberlin at gcc dot gnu dot org  2005-08-11 
12:55 -------
Subject: Re:  [4.1 Regression] ICE in
        first_vi_for_offset, at tree-ssa-structalias.c:2858

On Thu, 2005-08-11 at 10:44 +0000, rguenth at gcc dot gnu dot org wrote:
> ------- Additional Comments From rguenth at gcc dot gnu dot org  2005-08-11 
> 10:44 -------
> We inline all and get
> 
> void bar() ()
> {
>   char & D.1777;
>   struct B * D.1776;
>   char & D.1773;
>   union C D.1772;
> 
> <bb 0>:
>   D.1772.p = &a;
>   D.1776_5 = D.1772.q;
>   D.1777_6 = &D.1776_5->d;
>   D.1773_7 = D.1777_6;
>   *D.1773_7 = 0;
>   return;
> 
> }
> 
> where we access the padding between c and i in struct A through an
> object of type B.  This must be invalid code.  Even if it is, the
> gcc_unreachable () is probably not a good idea - Danny, how should
> we deal with this?  Ignore references to padding and just return
> NULL from first_vi_for_offset?

I know what to do here. I've just been waiting as long as possible to
remove the assert because it also catches real bugs.
I actually plan on removing it today, and have bootstrapped and tested a
patch to do so.

> 
> There's a similar problem in get_constraint_for_component_ref which
> I hit with array-aliasing and work-around by

> 
> *************** get_constraint_for_component_ref (tree t
> *** 2075,2082 ****
>             }
>           /* assert that we found *some* field there. The user couldn't be
>              accessing *only* padding.  */
> !
> !         gcc_assert (curr);
>         }
>         else
>         if (dump_file && (dump_flags & TDF_DETAILS))
> --- 2076,2084 ----
>             }
>           /* assert that we found *some* field there. The user couldn't be
>              accessing *only* padding.  */
> !         /* Still the user could access one past the end of an array
> !            embedded in a struct resulting in accessing *only* padding.  */
> !         /* gcc_assert (curr); */

You are right, but this can only occur with your patch, since it
wouldn't have had fields before, and thus it would have overlapped with
the actual variable, giving the right answer.  :)







-- 


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

Reply via email to