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