[PATCH] Fix fold_indirect_ref
Richard Guenther
rguenth@tat.physik.uni-tuebingen.de
Fri May 13 12:53:00 GMT 2005
On Thu, 12 May 2005, Jeffrey A Law wrote:
> On Thu, 2005-05-12 at 15:10 -0400, Andrew Pinski wrote:
> > On May 12, 2005, at 2:42 PM, Jakub Jelinek wrote:
> >
> > > On Tue, May 10, 2005 at 05:40:32PM +0200, Richard Guenther wrote:
> > >> 2005-04-28 Richard Guenther <rguenth@gcc.gnu.org>
> > >>
> > >> * fold-const.c (fold_indirect_ref_1): Avoid removing
> > >> NOP_EXPRs with type qualifiers like const.
> > >
> > > This patch causes a regression on gcc-4_0-branch in g++.dg/opt/temp1.C,
> > > which is now miscompiled on at least i386/x86_64/ppc/ppc64/ia64.
> > > Can you please look into it or revert?
> >
> > God I how I hate GCC's type system.
> Something doesn't make any sense here -- Richard's change merely reduces
> the number of NOP_EXPRs that are stripped. If it's causing a regression
> then it must be exposing some kind of latent bug elsewhere.
To throw in another point before I have to leave for some time, the
types in fold_indirect_ref and/or build_fold_indirect_ref cannot be
really right in any cases. Like shown by the following completely
untested patch.
Richard.
Index: fold-const.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v
retrieving revision 1.578
diff -c -3 -p -r1.578 fold-const.c
*** fold-const.c 11 May 2005 15:21:23 -0000 1.578
--- fold-const.c 13 May 2005 12:52:11 -0000
*************** build_fold_indirect_ref (tree t)
*** 11429,11435 ****
tree sub = fold_indirect_ref_1 (t);
if (sub)
! return sub;
else
return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
}
--- 11455,11461 ----
tree sub = fold_indirect_ref_1 (t);
if (sub)
! return fold_convert (TREE_TYPE (TREE_TYPE (t)), sub);
else
return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
}
*************** fold_indirect_ref (tree t)
*** 11441,11447 ****
{
tree sub = fold_indirect_ref_1 (TREE_OPERAND (t, 0));
! if (sub)
return sub;
else
return t;
--- 11467,11473 ----
{
tree sub = fold_indirect_ref_1 (TREE_OPERAND (t, 0));
! if (sub && TREE_TYPE (t) == TREE_TYPE (sub))
return sub;
else
return t;
More information about the Gcc-patches
mailing list