re PR tree-optimization/22486 (Upcasts are not folded away)

2005-07-26  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/22486
	* fold-const.c (fold_unary): Fold away useless component
	references of the form (T *)&T.x, if the address
	doesn't change.

	* gcc.dg/tree-ssa/upcast-1.c: New testcase.

From-SVN: r102381
This commit is contained in:
Richard Guenther 2005-07-26 07:34:58 +00:00 committed by Richard Biener
parent 3e2844cb07
commit 46c0a59dfb
4 changed files with 47 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2005-07-26 Richard Guenther <rguenther@suse.de>
PR tree-optimization/22486
* fold-const.c (fold_unary): Fold away useless component
references of the form (T *)&T.x, if the address
doesn't change.
2005-07-25 James E Wilson <wilson@specifixinc.com>
* dwarf2out.c (add_call_src_coords_attributes): New.

View File

@ -6711,6 +6711,29 @@ fold_unary (enum tree_code code, tree type, tree op0)
return fold_build1 (code, type, TREE_OPERAND (op0, 0));
}
/* Handle (T *)&A.B.C for A being of type T and B and C
living at offset zero. This occours frequently in
C++ upcasting and then accessing the base. */
if (TREE_CODE (op0) == ADDR_EXPR
&& POINTER_TYPE_P (type)
&& handled_component_p (TREE_OPERAND (op0, 0)))
{
HOST_WIDE_INT bitsize, bitpos;
tree offset;
enum machine_mode mode;
int unsignedp, volatilep;
tree base = TREE_OPERAND (op0, 0);
base = get_inner_reference (base, &bitsize, &bitpos, &offset,
&mode, &unsignedp, &volatilep, false);
/* If the reference was to a (constant) zero offset, we can use
the address of the base if it has the same base type
as the result type. */
if (! offset && bitpos == 0
&& TYPE_MAIN_VARIANT (TREE_TYPE (type))
== TYPE_MAIN_VARIANT (TREE_TYPE (base)))
return fold_convert (type, build_fold_addr_expr (base));
}
if (TREE_CODE (op0) == MODIFY_EXPR
&& TREE_CONSTANT (TREE_OPERAND (op0, 1))
/* Detect assigning a bitfield. */

View File

@ -1,3 +1,8 @@
2005-07-26 Richard Guenther <rguenther@suse.de>
PR tree-optimization/22486
* gcc.dg/tree-ssa/upcast-1.c: New testcase.
2005-07-25 Andrew Pinski <pinskia@physics.uc.edu>
PR tree-opt/22484

View File

@ -0,0 +1,12 @@
/* { do-go compile } */
/* { dg-options "-fdump-tree-gimple" } */
typedef struct { int i; } Foo;
Foo foo;
Foo *bar(void)
{
return (Foo *)&foo.i;
}
/* { dg-final { scan-tree-dump "&foo;" "gimple" } } */
/* { dg-final { cleanup-tree-dump "gimple" } } */