From 182e00b1ba05699ef2e161d9282636142471e914 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 10 Jul 2009 11:45:40 +0000 Subject: [PATCH] re PR tree-optimization/40496 (ICE in verify_stmts with -fprefetch-loop-arrays) 2009-07-10 Richard Guenther 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr40496.C | 18 ++++++++++++++++++ gcc/tree-ssa-loop-manip.c | 13 +++++++++++-- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr40496.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c95fb363ba..684b6cd2629 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-07-10 Richard Guenther + + 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 PR 25509 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 651afbf6435..4cb33062864 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-07-10 Richard Guenther + + PR tree-optimization/40496 + * g++.dg/opt/pr40496.C: New testcase. + 2009-07-10 Manuel López-Ibáñez PR 25509 diff --git a/gcc/testsuite/g++.dg/opt/pr40496.C b/gcc/testsuite/g++.dg/opt/pr40496.C new file mode 100644 index 00000000000..b0eaebf702f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr40496.C @@ -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]; + } +} diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index c1514bf25f8..b891ea64957 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -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");