re PR middle-end/45415 (ICE in partition_view_bitmap, at tree-ssa-live.c:334)

PR middle-end/45415
	* tree-sra.c (sra_modify_assign): If we modify the statement,
	say so.

	* tree-ssa.c (verify_ssa): Check number of operands and links
	per statement to agree.

testsuite/
	PR middle-end/45415
	* gcc.dg/pr45415.c: New test.

From-SVN: r163822
This commit is contained in:
Michael Matz 2010-09-03 14:42:46 +00:00 committed by Michael Matz
parent ed6e090eb2
commit 15a54c10cb
5 changed files with 99 additions and 0 deletions

View File

@ -1,3 +1,12 @@
2010-09-03 Michael Matz <matz@suse.de>
PR middle-end/45415
* tree-sra.c (sra_modify_assign): If we modify the statement,
say so.
* tree-ssa.c (verify_ssa): Check number of operands and links
per statement to agree.
2010-09-03 Uros Bizjak <ubizjak@gmail.com>
Iain Sandoe <iains@gcc.gnu.org>

View File

@ -1,3 +1,8 @@
2010-09-03 Michael Matz <matz@suse.de>
PR middle-end/45415
* gcc.dg/pr45415.c: New test.
2010-09-03 H.J. Lu <hongjiu.lu@intel.com>
PR tree-optimization/45506

View File

@ -0,0 +1,68 @@
/* { dg-do compile } */
/* { dg-options "-O1 -fno-tree-dominator-opts" } */
typedef unsigned long int st;
typedef unsigned long long dt;
typedef union
{
dt d;
struct
{
st h, l;
}
s;
} t_be;
typedef union
{
dt d;
struct
{
st l, h;
}
s;
} t_le;
#define df(f, t) \
int \
f (t afh, t bfh) \
{ \
t hh; \
t hp, lp, dp, m; \
st ad, bd; \
int s; \
s = 0; \
ad = afh.s.h - afh.s.l; \
bd = bfh.s.l - bfh.s.h; \
if (bd > bfh.s.l) \
{ \
bd = -bd; \
s = ~s; \
} \
lp.d = (dt) afh.s.l * bfh.s.l; \
hp.d = (dt) afh.s.h * bfh.s.h; \
dp.d = (dt) ad *bd; \
dp.d ^= s; \
hh.d = hp.d + hp.s.h + lp.s.h + dp.s.h; \
m.d = (dt) lp.s.h + hp.s.l + lp.s.l + dp.s.l; \
return hh.s.l + m.s.l; \
}
df(f_le, t_le)
df(f_be, t_be)
void abort (void);
void exit (int);
main ()
{
t_be x;
x.s.h = 0x10000000U;
x.s.l = 0xe0000000U;
if (x.d == 0x10000000e0000000ULL
&& f_be ((t_be) 0x100000000ULL, (t_be) 0x100000000ULL) != -1)
abort ();
if (x.d == 0xe000000010000000ULL
&& f_le ((t_le) 0x100000000ULL, (t_le) 0x100000000ULL) != -1)
abort ();
exit (0);
}

View File

@ -2783,6 +2783,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
true, GSI_SAME_STMT);
if (gimple_assign_rhs1 (*stmt) != rhs)
{
modify_this_stmt = true;
gimple_assign_set_rhs_from_tree (&orig_gsi, rhs);
gcc_assert (*stmt == gsi_stmt (orig_gsi));
}

View File

@ -938,6 +938,8 @@ verify_ssa (bool check_modified_stmt)
gimple stmt = gsi_stmt (gsi);
use_operand_p use_p;
bool has_err;
int count;
unsigned i;
if (check_modified_stmt && gimple_modified_p (stmt))
{
@ -1007,6 +1009,7 @@ verify_ssa (bool check_modified_stmt)
goto err;
}
count = 0;
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE|SSA_OP_DEF)
{
if (verify_ssa_name (op, false))
@ -1015,6 +1018,19 @@ verify_ssa (bool check_modified_stmt)
print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS);
goto err;
}
count++;
}
for (i = 0; i < gimple_num_ops (stmt); i++)
{
op = gimple_op (stmt, i);
if (op && TREE_CODE (op) == SSA_NAME && --count < 0)
{
error ("nr of operands and imm-links doesn't agree");
error ("in statement");
print_gimple_stmt (stderr, stmt, 0, TDF_VOPS|TDF_MEMSYMS);
goto err;
}
}
FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)