aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-10 07:46:31 +0000
committerJakub Jelinek <jakub@redhat.com>2007-11-10 07:46:31 +0000
commit45c26c40d490740ea7ab2ada0925acf832dfc462 (patch)
tree93916a577dc944948c3fc3c3b0feb8354f23744a
parentf03a662d5e8ebed4a9eb24fdebf807e094c025d2 (diff)
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: https://gcc.gnu.org/svn/gcc/trunk@130068 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog201
-rw-r--r--gcc/testsuite/g++.dg/opt/inline14.C51
-rw-r--r--gcc/tree-inline.c13
-rw-r--r--gcc/tree-inline.h3
5 files changed, 174 insertions, 102 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5e532d93ad..ac0e088abf0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8e1a0b5b5ee..f98b9181cd8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
-
- * 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 <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>
diff --git a/gcc/testsuite/g++.dg/opt/inline14.C b/gcc/testsuite/g++.dg/opt/inline14.C
new file mode 100644
index 00000000000..8d2a5d4bb28
--- /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 <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));
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index e7abeff0093..e0d4093a38c 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 (&copy_bsi, stmt, BSI_NEW_STMT);
diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h
index 895a0afcbbd..33eb908b7cd 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;