This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/29680] Misscompilation of spec2006 gcc
- From: "dberlin at dberlin dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 1 Nov 2006 17:53:35 -0000
- Subject: [Bug tree-optimization/29680] Misscompilation of spec2006 gcc
- References: <bug-29680-5077@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #6 from dberlin at gcc dot gnu dot org 2006-11-01 17:53 -------
Subject: Re: Misscompilation of spec2006 gcc
> > >
> > > and for_clobber is only true on call operands, we do not insert SMT. The lists
> > > of virtual operands thus become disjoint.
> > We should not insert the SMT here.
> > We are never supposed to use a bare SMT when it has aliases that we
> > can use (IE something has not been pruned).
>
> but fde_13->dw_fde_cfi does not have any other aliases that can be used,
> i.e., none_added is true.
This is only true for one of the accesses, not both, or else the SMT
would be used in both cases. :)
>
> > I will work around this problem by teaching PTA about casts from
> > nonpointers to pointers, which will cause it to end up with a nonlocal
> > var in the set.
>
> ??? There is no cast from non-pointer to pointer in this testcase.
Actually, there is.
That's why you end up with SMT's in the first place.
# VUSE <fde_table_in_useD.1609_6>;
fde_table_in_use.0D.1617_7 = fde_table_in_useD.1609;
D.1618_8 = fde_table_in_use.0D.1617_7 * 24;
D.1619_9 = (struct dw_fde_struct *) D.1618_8;
This causes D.1619_9 to point to anything
# VUSE <fde_tableD.1610_10>;
fde_table.1D.1620_11 = fde_tableD.1610;
D.1621_12 = D.1619_9 + fde_table.1D.1620_11;
causes D.1621_12 (the &fde_table[fde_table_in_use - 1]) to point to anything.
All of this is what causes SMT's to be used.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29680