re PR middle-end/34018 (ICE: verify_stmts failed)

PR middle-end/34018
	* tree-inline.h (copy_body_data): Add regimplify field.
	* tree-inline.c (copy_body_r): Set id->regimplify to true
	if an TREE_INVARIANT ADDR_EXPR is no longer invariant after
	substitutions.
	(copy_bb): Clear id->regimplify before walk_tree, if it is
	set afterwards, regimplify the whole statement.

	* g++.dg/opt/inline14.C: New test.

From-SVN: r130068
This commit is contained in:
Jakub Jelinek 2007-11-10 08:46:31 +01:00
parent 6481b879ba
commit 416c991fdd
5 changed files with 171 additions and 99 deletions

View File

@ -1,5 +1,13 @@
2007-11-10 Jakub Jelinek <jakub@redhat.com>
PR middle-end/34018
* tree-inline.h (copy_body_data): Add regimplify field.
* tree-inline.c (copy_body_r): Set id->regimplify to true
if an TREE_INVARIANT ADDR_EXPR is no longer invariant after
substitutions.
(copy_bb): Clear id->regimplify before walk_tree, if it is
set afterwards, regimplify the whole statement.
PR tree-optimization/33680
* tree-data-ref.c (split_constant_offset) <case ADDR_EXPR>: Punt
if the added cast involves variable length types.

View File

