PR middle-end/34018
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Nov 2007 07:46:31 +0000 (07:46 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Nov 2007 07:46:31 +0000 (07:46 +0000)
* 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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/inline14.C [new file with mode: 0644]
gcc/tree-inline.c
gcc/tree-inline.h

index b5e532d..ac0e088 100644 (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.
index 8e1a0b5..f98b918 100644 (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.
 
        
 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>
 
 
 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>
 
 
        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>
 
 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>
 
 
 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>
 
        * 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>
 
 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>
 
 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>
 
 
 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>
 
 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>
 
 
 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>
 
 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 (file)
index 0000000..8d2a5d4
--- /dev/null
@@ -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));
+}
index e7abeff..e0d4093 100644 (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);
index 895a0af..33eb908 100644 (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;