This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR tree-optimization/24172
On Tue, 4 Oct 2005, Richard Henderson wrote:
> On Tue, Oct 04, 2005 at 05:47:12PM +0200, Richard Guenther wrote:
> > ! /* Fall through to copying the folded tree. */
>
> Yes, this looks plausible.
I re-bootstrapped and tested the following combined patch.
Ok for mainline?
Thanks,
Richard.
2005-10-05 Richard Guenther <rguenther@suse.de>
PR tree-optimization/24172
* fold-const.c (fold_indirect_ref_1): Make sure we fold
ARRAY_REFs of constant strings.
* tree-inline.c (copy_body_r): Copy folded trees.
* g++.dg/tree-ssa/pr24172.C: New testcase.
Index: fold-const.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/fold-const.c,v
retrieving revision 1.626
diff -c -3 -p -r1.626 fold-const.c
*** fold-const.c 26 Sep 2005 01:28:38 -0000 1.626
--- fold-const.c 4 Oct 2005 10:59:06 -0000
*************** fold_indirect_ref_1 (tree type, tree op0
*** 11511,11519 ****
{
tree op = TREE_OPERAND (sub, 0);
tree optype = TREE_TYPE (op);
! /* *&p => p */
if (type == optype)
! return op;
/* *(foo *)&fooarray => fooarray[0] */
else if (TREE_CODE (optype) == ARRAY_TYPE
&& type == TREE_TYPE (optype))
--- 11511,11525 ----
{
tree op = TREE_OPERAND (sub, 0);
tree optype = TREE_TYPE (op);
! /* *&p => p; make sure to handle *&"str"[cst] here. */
if (type == optype)
! {
! tree fop = fold_read_from_constant_string (op);
! if (fop)
! return fop;
! else
! return op;
! }
/* *(foo *)&fooarray => fooarray[0] */
else if (TREE_CODE (optype) == ARRAY_TYPE
&& type == TREE_TYPE (optype))
Index: tree-inline.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v
retrieving revision 1.210
diff -c -3 -p -r1.210 tree-inline.c
*** tree-inline.c 1 Aug 2005 15:25:28 -0000 1.210
--- tree-inline.c 5 Oct 2005 08:58:55 -0000
*************** copy_body_r (tree *tp, int *walk_subtree
*** 636,643 ****
else
*tp = build1 (INDIRECT_REF, type, (tree)n->value);
}
! *walk_subtrees = 0;
! return NULL;
}
}
--- 636,642 ----
else
*tp = build1 (INDIRECT_REF, type, (tree)n->value);
}
! /* Fall through to copying the folded tree. */
}
}
/* { dg-do compile } */
/* { dg-options "-O2" } */
void IOException( char);
inline int* dummy( const char* const mode )
{
IOException(*mode+*mode);
}
void prepare_inpaint( )
{
dummy ("rb");
}