From: jakub Date: Sat, 10 Nov 2007 07:46:31 +0000 (+0000) Subject: PR middle-end/34018 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3d053ea5c19cfe989d10c3d847d0bbe1c73a7386;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130068 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5e532d93ad6..ac0e088abf0e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2007-11-10 Jakub Jelinek + 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) : Punt if the added cast involves variable length types. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e1a0b5b5ee4..f98b9181cd8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2007-11-10 Jakub Jelinek + 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 - * 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 @@ -449,72 +452,72 @@ 2007-10-30 Revital Eres - * testsuite/gcc.dg/vect/pr33866.c: Require vect_long. + * gcc.dg/vect/pr33866.c: Require vect_long. 2007-10-30 Revital Eres - * 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 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. - - * 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. - - * testsuite/gcc.dg/vect/no-section-anchors-vect-31.c: New test, Like the + * 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. + + * 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. + + * 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. - - * testsuite/gcc.dg/vect/vect-77-alignchecks.c: New test. Like the + * 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. + + * 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 @@ -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 Zdenek Dvorak 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 @@ -747,7 +750,7 @@ 2007-10-23 Tehila Meyzels Revital Eres - * testsuite/gcc.dg/sms-2.c: New testcase. + * gcc.dg/sms-2.c: New testcase. 2007-10-22 David S. Miller @@ -1604,7 +1607,7 @@ 2007-09-25 Revital Eres - * testsuite/gcc.target/powerpc/ppc-paired.c (paired_sel): Add. + * gcc.target/powerpc/ppc-paired.c (paired_sel): Add. 2007-09-25 Joseph Myers @@ -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 @@ -3247,8 +3250,8 @@ 2007-08-31 Douglas Gregor 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 @@ -3665,7 +3668,7 @@ 2007-08-23 Richard Guenther PR tree-optimization/32328 - * testsuite/gcc.dg/pr32328.c: New testcase. + * gcc.dg/pr32328.c: New testcase. 2007-08-23 Rask Ingemann Lambertsen @@ -3914,13 +3917,13 @@ 2007-08-19 Dorit Nuzman - * 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 @@ -4198,7 +4201,7 @@ 2007-08-12 Francois-Xavier Coudert 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 @@ -6331,7 +6334,7 @@ 2007-06-21 Sebastian Pop - * gcc/testsuite/gcc.dg/tree-ssa/pr19590.c: New. + * gcc.dg/tree-ssa/pr19590.c: New. 2007-06-21 Jerry DeLisle @@ -6376,7 +6379,7 @@ 2007-06-20 Adam Nemet 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 diff --git a/gcc/testsuite/g++.dg/opt/inline14.C b/gcc/testsuite/g++.dg/opt/inline14.C new file mode 100644 index 000000000000..8d2a5d4bb28d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline14.C @@ -0,0 +1,51 @@ +// PR middle-end/34018 +// { dg-do compile } +// { dg-options "-O1" } + +template +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 +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 +inline A +operator- (A const& a1, E const& a2) +{ + typedef A G; + G a3; + bar (a1.begin (), a2, a3.begin (), N); + return a3; +} + +struct B +{ + B (A const &m) : n (m - static_cast(1)) {} + A n; +}; + +void +foo () +{ + B t (A (0,0,0)); +} diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index e7abeff00932..e0d4093a38c9 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -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 (©_bsi, stmt, BSI_NEW_STMT); diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h index 895a0afcbbd6..33eb908b7cde 100644 --- a/gcc/tree-inline.h +++ b/gcc/tree-inline.h @@ -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;