re PR tree-optimization/40496 (ICE in verify_stmts with -fprefetch-loop-arrays)

2009-07-10  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/40496
	* tree-ssa-loop-manip.c (tree_transform_and_unroll_loop): Create
	the PHI result with a compatible type.

	* g++.dg/opt/pr40496.C: New testcase.

From-SVN: r149469
This commit is contained in:
Richard Guenther 2009-07-10 11:45:40 +00:00 committed by Richard Biener
parent ac7120ce8a
commit 182e00b1ba
4 changed files with 40 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2009-07-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/40496
* tree-ssa-loop-manip.c (tree_transform_and_unroll_loop): Create
the PHI result with a compatible type.
2009-07-10 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR 25509

View File

@ -1,3 +1,8 @@
2009-07-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/40496
* g++.dg/opt/pr40496.C: New testcase.
2009-07-10 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR 25509

View File

@ -0,0 +1,18 @@
// { dg-do compile }
// { dg-options "-O2 -fprefetch-loop-arrays -msse2" { target i?86-*-* x86_64-*-* } }
struct DOMStringHandle
{
unsigned int fLength;
int fRefCount;
};
static void *freeListPtr;
void foo(DOMStringHandle *dsg)
{
int i;
for (i = 1; i < 1023; i++)
{
*(void **) &dsg[i] = freeListPtr;
freeListPtr = &dsg[i];
}
}

View File

@ -990,10 +990,19 @@ tree_transform_and_unroll_loop (struct loop *loop, unsigned factor,
/* Prefer using original variable as a base for the new ssa name.
This is necessary for virtual ops, and useful in order to avoid
losing debug info for real ops. */
if (TREE_CODE (next) == SSA_NAME)
if (TREE_CODE (next) == SSA_NAME
&& useless_type_conversion_p (TREE_TYPE (next),
TREE_TYPE (init)))
var = SSA_NAME_VAR (next);
else if (TREE_CODE (init) == SSA_NAME)
else if (TREE_CODE (init) == SSA_NAME
&& useless_type_conversion_p (TREE_TYPE (init),
TREE_TYPE (next)))
var = SSA_NAME_VAR (init);
else if (useless_type_conversion_p (TREE_TYPE (next), TREE_TYPE (init)))
{
var = create_tmp_var (TREE_TYPE (next), "unrinittmp");
add_referenced_var (var);
}
else
{
var = create_tmp_var (TREE_TYPE (init), "unrinittmp");