This fixes another fallout of the PR65962 fix, gcc.dg/vect/vect-62.c
failing for targets that use constant pool entries for the array
initializer.

On x86_64 we fail to vectorize the 2nd loop in the testcase because
PRE makes the latch block non-empty (and adds a loop carried dependency).

The patch fixes the code that is supposed to inhibit PRE from doing this.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2015-10-27  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/65962
        * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
        Avoid creating loop carried dependences also for outer loops
        of the loop a use to replace is in.

        * gcc.dg/vect/vect-62.c: Adjust.

Index: gcc/tree-ssa-pre.c
===================================================================
*** gcc/tree-ssa-pre.c  (revision 229404)
--- gcc/tree-ssa-pre.c  (working copy)
*************** eliminate_dom_walker::before_dom_childre
*** 4082,4089 ****
              gimple *def_stmt = SSA_NAME_DEF_STMT (sprime);
              basic_block def_bb = gimple_bb (def_stmt);
              if (gimple_code (def_stmt) == GIMPLE_PHI
!                 && b->loop_father->header == def_bb)
                {
                  ssa_op_iter iter;
                  tree op;
                  bool found = false;
--- 4090,4098 ----
              gimple *def_stmt = SSA_NAME_DEF_STMT (sprime);
              basic_block def_bb = gimple_bb (def_stmt);
              if (gimple_code (def_stmt) == GIMPLE_PHI
!                 && def_bb->loop_father->header == def_bb)
                {
+                 loop_p loop = def_bb->loop_father;
                  ssa_op_iter iter;
                  tree op;
                  bool found = false;
*************** eliminate_dom_walker::before_dom_childre
*** 4092,4100 ****
                      affine_iv iv;
                      def_bb = gimple_bb (SSA_NAME_DEF_STMT (op));
                      if (def_bb
!                         && flow_bb_inside_loop_p (b->loop_father, def_bb)
!                         && simple_iv (b->loop_father,
!                                       b->loop_father, op, &iv, true))
                        {
                          found = true;
                          break;
--- 4101,4108 ----
                      affine_iv iv;
                      def_bb = gimple_bb (SSA_NAME_DEF_STMT (op));
                      if (def_bb
!                         && flow_bb_inside_loop_p (loop, def_bb)
!                         && simple_iv (loop, loop, op, &iv, true))
                        {
                          found = true;
                          break;
*************** eliminate_dom_walker::before_dom_childre
*** 4110,4116 ****
                          print_generic_expr (dump_file, sprime, 0);
                          fprintf (dump_file, " which would add a loop"
                                   " carried dependence to loop %d\n",
!                                  b->loop_father->num);
                        }
                      /* Don't keep sprime available.  */
                      sprime = NULL_TREE;
--- 4118,4124 ----
                          print_generic_expr (dump_file, sprime, 0);
                          fprintf (dump_file, " which would add a loop"
                                   " carried dependence to loop %d\n",
!                                  loop->num);
                        }
                      /* Don't keep sprime available.  */
                      sprime = NULL_TREE;
Index: gcc/testsuite/gcc.dg/vect/vect-62.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/vect-62.c (revision 229404)
--- gcc/testsuite/gcc.dg/vect/vect-62.c (working copy)
*************** int main1 ()
*** 33,41 ****
      }
  
    /* Multidimensional array. Aligned. The "inner" dimensions
!      are invariant in the inner loop. Vectorizable, but the
!      vectorizer detects that everything is invariant and that
!      the loop is better left untouched. (it should be optimized away). */
    for (i = 0; i < N; i++)
      {
        for (j = 0; j < N; j++)
--- 33,40 ----
      }
  
    /* Multidimensional array. Aligned. The "inner" dimensions
!      are invariant in the inner loop.  The outer loop is
!      vectorizable after invariant/store motion.  */
    for (i = 0; i < N; i++)
      {
        for (j = 0; j < N; j++)
*************** int main (void)
*** 65,69 ****
    return main1 ();
  }
  
! /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 
"vect" } } */
--- 64,68 ----
    return main1 ();
  }
  
! /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
  /* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 
"vect" } } */

Reply via email to