@ -1,5 +1,8 @@
2007-11-10 Jakub Jelinek <jakub@redhat.com>
PR middle-end/34018
* g++.dg/opt/inline14.C: New test.
PR tree-optimization/33680
* gcc.c-torture/compile/20071108-1.c: New test.
@ -123,21 +126,21 @@
2007-11-06 Douglas Gregor <doug.gregor@gmail.com>
* testsuite/g++.dg/parser/crash36.C: Tweak expected errors.
* testsuite/g++.dg/cpp0x/pr31439.C: New.
* testsuite/g++.dg/cpp0x/pr32114.C: New.
* testsuite/g++.dg/cpp0x/pr32115.C: New.
* testsuite/g++.dg/cpp0x/pr32125.C: New.
* testsuite/g++.dg/cpp0x/pr32126.C: New.
* testsuite/g++.dg/cpp0x/pr32127.C: New.
* testsuite/g++.dg/cpp0x/pr32128.C: New.
* testsuite/g++.dg/cpp0x/pr32253.C: New.
* testsuite/g++.dg/cpp0x/pr32566.C: New.
* testsuite/g++.dg/cpp0x/pr31445.C: Tweak expected errors.
* testsuite/g++.dg/cpp0x/pr31438.C: Ditto.
* testsuite/g++.dg/cpp0x/variadic81.C: Ditto.
* testsuite/g++.dg/cpp0x/pr31432.C: Ditto.
* testsuite/g++.dg/cpp0x/pr31442.C: Ditto.
* g++.dg/parser/crash36.C: Tweak expected errors.
* g++.dg/cpp0x/pr31439.C: New.
* g++.dg/cpp0x/pr32114.C: New.
* g++.dg/cpp0x/pr32115.C: New.
* g++.dg/cpp0x/pr32125.C: New.
* g++.dg/cpp0x/pr32126.C: New.
* g++.dg/cpp0x/pr32127.C: New.
* g++.dg/cpp0x/pr32128.C: New.
* g++.dg/cpp0x/pr32253.C: New.
* g++.dg/cpp0x/pr32566.C: New.
* g++.dg/cpp0x/pr31445.C: Tweak expected errors.
* g++.dg/cpp0x/pr31438.C: Ditto.
* g++.dg/cpp0x/variadic81.C: Ditto.
* g++.dg/cpp0x/pr31432.C: Ditto.
* g++.dg/cpp0x/pr31442.C: Ditto.
2007-11-06 Jakub Jelinek <jakub@redhat.com>
@ -449,72 +452,72 @@
2007-10-30 Revital Eres <eres@il.ibm.com>
* testsuite/gcc.dg/vect/pr33866.c: Require vect_long.
* gcc.dg/vect/pr33866.c: Require vect_long.
2007-10-30 Revital Eres <eres@il.ibm.com>
* testsuite/gcc.dg/vect/vect-shift-1.c: Require vect_int.
* testsuite/gcc.dg/vect/vect-ifcvt-4.c: Likewise.
* gcc.dg/vect/vect-shift-1.c: Require vect_int.
* gcc.dg/vect/vect-ifcvt-4.c: Likewise.
2007-10-29 Dorit Nuzman <dorit@il.ibm.com>
PR tree-optimization/32893
* testsuite/lib/target-supports.exp
* lib/target-supports.exp
(check_effective_target_unaligned_stack): new keyword.
* testsuite/gcc.dg/vect/vect-2.c: Globalize arrays to make the test
* gcc.dg/vect/vect-2.c: Globalize arrays to make the test
not sensitive to unaligned_stack.
* testsuite/gcc.dg/vect/vect-3.c: Likewise.
* testsuite/gcc.dg/vect/vect-4.c: Likewise.
* testsuite/gcc.dg/vect/vect-5.c: Likewise.
* testsuite/gcc.dg/vect/vect-6.c: Likewise.
* testsuite/gcc.dg/vect/vect-7.c: Likewise.
* testsuite/gcc.dg/vect/vect-13.c: Likewise.
* testsuite/gcc.dg/vect/vect-17.c: Likewise.
* testsuite/gcc.dg/vect/vect-18.c: Likewise.
* testsuite/gcc.dg/vect/vect-19.c: Likewise.
* testsuite/gcc.dg/vect/vect-20.c: Likewise.
* testsuite/gcc.dg/vect/vect-21.c: Likewise.
* testsuite/gcc.dg/vect/vect-22.c: Likewise.
* testsuite/gcc.dg/vect/vect-27.c: Likewise.
* testsuite/gcc.dg/vect/vect-29.c: Likewise.
* testsuite/gcc.dg/vect/vect-64.c: Likewise.
* testsuite/gcc.dg/vect/vect-65.c: Likewise.
* testsuite/gcc.dg/vect/vect-66.c: Likewise.
* testsuite/gcc.dg/vect/vect-72.c: Likewise.
* testsuite/gcc.dg/vect/vect-73.c: Likewise.
* testsuite/gcc.dg/vect/vect-86.c: Likewise.
* testsuite/gcc.dg/vect/vect-all.c: Likewise.
* testsuite/gcc.dg/vect/slp-25.c: Likewise.
* testsuite/gcc.dg/vect/wrapv-vect-7.c: Likewise.
* testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-31.c: Likewise.
* testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c: Likewise.
* gcc.dg/vect/vect-3.c: Likewise.
* gcc.dg/vect/vect-4.c: Likewise.
* gcc.dg/vect/vect-5.c: Likewise.
* gcc.dg/vect/vect-6.c: Likewise.
* gcc.dg/vect/vect-7.c: Likewise.
* gcc.dg/vect/vect-13.c: Likewise.
* gcc.dg/vect/vect-17.c: Likewise.
* gcc.dg/vect/vect-18.c: Likewise.
* gcc.dg/vect/vect-19.c: Likewise.
* gcc.dg/vect/vect-20.c: Likewise.
* gcc.dg/vect/vect-21.c: Likewise.
* gcc.dg/vect/vect-22.c: Likewise.
* gcc.dg/vect/vect-27.c: Likewise.
* gcc.dg/vect/vect-29.c: Likewise.
* gcc.dg/vect/vect-64.c: Likewise.
* gcc.dg/vect/vect-65.c: Likewise.
* gcc.dg/vect/vect-66.c: Likewise.
* gcc.dg/vect/vect-72.c: Likewise.
* gcc.dg/vect/vect-73.c: Likewise.
* gcc.dg/vect/vect-86.c: Likewise.
* gcc.dg/vect/vect-all.c: Likewise.
* gcc.dg/vect/slp-25.c: Likewise.
* gcc.dg/vect/wrapv-vect-7.c: Likewise.
* gcc.dg/vect/costmodel/i386/costmodel-vect-31.c: Likewise.
* gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c: Likewise.
* testsuite/gcc.dg/vect/vect-31.c: Removed alignment checks.
* testsuite/gcc.dg/vect/vect-34.c: Likewise.
* testsuite/gcc.dg/vect/vect-36.c: Likewise.
* testsuite/gcc.dg/vect/vect-64.c: Likewise.
* testsuite/gcc.dg/vect/vect-65.c: Likewise.
* testsuite/gcc.dg/vect/vect-66.c: Likewise.
* testsuite/gcc.dg/vect/vect-68.c: Likewise.
* testsuite/gcc.dg/vect/vect-76.c: Likewise.
* testsuite/gcc.dg/vect/vect-77.c: Likewise.
* testsuite/gcc.dg/vect/vect-78.c: Likewise.
* gcc.dg/vect/vect-31.c: Removed alignment checks.
* gcc.dg/vect/vect-34.c: Likewise.
* gcc.dg/vect/vect-36.c: Likewise.
* gcc.dg/vect/vect-64.c: Likewise.
* gcc.dg/vect/vect-65.c: Likewise.
* gcc.dg/vect/vect-66.c: Likewise.
* gcc.dg/vect/vect-68.c: Likewise.
* gcc.dg/vect/vect-76.c: Likewise.
* gcc.dg/vect/vect-77.c: Likewise.
* gcc.dg/vect/vect-78.c: Likewise.
* testsuite/gcc.dg/vect/no-section-anchors-vect-31.c: New test, Like the
* gcc.dg/vect/no-section-anchors-vect-31.c: New test, Like the
original testcase (without no-section-anchors prefix) but with global arrays.
* testsuite/gcc.dg/vect/no-section-anchors-vect-34.c: Likewise.
* testsuite/gcc.dg/vect/no-section-anchors-vect-36.c: Likewsie.
* testsuite/gcc.dg/vect/no-section-anchors-vect-64.c: Likewise.
* testsuite/gcc.dg/vect/no-section-anchors-vect-65.c: Likewise.
* testsuite/gcc.dg/vect/no-section-anchors-vect-66.c: Likewise.
* testsuite/gcc.dg/vect/no-section-anchors-vect-68.c: Likewise.
* testsuite/gcc.dg/vect/vect-77-global.c: Likewise.
* testsuite/gcc.dg/vect/vect-78-global.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-34.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-36.c: Likewsie.
* gcc.dg/vect/no-section-anchors-vect-64.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-65.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-66.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-68.c: Likewise.
* gcc.dg/vect/vect-77-global.c: Likewise.
* gcc.dg/vect/vect-78-global.c: Likewise.
* testsuite/gcc.dg/vect/vect-77-alignchecks.c: New test. Like the
* gcc.dg/vect/vect-77-alignchecks.c: New test. Like the
original testcase (without no-section-anchors prefix) but fix alignment checks
to also consider unaligned_stack targets.
* testsuite/gcc.dg/vect/vect-78-alignchecks.c: Likewise.
* gcc.dg/vect/vect-78-alignchecks.c: Likewise.
2007-10-29 Jakub Jelinek <jakub@redhat.com>
@ -549,30 +552,30 @@
Automatic parallelization reduction tests.
* testsuite/gcc.dg/tree-ssa/reduc-1.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-1char.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-1short.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-2.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-2char.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-2short.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-3.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-6.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-7.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-8.c: New test.
* testsuite/gcc.dg/tree-ssa/reduc-9.c: New test.
* gcc.dg/tree-ssa/reduc-1.c: New test.
* gcc.dg/tree-ssa/reduc-1char.c: New test.
* gcc.dg/tree-ssa/reduc-1short.c: New test.
* gcc.dg/tree-ssa/reduc-2.c: New test.
* gcc.dg/tree-ssa/reduc-2char.c: New test.
* gcc.dg/tree-ssa/reduc-2short.c: New test.
* gcc.dg/tree-ssa/reduc-3.c: New test.
* gcc.dg/tree-ssa/reduc-6.c: New test.
* gcc.dg/tree-ssa/reduc-7.c: New test.
* gcc.dg/tree-ssa/reduc-8.c: New test.
* gcc.dg/tree-ssa/reduc-9.c: New test.
2007-10-29 Razya Ladelsky <razya@il.ibm.com>
Zdenek Dvorak <ook@ucw.cz>
OMP_ATOMIC Changes, testsuite changes.
* testsuite/gcc.dg/gomp/atomic-3.c: Search for string on ompexp dump
* gcc.dg/gomp/atomic-3.c: Search for string on ompexp dump
instead of gimple dump.
* testsuite/gcc.dg/gomp/atomic-9.c: Same.
* testsuite/gcc.dg/gomp/atomic-10.c: Same.
* testsuite/g++.dg/gomp/atomic-3.C: Same.
* testsuite/g++.dg/gomp/atomic-9.C: Same.
* testsuite/g++.dg/gomp/atomic-10.C: Same.
* gcc.dg/gomp/atomic-9.c: Same.
* gcc.dg/gomp/atomic-10.c: Same.
* g++.dg/gomp/atomic-3.C: Same.
* g++.dg/gomp/atomic-9.C: Same.
* g++.dg/gomp/atomic-10.C: Same.
2007-10-29 Paul Thomas <pault@gcc.gnu.org>
@ -747,7 +750,7 @@
2007-10-23 Tehila Meyzels <tehila@il.ibm.com>
Revital Eres <eres@il.ibm.com>
* testsuite/gcc.dg/sms-2.c: New testcase.
* gcc.dg/sms-2.c: New testcase.
2007-10-22 David S. Miller <davem@davemloft.net>
@ -1604,7 +1607,7 @@
2007-09-25 Revital Eres <eres@il.ibm.com>
* testsuite/gcc.target/powerpc/ppc-paired.c (paired_sel): Add.
* gcc.target/powerpc/ppc-paired.c (paired_sel): Add.
2007-09-25 Joseph Myers <joseph@codesourcery.com>
@ -3216,7 +3219,7 @@
* gcc.target/mips/gcc-have-sync-compare-and-swap-1.c: New test.
* gcc.target/mips/gcc-have-sync-compare-and-swap-2.c: Ditto.
* gcc.target/mips/atomic-memory-1.c: Ditto.
* testsuite/gcc.target/mips/atomic-memory-2.c: Ditto.
* gcc.target/mips/atomic-memory-2.c: Ditto.
2007-09-03 Jesper Nilsson <jesper.nilsson@axis.com>
@ -3247,8 +3250,8 @@
2007-08-31 Douglas Gregor <doug.gregor@gmail.com>
PR c++/32597
* gcc/testsuite/g++.dg/cpp0x/variadic-new2.C: New.
* gcc/testsuite/g++.dg/cpp0x/variadic-new.C: New.
* g++.dg/cpp0x/variadic-new2.C: New.
* g++.dg/cpp0x/variadic-new.C: New.
2007-08-31 Tobias Burnus <burnus@net-b.de>
@ -3665,7 +3668,7 @@
2007-08-23 Richard Guenther <rguenther@suse.de>
PR tree-optimization/32328
* testsuite/gcc.dg/pr32328.c: New testcase.
* gcc.dg/pr32328.c: New testcase.
2007-08-23 Rask Ingemann Lambertsen <rask@sygehus.dk>
@ -3914,13 +3917,13 @@
2007-08-19 Dorit Nuzman <dorit@il.ibm.com>
* testsuite/gcc.dg/vect/pr20122.c: Fix test (now vectorized, with
* gcc.dg/vect/pr20122.c: Fix test (now vectorized, with
versioning for aliasing).
* testsuite/gcc.dg/vect/vect-35.c: Likewise.
* gcc.dg/vect/vect-35.c: Likewise.
* testsuite/gcc.dg/vect/vect-iv-6.c: Fix test for vect_no_align
* gcc.dg/vect/vect-iv-6.c: Fix test for vect_no_align
targets.
* testsuite/gcc.dg/vect/vect-multitypes-11.c: Likewise.
* gcc.dg/vect/vect-multitypes-11.c: Likewise.
2007-08-18 Tom Tromey <tromey@redhat.com>
@ -4198,7 +4201,7 @@
2007-08-12 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/31629
* gcc/testsuite/gfortran.dg/module_private_1.f90: New test.
* gfortran.dg/module_private_1.f90: New test.
2007-08-12 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
@ -6331,7 +6334,7 @@
2007-06-21 Sebastian Pop <sebpop@gmail.com>
* gcc/testsuite/gcc.dg/tree-ssa/pr19590.c: New.
* gcc.dg/tree-ssa/pr19590.c: New.
2007-06-21 Jerry DeLisle <jvdelisle@gcc.gnu.org>
@ -6376,7 +6379,7 @@
2007-06-20 Adam Nemet <anemet@caviumnetworks.com>
PR tree-optimization/25737
* testsuite/gcc.dg/tree-ssa/alias-14.c: New test.
* gcc.dg/tree-ssa/alias-14.c: New test.
2007-06-20 Hui-May Chang <hm.chang@apple.com>

View File

@ -0,0 +1,51 @@
// PR middle-end/34018
// { dg-do compile }
// { dg-options "-O1" }
template <typename E, unsigned long N>
struct A
{
typedef E F;
E elems[N];
A () {}
E *begin () { return elems; }
const E *begin () const { return elems; }
explicit A (F const &v0, F const &v1, F const &v2)
{
elems[0] = v0;
elems[1] = v1;
elems[2] = v2;
}
};
template <typename E1, typename E2, typename E3>
inline void
bar (const E1 *a1, E2 const &a2, E3 *a3, unsigned long const &sz)
{
E3 *r = a3 + sz;
for (;a3 != r; a1++, a3++)
*a3 = *a1 - a2;
}
template<typename E, unsigned long N>
inline A<E, N>
operator- (A<E, N> const& a1, E const& a2)
{
typedef A<E, N> G;
G a3;
bar (a1.begin (), a2, a3.begin (), N);
return a3;
}
struct B
{
B (A<unsigned long, 3> const &m) : n (m - static_cast<unsigned long>(1)) {}
A<unsigned long, 3> n;
};
void
foo ()
{
B t (A<unsigned long, 3> (0,0,0));
}

View File

@ -748,6 +748,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
and friends are up-to-date. */
else if (TREE_CODE (*tp) == ADDR_EXPR)
{
int invariant = TREE_INVARIANT (*tp);
walk_tree (&TREE_OPERAND (*tp, 0), copy_body_r, id, NULL);
/* Handle the case where we substituted an INDIRECT_REF
into the operand of the ADDR_EXPR. */
@ -755,6 +756,10 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
*tp = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0);
else
recompute_tree_invariant_for_addr_expr (*tp);
/* If this used to be invariant, but is not any longer,
then regimplification is probably needed. */
if (invariant && !TREE_INVARIANT (*tp))
id->regimplify = true;
*walk_subtrees = 0;
}
}
@ -792,6 +797,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scal
tree stmt = bsi_stmt (bsi);
tree orig_stmt = stmt;
id->regimplify = false;
walk_tree (&stmt, copy_body_r, id, NULL);
/* RETURN_EXPR might be removed,
@ -804,9 +810,10 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scal
/* With return slot optimization we can end up with
non-gimple (foo *)&this->m, fix that here. */
if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
&& TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == NOP_EXPR
&& !is_gimple_val (TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0)))
if ((TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
&& TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == NOP_EXPR
&& !is_gimple_val (TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0)))
|| id->regimplify)
gimplify_stmt (&stmt);
bsi_insert_after (&copy_bsi, stmt, BSI_NEW_STMT);

View File

@ -92,6 +92,9 @@ typedef struct copy_body_data
duplicating BLOCK nodes. */
bool transform_lang_insert_block;
/* True if this statement will need to be regimplified. */
bool regimplify;
/* Statements that might be possibly folded. */
struct pointer_set_t *statements_to_fold;
} copy_body_data;