Commit 8a613cae by Richard Guenther Committed by Richard Biener

re PR middle-end/28776 (dwarf2out.c:2160: ICE: in build_polynomial_chrec, at tree-chrec.h:108)

2006-08-22  Richard Guenther  <rguenther@suse.de>

	PR middle-end/28776
	* tree-scalar-evolution.c (fold_used_pointer): Add at_stmt
	parameter.  Convert arguments to arithmetic expression to the
	chrecs type.
	(analyze_scalar_evolution_1): Adjust caller.

	* gcc.c-torture/compile/pr28776-1.c: New testcase.
	* gcc.c-torture/compile/pr28776-2.c: Likewise.

From-SVN: r116326
parent 1f6c68ed
2006-08-22 Richard Guenther <rguenther@suse.de>
PR middle-end/28776
* tree-scalar-evolution.c (fold_used_pointer): Add at_stmt
parameter. Convert arguments to arithmetic expression to the
chrecs type.
(analyze_scalar_evolution_1): Adjust caller.
2006-08-22 Jan Hubicka <jh@suse.cz> 2006-08-22 Jan Hubicka <jh@suse.cz>
Patch by Paolo Bonzini Patch by Paolo Bonzini
......
2006-08-22 Richard Guenther <rguenther@suse.de>
PR middle-end/28776
* gcc.c-torture/compile/pr28776-1.c: New testcase.
* gcc.c-torture/compile/pr28776-2.c: Likewise.
2006-08-21 Mark Shinwell <shinwell@codesourcery.com> 2006-08-21 Mark Shinwell <shinwell@codesourcery.com>
* g++.dg/eh/arm-vfp-unwind.C: Correct order of DejaGNU directives. * g++.dg/eh/arm-vfp-unwind.C: Correct order of DejaGNU directives.
typedef struct dw_fde_struct
{
int decl;
} *dw_fde_ref;
dw_fde_ref fde_table;
unsigned fde_table_in_use;
void output_call_frame_info (void)
{
unsigned int i;
dw_fde_ref fde;
for (i = 0; i < fde_table_in_use; i++)
{
fde = &fde_table[i];
tree_contains_struct_check_failed (fde_table[i].decl);
}
}
typedef struct RangeCoder
{
unsigned char one_state[256];
} RangeCoder;
static inline void put_rac(RangeCoder *c, unsigned char* const state)
{
*state= c->one_state[*state];
}
typedef struct PlaneContext{
unsigned (*state)[32];
} PlaneContext;
static inline void put_symbol(RangeCoder *c, unsigned char *state)
{
int i;
const int e;
put_rac(c, state);
for(i=e-1; i>=0; i--)
put_rac(c, state+22+i);
}
int encode_line(void)
{
PlaneContext * const p;
RangeCoder * const c;
int a;
put_symbol(c, p->state[a]);
}
...@@ -1765,7 +1765,8 @@ pointer_offset_p (tree expr) ...@@ -1765,7 +1765,8 @@ pointer_offset_p (tree expr)
/* EXPR is a scalar evolution of a pointer that is dereferenced or used in /* EXPR is a scalar evolution of a pointer that is dereferenced or used in
comparison. This means that it must point to a part of some object in comparison. This means that it must point to a part of some object in
memory, which enables us to argue about overflows and possibly simplify memory, which enables us to argue about overflows and possibly simplify
the EXPR. Returns the simplified value. the EXPR. AT_STMT is the statement in which this conversion has to be
performed. Returns the simplified value.
Currently, for Currently, for
...@@ -1820,7 +1821,7 @@ pointer_offset_p (tree expr) ...@@ -1820,7 +1821,7 @@ pointer_offset_p (tree expr)
bugs. */ bugs. */
static tree static tree
fold_used_pointer (tree expr) fold_used_pointer (tree expr, tree at_stmt)
{ {
tree op0, op1, new0, new1; tree op0, op1, new0, new1;
enum tree_code code = TREE_CODE (expr); enum tree_code code = TREE_CODE (expr);
...@@ -1833,13 +1834,13 @@ fold_used_pointer (tree expr) ...@@ -1833,13 +1834,13 @@ fold_used_pointer (tree expr)
if (pointer_offset_p (op1)) if (pointer_offset_p (op1))
{ {
new0 = fold_used_pointer (op0); new0 = fold_used_pointer (op0, at_stmt);
new1 = fold_used_pointer_cast (op1); new1 = fold_used_pointer_cast (op1);
} }
else if (code == PLUS_EXPR && pointer_offset_p (op0)) else if (code == PLUS_EXPR && pointer_offset_p (op0))
{ {
new0 = fold_used_pointer_cast (op0); new0 = fold_used_pointer_cast (op0);
new1 = fold_used_pointer (op1); new1 = fold_used_pointer (op1, at_stmt);
} }
else else
return expr; return expr;
...@@ -1847,6 +1848,9 @@ fold_used_pointer (tree expr) ...@@ -1847,6 +1848,9 @@ fold_used_pointer (tree expr)
if (new0 == op0 && new1 == op1) if (new0 == op0 && new1 == op1)
return expr; return expr;
new0 = chrec_convert (TREE_TYPE (expr), new0, at_stmt);
new1 = chrec_convert (TREE_TYPE (expr), new1, at_stmt);
if (code == PLUS_EXPR) if (code == PLUS_EXPR)
expr = chrec_fold_plus (TREE_TYPE (expr), new0, new1); expr = chrec_fold_plus (TREE_TYPE (expr), new0, new1);
else else
...@@ -1948,7 +1952,7 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res) ...@@ -1948,7 +1952,7 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
if (POINTER_TYPE_P (type) if (POINTER_TYPE_P (type)
&& !automatically_generated_chrec_p (res) && !automatically_generated_chrec_p (res)
&& pointer_used_p (var)) && pointer_used_p (var))
res = fold_used_pointer (res); res = fold_used_pointer (res, def);
break; break;
case PHI_NODE: case PHI_NODE:
......
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