Commit 441e96b5 by Diego Novillo Committed by Diego Novillo

tree-ssa-dom.c (record_edge_info): Use last_basic_block to allocate info array.


	* tree-ssa-dom.c (record_edge_info): Use last_basic_block to
	allocate info array.
	* tree-vrp.c (extract_range_from_unary_expr): Set resulting
	range to varying in cast expressions that change
	TYPE_PRECISION.

testsuite/ChangeLog

	* gcc.dg/tree-ssa/vrp14.c: New test.

From-SVN: r100554
parent 658a82f8
2005-06-03 Diego Novillo <dnovillo@redhat.com>
* tree-ssa-dom.c (record_edge_info): Use last_basic_block to
allocate info array.
* tree-vrp.c (extract_range_from_unary_expr): Set resulting
range to varying in cast expressions that change
TYPE_PRECISION.
2005-06-03 Eric Christopher <echristo@redhat.com> 2005-06-03 Eric Christopher <echristo@redhat.com>
* config/mips/mips.opt: Add RejectNegative to divide-breaks and * config/mips/mips.opt: Add RejectNegative to divide-breaks and
......
2005-06-03 Diego Novillo <dnovillo@redhat.com>
* gcc.dg/tree-ssa/vrp14.c: New test.
2005-06-03 Mark Mitchell <mark@codesourcery.com> 2005-06-03 Mark Mitchell <mark@codesourcery.com>
PR c++/21336 PR c++/21336
......
/* { dg-do run } */
/* { dg-options "-O2" } */
struct tree_decl
{
union tree_decl_u1 {
int f;
long i;
struct tree_decl_u1_a {
unsigned int align : 24;
unsigned int off_align : 8;
} a;
} u1;
};
extern void abort (void);
unsigned int
assemble_variable (struct tree_decl decl)
{
unsigned int align;
align = decl.u1.a.align;
if (align > (1 << ((8 * 4) < 64 ? (8 * 4) - 2 : 62)))
align = (1 << ((8 * 4) < 64 ? (8 * 4) - 2 : 62));
/* VRP should not be propagating 0 to the RHS of this assignment.
But it was erroneously applying a cast operation between types of
different precision. align is an unsigned int with range [0,
0x4000000] but the .align field holds only 24 bits. So the cast
was returning a [0, 0] range. */
decl.u1.a.align = align;
return decl.u1.a.align;
}
main ()
{
struct tree_decl decl;
decl.u1.a.align = 13;
unsigned int x = assemble_variable (decl);
if (x == 0)
abort ();
return 0;
}
...@@ -2422,7 +2422,7 @@ record_edge_info (basic_block bb) ...@@ -2422,7 +2422,7 @@ record_edge_info (basic_block bb)
{ {
tree labels = SWITCH_LABELS (stmt); tree labels = SWITCH_LABELS (stmt);
int i, n_labels = TREE_VEC_LENGTH (labels); int i, n_labels = TREE_VEC_LENGTH (labels);
tree *info = xcalloc (n_basic_blocks, sizeof (tree)); tree *info = xcalloc (last_basic_block, sizeof (tree));
edge e; edge e;
edge_iterator ei; edge_iterator ei;
......
...@@ -1295,17 +1295,23 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr) ...@@ -1295,17 +1295,23 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr)
} }
/* Handle unary expressions on integer ranges. */ /* Handle unary expressions on integer ranges. */
if ((code == NOP_EXPR || code == CONVERT_EXPR) if (code == NOP_EXPR || code == CONVERT_EXPR)
&& (TYPE_SIZE (TREE_TYPE (vr0.min)) != TYPE_SIZE (TREE_TYPE (expr))))
{ {
tree inner_type = TREE_TYPE (op0);
tree outer_type = TREE_TYPE (expr);
/* When converting types of different sizes, set the result to /* When converting types of different sizes, set the result to
VARYING. Things like sign extensions and precision loss may VARYING. Things like sign extensions and precision loss may
change the range. For instance, if x_3 is of type 'long long change the range. For instance, if x_3 is of type 'long long
int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
is impossible to know at compile time whether y_5 will be is impossible to know at compile time whether y_5 will be
~[0, 0]. */ ~[0, 0]. */
set_value_range_to_varying (vr); if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
return; || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
{
set_value_range_to_varying (vr);
return;
}
} }
/* Apply the operation to each end of the range and see what we end /* Apply the operation to each end of the range and see what we end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment