public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group
@ 2014-06-18 10:44 Richard Biener
  2014-06-18 10:54 ` Jakub Jelinek
  2014-06-18 13:38 ` Jeff Law
  0 siblings, 2 replies; 4+ messages in thread
From: Richard Biener @ 2014-06-18 10:44 UTC (permalink / raw)
  To: gcc-patches


The following aims at reducing the number of pointless passes we run
on functions containing no loops.  Those are at least two copyprop
and one dce pass (two dce passes when vectorization is enabled,
three dce passes and an additional copyprop pass when any graphite
optimization is enabled).

Simply gating pass_tree_loop on number_of_loops () > 1 would disable
basic-block vectorization on loopless functions.  Moving
basic-block vectorization out of pass_tree_loop works to the extent
that you'd need to move IVOPTs as well as data-ref analysis cannot
cope with TARGET_MEM_REFs.

So the following introduces a pass_tree_no_loop pass group which
is enabled whenever the pass_tree_loop group is disabled.
As followup this would allow to skip cleanup work we do after the loop
pipeline just to cleanup after it.

Any comments?  Does such followup sound realistic or would it be
better to take the opportunity to move IVOPTs a bit closer to
RTL expansion and avoid that "pass_tree_no_loop hack"?

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Thanks,
Richard.

2014-06-18  Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop.c (gate_loop): New function.
	(pass_tree_loop::gate): Call it.
	(pass_data_tree_no_loop, pass_tree_no_loop,
	make_pass_tree_no_loop): New.
	* tree-vectorizer.c: Include tree-scalar-evolution.c
	(pass_slp_vectorize::execute): Initialize loops and SCEV if
	required.
	(pass_slp_vectorize::clone): New method.
	* timevar.def (TV_TREE_NOLOOP): New.
	* tree-pass.h (make_pass_tree_no_loop): Declare.
	* passes.def (pass_tree_no_loop): New pass group with
	SLP vectorizer.

Index: gcc/tree-ssa-loop.c
===================================================================
*** gcc/tree-ssa-loop.c.orig	2014-06-18 12:06:19.226205380 +0200
--- gcc/tree-ssa-loop.c	2014-06-18 12:06:39.103204012 +0200
*************** along with GCC; see the file COPYING3.
*** 42,47 ****
--- 42,63 ----
  #include "diagnostic-core.h"
  #include "tree-vectorizer.h"
  
+ 
+ /* Gate for loop pass group.  The group is controlled by -ftree-loop-optimize
+    but we also avoid running it when the IL doesn't contain any loop.  */
+ 
+ static bool
+ gate_loop (function *fn)
+ {
+   if (!flag_tree_loop_optimize)
+     return false;
+ 
+   /* Make sure to drop / re-discover loops when necessary.  */
+   if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
+     fix_loop_structure (NULL);
+   return number_of_loops (fn) > 1;
+ }
+ 
  /* The loop superpass.  */
  
  namespace {
*************** public:
*** 68,74 ****
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *) { return flag_tree_loop_optimize != 0; }
  
  }; // class pass_tree_loop
  
--- 84,90 ----
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *fn) { return gate_loop (fn); }
  
  }; // class pass_tree_loop
  
*************** make_pass_tree_loop (gcc::context *ctxt)
*** 80,85 ****
--- 96,140 ----
    return new pass_tree_loop (ctxt);
  }
  
+ /* The no-loop superpass.  */
+ 
+ namespace {
+ 
+ const pass_data pass_data_tree_no_loop =
+ {
+   GIMPLE_PASS, /* type */
+   "no_loop", /* name */
+   OPTGROUP_NONE, /* optinfo_flags */
+   false, /* has_execute */
+   TV_TREE_NOLOOP, /* tv_id */
+   PROP_cfg, /* properties_required */
+   0, /* properties_provided */
+   0, /* properties_destroyed */
+   0, /* todo_flags_start */
+   0, /* todo_flags_finish */
+ };
+ 
+ class pass_tree_no_loop : public gimple_opt_pass
+ {
+ public:
+   pass_tree_no_loop (gcc::context *ctxt)
+     : gimple_opt_pass (pass_data_tree_no_loop, ctxt)
+   {}
+ 
+   /* opt_pass methods: */
+   virtual bool gate (function *fn) { return !gate_loop (fn); }
+ 
+ }; // class pass_tree_no_loop
+ 
+ } // anon namespace
+ 
+ gimple_opt_pass *
+ make_pass_tree_no_loop (gcc::context *ctxt)
+ {
+   return new pass_tree_no_loop (ctxt);
+ }
+ 
+ 
  /* Loop optimizer initialization.  */
  
  namespace {
Index: gcc/tree-vectorizer.c
===================================================================
*** gcc/tree-vectorizer.c.orig	2014-06-18 12:06:19.226205380 +0200
--- gcc/tree-vectorizer.c	2014-06-18 12:10:55.958186328 +0200
*************** along with GCC; see the file COPYING3.
*** 82,87 ****
--- 82,89 ----
  #include "tree-ssa-propagate.h"
  #include "dbgcnt.h"
  #include "gimple-fold.h"
+ #include "tree-scalar-evolution.h"
+ 
  
  /* Loop or bb location.  */
  source_location vect_location;
*************** public:
*** 610,615 ****
--- 612,618 ----
    {}
  
    /* opt_pass methods: */
+   opt_pass * clone () { return new pass_slp_vectorize (m_ctxt); }
    virtual bool gate (function *) { return flag_tree_slp_vectorize != 0; }
    virtual unsigned int execute (function *);
  
*************** pass_slp_vectorize::execute (function *f
*** 620,625 ****
--- 623,635 ----
  {
    basic_block bb;
  
+   bool in_loop_pipeline = scev_initialized_p ();
+   if (!in_loop_pipeline)
+     {
+       loop_optimizer_init (LOOPS_NORMAL);
+       scev_initialize ();
+     }
+ 
    init_stmt_vec_info_vec ();
  
    FOR_EACH_BB_FN (bb, fun)
*************** pass_slp_vectorize::execute (function *f
*** 639,644 ****
--- 649,661 ----
      }
  
    free_stmt_vec_info_vec ();
+ 
+   if (!in_loop_pipeline)
+     {
+       scev_finalize ();
+       loop_optimizer_finalize ();
+     }
+ 
    return 0;
  }
  
Index: gcc/timevar.def
===================================================================
*** gcc/timevar.def.orig	2014-06-18 12:06:18.615205422 +0200
--- gcc/timevar.def	2014-06-18 12:06:39.103204012 +0200
*************** DEFTIMEVAR (TV_TREE_CALL_CDCE	     , "tr
*** 162,167 ****
--- 162,168 ----
  DEFTIMEVAR (TV_TREE_DSE		     , "tree DSE")
  DEFTIMEVAR (TV_TREE_MERGE_PHI	     , "PHI merge")
  DEFTIMEVAR (TV_TREE_LOOP	     , "tree loop optimization")
+ DEFTIMEVAR (TV_TREE_NOLOOP           , "loopless fn")
  DEFTIMEVAR (TV_TREE_LOOP_BOUNDS	     , "tree loop bounds")
  DEFTIMEVAR (TV_LIM                   , "tree loop invariant motion")
  DEFTIMEVAR (TV_TREE_LOOP_IVCANON     , "tree canonical iv")
Index: gcc/tree-pass.h
===================================================================
*** gcc/tree-pass.h.orig	2014-06-18 12:06:18.615205422 +0200
--- gcc/tree-pass.h	2014-06-18 12:06:39.104204012 +0200
*************** extern gimple_opt_pass *make_pass_early_
*** 354,359 ****
--- 354,360 ----
  extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
+ extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
Index: gcc/passes.def
===================================================================
*** gcc/passes.def.orig	2014-06-18 12:06:18.615205422 +0200
--- gcc/passes.def	2014-06-18 12:06:39.104204012 +0200
*************** along with GCC; see the file COPYING3.
*** 201,206 ****
--- 201,208 ----
        NEXT_PASS (pass_sink_code);
        NEXT_PASS (pass_asan);
        NEXT_PASS (pass_tsan);
+       /* Pass group that runs when 1) enabled, 2) there are loops
+ 	 in the function.  */
        NEXT_PASS (pass_tree_loop);
        PUSH_INSERT_PASSES_WITHIN (pass_tree_loop)
  	  NEXT_PASS (pass_tree_loop_init);
*************** along with GCC; see the file COPYING3.
*** 233,242 ****
--- 235,252 ----
  	  NEXT_PASS (pass_complete_unroll);
  	  NEXT_PASS (pass_slp_vectorize);
  	  NEXT_PASS (pass_loop_prefetch);
+ 	  /* Run IVOPTs after the last pass that uses data-reference analysis
+ 	     as that doesn't handle TARGET_MEM_REFs.  */
  	  NEXT_PASS (pass_iv_optimize);
  	  NEXT_PASS (pass_lim);
  	  NEXT_PASS (pass_tree_loop_done);
        POP_INSERT_PASSES ()
+       /* Pass group that runs when pass_tree_loop is disabled or there
+          are no loops in the function.  */
+       NEXT_PASS (pass_tree_no_loop);
+       PUSH_INSERT_PASSES_WITHIN (pass_tree_no_loop)
+ 	  NEXT_PASS (pass_slp_vectorize);
+       POP_INSERT_PASSES ()
        NEXT_PASS (pass_lower_vector_ssa);
        NEXT_PASS (pass_cse_reciprocals);
        NEXT_PASS (pass_reassoc);

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group
  2014-06-18 10:44 [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group Richard Biener
@ 2014-06-18 10:54 ` Jakub Jelinek
  2014-06-18 13:38 ` Jeff Law
  1 sibling, 0 replies; 4+ messages in thread
From: Jakub Jelinek @ 2014-06-18 10:54 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches

On Wed, Jun 18, 2014 at 12:42:19PM +0200, Richard Biener wrote:
> Any comments?  Does such followup sound realistic or would it be
> better to take the opportunity to move IVOPTs a bit closer to
> RTL expansion and avoid that "pass_tree_no_loop hack"?

I think it is fine to have pass_tree_no_loop pass pipeline.

	Jakub

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group
  2014-06-18 10:44 [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group Richard Biener
  2014-06-18 10:54 ` Jakub Jelinek
@ 2014-06-18 13:38 ` Jeff Law
  2014-06-23 16:50   ` Richard Biener
  1 sibling, 1 reply; 4+ messages in thread
From: Jeff Law @ 2014-06-18 13:38 UTC (permalink / raw)
  To: Richard Biener, gcc-patches

On 06/18/14 04:42, Richard Biener wrote:
>
> The following aims at reducing the number of pointless passes we run
> on functions containing no loops.  Those are at least two copyprop
> and one dce pass (two dce passes when vectorization is enabled,
> three dce passes and an additional copyprop pass when any graphite
> optimization is enabled).
>
> Simply gating pass_tree_loop on number_of_loops () > 1 would disable
> basic-block vectorization on loopless functions.  Moving
> basic-block vectorization out of pass_tree_loop works to the extent
> that you'd need to move IVOPTs as well as data-ref analysis cannot
> cope with TARGET_MEM_REFs.
>
> So the following introduces a pass_tree_no_loop pass group which
> is enabled whenever the pass_tree_loop group is disabled.
> As followup this would allow to skip cleanup work we do after the loop
> pipeline just to cleanup after it.
>
> Any comments?  Does such followup sound realistic or would it be
> better to take the opportunity to move IVOPTs a bit closer to
> RTL expansion and avoid that "pass_tree_no_loop hack"?
Sounds good.  I've always believed that each pass should be bubbling 
back up some kind of status about what it did/found as well.

It was more of an RTL issue, but we had a certain commercial testsuite 
which created large loopless tests (*) that consumed vast quantities of 
wall clock time.  I always wanted the RTL loop passes to signal back to 
toplev.c that no loops were found, which would in turn be used to say 
"we really don't need cse-after-loop and friends".
It's certainly more complex these days, but I'd still like to be able to 
do such things.

Regardless, that's well outside the scope of what you're trying to 
accomplish.

* Those tests consistently found port bugs, so we really didn't want to 
disable them.

jeff

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group
  2014-06-18 13:38 ` Jeff Law
@ 2014-06-23 16:50   ` Richard Biener
  0 siblings, 0 replies; 4+ messages in thread
From: Richard Biener @ 2014-06-23 16:50 UTC (permalink / raw)
  To: Jeff Law; +Cc: gcc-patches

On Wed, 18 Jun 2014, Jeff Law wrote:

> On 06/18/14 04:42, Richard Biener wrote:
> > 
> > The following aims at reducing the number of pointless passes we run
> > on functions containing no loops.  Those are at least two copyprop
> > and one dce pass (two dce passes when vectorization is enabled,
> > three dce passes and an additional copyprop pass when any graphite
> > optimization is enabled).
> > 
> > Simply gating pass_tree_loop on number_of_loops () > 1 would disable
> > basic-block vectorization on loopless functions.  Moving
> > basic-block vectorization out of pass_tree_loop works to the extent
> > that you'd need to move IVOPTs as well as data-ref analysis cannot
> > cope with TARGET_MEM_REFs.
> > 
> > So the following introduces a pass_tree_no_loop pass group which
> > is enabled whenever the pass_tree_loop group is disabled.
> > As followup this would allow to skip cleanup work we do after the loop
> > pipeline just to cleanup after it.
> > 
> > Any comments?  Does such followup sound realistic or would it be
> > better to take the opportunity to move IVOPTs a bit closer to
> > RTL expansion and avoid that "pass_tree_no_loop hack"?
> Sounds good.  I've always believed that each pass should be bubbling back up
> some kind of status about what it did/found as well.
> 
> It was more of an RTL issue, but we had a certain commercial testsuite which
> created large loopless tests (*) that consumed vast quantities of wall clock
> time.  I always wanted the RTL loop passes to signal back to toplev.c that no
> loops were found, which would in turn be used to say "we really don't need
> cse-after-loop and friends".
> It's certainly more complex these days, but I'd still like to be able to do
> such things.
> 
> Regardless, that's well outside the scope of what you're trying to accomplish.

Not really - it's just the start of a series of (possible) patches.  I
want to cut down the post-loop pass pipeline for functions without loops.

But indeed we may want to apply the same trick to RTL.

The following is what I ended up applying (ugh, we need a more 
elegant solution for those dump naming / cleanup issues).

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2014-06-23  Richard Biener  <rguenther@suse.de>

	* tree-ssa-loop.c (gate_loop): New function.
	(pass_tree_loop::gate): Call it.
	(pass_data_tree_no_loop, pass_tree_no_loop,
	make_pass_tree_no_loop): New.
	* tree-vectorizer.c: Include tree-scalar-evolution.c
	(pass_slp_vectorize::execute): Initialize loops and SCEV if
	required.
	(pass_slp_vectorize::clone): New method.
	* timevar.def (TV_TREE_NOLOOP): New.
	* tree-pass.h (make_pass_tree_no_loop): Declare.
	* passes.def (pass_tree_no_loop): New pass group with
	SLP vectorizer.

	* g++.dg/vect/slp-pr50413.cc: Scan and cleanup appropriate SLP dumps.
	* g++.dg/vect/slp-pr50819.cc: Likewise.
	* g++.dg/vect/slp-pr56812.cc: Likewise.
	* gcc.dg/vect/bb-slp-1.c: Likewise.
	* gcc.dg/vect/bb-slp-10.c: Likewise.
	* gcc.dg/vect/bb-slp-11.c: Likewise.
	* gcc.dg/vect/bb-slp-13.c: Likewise.
	* gcc.dg/vect/bb-slp-14.c: Likewise.
	* gcc.dg/vect/bb-slp-15.c: Likewise.
	* gcc.dg/vect/bb-slp-16.c: Likewise.
	* gcc.dg/vect/bb-slp-17.c: Likewise.
	* gcc.dg/vect/bb-slp-18.c: Likewise.
	* gcc.dg/vect/bb-slp-19.c: Likewise.
	* gcc.dg/vect/bb-slp-2.c: Likewise.
	* gcc.dg/vect/bb-slp-20.c: Likewise.
	* gcc.dg/vect/bb-slp-21.c: Likewise.
	* gcc.dg/vect/bb-slp-22.c: Likewise.
	* gcc.dg/vect/bb-slp-23.c: Likewise.
	* gcc.dg/vect/bb-slp-24.c: Likewise.
	* gcc.dg/vect/bb-slp-25.c: Likewise.
	* gcc.dg/vect/bb-slp-26.c: Likewise.
	* gcc.dg/vect/bb-slp-27.c: Likewise.
	* gcc.dg/vect/bb-slp-28.c: Likewise.
	* gcc.dg/vect/bb-slp-29.c: Likewise.
	* gcc.dg/vect/bb-slp-3.c: Likewise.
	* gcc.dg/vect/bb-slp-30.c: Likewise.
	* gcc.dg/vect/bb-slp-31.c: Likewise.
	* gcc.dg/vect/bb-slp-32.c: Likewise.
	* gcc.dg/vect/bb-slp-4.c: Likewise.
	* gcc.dg/vect/bb-slp-5.c: Likewise.
	* gcc.dg/vect/bb-slp-6.c: Likewise.
	* gcc.dg/vect/bb-slp-7.c: Likewise.
	* gcc.dg/vect/bb-slp-8.c: Likewise.
	* gcc.dg/vect/bb-slp-8a.c: Likewise.
	* gcc.dg/vect/bb-slp-8b.c: Likewise.
	* gcc.dg/vect/bb-slp-9.c: Likewise.
	* gcc.dg/vect/bb-slp-cond-1.c: Likewise.
	* gcc.dg/vect/bb-slp-pattern-1.c: Likewise.
	* gcc.dg/vect/bb-slp-pattern-2.c: Likewise.
	* gcc.dg/vect/fast-math-bb-slp-call-1.c: Likewise.
	* gcc.dg/vect/fast-math-bb-slp-call-2.c: Likewise.
	* gcc.dg/vect/fast-math-bb-slp-call-3.c: Likewise.
	* gcc.dg/vect/no-tree-reassoc-bb-slp-12.c: Likewise.
	* gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c: Likewise.
	* gcc.dg/vect/pr26359.c: Likewise.
	* gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c: Likewise.

Index: gcc/tree-ssa-loop.c
===================================================================
*** gcc/tree-ssa-loop.c.orig	2014-06-18 14:57:20.173498927 +0200
--- gcc/tree-ssa-loop.c	2014-06-23 13:45:58.744051019 +0200
*************** along with GCC; see the file COPYING3.
*** 42,47 ****
--- 42,68 ----
  #include "diagnostic-core.h"
  #include "tree-vectorizer.h"
  
+ 
+ /* Gate for loop pass group.  The group is controlled by -ftree-loop-optimize
+    but we also avoid running it when the IL doesn't contain any loop.  */
+ 
+ static bool
+ gate_loop (function *fn)
+ {
+   if (!flag_tree_loop_optimize)
+     return false;
+ 
+   /* For -fdump-passes which runs before loop discovery print the
+      state of -ftree-loop-optimize.  */
+   if (!loops_for_fn (fn))
+     return true;
+ 
+   /* Make sure to drop / re-discover loops when necessary.  */
+   if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
+     fix_loop_structure (NULL);
+   return number_of_loops (fn) > 1;
+ }
+ 
  /* The loop superpass.  */
  
  namespace {
*************** public:
*** 68,74 ****
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *) { return flag_tree_loop_optimize != 0; }
  
  }; // class pass_tree_loop
  
--- 89,95 ----
    {}
  
    /* opt_pass methods: */
!   virtual bool gate (function *fn) { return gate_loop (fn); }
  
  }; // class pass_tree_loop
  
*************** make_pass_tree_loop (gcc::context *ctxt)
*** 80,85 ****
--- 101,145 ----
    return new pass_tree_loop (ctxt);
  }
  
+ /* The no-loop superpass.  */
+ 
+ namespace {
+ 
+ const pass_data pass_data_tree_no_loop =
+ {
+   GIMPLE_PASS, /* type */
+   "no_loop", /* name */
+   OPTGROUP_NONE, /* optinfo_flags */
+   false, /* has_execute */
+   TV_TREE_NOLOOP, /* tv_id */
+   PROP_cfg, /* properties_required */
+   0, /* properties_provided */
+   0, /* properties_destroyed */
+   0, /* todo_flags_start */
+   0, /* todo_flags_finish */
+ };
+ 
+ class pass_tree_no_loop : public gimple_opt_pass
+ {
+ public:
+   pass_tree_no_loop (gcc::context *ctxt)
+     : gimple_opt_pass (pass_data_tree_no_loop, ctxt)
+   {}
+ 
+   /* opt_pass methods: */
+   virtual bool gate (function *fn) { return !gate_loop (fn); }
+ 
+ }; // class pass_tree_no_loop
+ 
+ } // anon namespace
+ 
+ gimple_opt_pass *
+ make_pass_tree_no_loop (gcc::context *ctxt)
+ {
+   return new pass_tree_no_loop (ctxt);
+ }
+ 
+ 
  /* Loop optimizer initialization.  */
  
  namespace {
Index: gcc/tree-vectorizer.c
===================================================================
*** gcc/tree-vectorizer.c.orig	2014-06-18 14:57:20.173498927 +0200
--- gcc/tree-vectorizer.c	2014-06-23 13:33:39.456101918 +0200
*************** along with GCC; see the file COPYING3.
*** 82,87 ****
--- 82,89 ----
  #include "tree-ssa-propagate.h"
  #include "dbgcnt.h"
  #include "gimple-fold.h"
+ #include "tree-scalar-evolution.h"
+ 
  
  /* Loop or bb location.  */
  source_location vect_location;
*************** public:
*** 610,615 ****
--- 612,618 ----
    {}
  
    /* opt_pass methods: */
+   opt_pass * clone () { return new pass_slp_vectorize (m_ctxt); }
    virtual bool gate (function *) { return flag_tree_slp_vectorize != 0; }
    virtual unsigned int execute (function *);
  
*************** pass_slp_vectorize::execute (function *f
*** 620,625 ****
--- 623,635 ----
  {
    basic_block bb;
  
+   bool in_loop_pipeline = scev_initialized_p ();
+   if (!in_loop_pipeline)
+     {
+       loop_optimizer_init (LOOPS_NORMAL);
+       scev_initialize ();
+     }
+ 
    init_stmt_vec_info_vec ();
  
    FOR_EACH_BB_FN (bb, fun)
*************** pass_slp_vectorize::execute (function *f
*** 639,644 ****
--- 649,661 ----
      }
  
    free_stmt_vec_info_vec ();
+ 
+   if (!in_loop_pipeline)
+     {
+       scev_finalize ();
+       loop_optimizer_finalize ();
+     }
+ 
    return 0;
  }
  
Index: gcc/timevar.def
===================================================================
*** gcc/timevar.def.orig	2014-06-18 14:57:20.173498927 +0200
--- gcc/timevar.def	2014-06-23 13:33:39.457101918 +0200
*************** DEFTIMEVAR (TV_TREE_CALL_CDCE	     , "tr
*** 162,167 ****
--- 162,168 ----
  DEFTIMEVAR (TV_TREE_DSE		     , "tree DSE")
  DEFTIMEVAR (TV_TREE_MERGE_PHI	     , "PHI merge")
  DEFTIMEVAR (TV_TREE_LOOP	     , "tree loop optimization")
+ DEFTIMEVAR (TV_TREE_NOLOOP           , "loopless fn")
  DEFTIMEVAR (TV_TREE_LOOP_BOUNDS	     , "tree loop bounds")
  DEFTIMEVAR (TV_LIM                   , "tree loop invariant motion")
  DEFTIMEVAR (TV_TREE_LOOP_IVCANON     , "tree canonical iv")
Index: gcc/tree-pass.h
===================================================================
*** gcc/tree-pass.h.orig	2014-06-18 14:57:20.173498927 +0200
--- gcc/tree-pass.h	2014-06-23 13:33:39.457101918 +0200
*************** extern gimple_opt_pass *make_pass_early_
*** 354,359 ****
--- 354,360 ----
  extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
+ extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
  extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
Index: gcc/passes.def
===================================================================
*** gcc/passes.def.orig	2014-06-18 14:57:20.173498927 +0200
--- gcc/passes.def	2014-06-23 13:33:39.468101917 +0200
*************** along with GCC; see the file COPYING3.
*** 198,203 ****
--- 198,205 ----
        NEXT_PASS (pass_sink_code);
        NEXT_PASS (pass_asan);
        NEXT_PASS (pass_tsan);
+       /* Pass group that runs when 1) enabled, 2) there are loops
+ 	 in the function.  */
        NEXT_PASS (pass_tree_loop);
        PUSH_INSERT_PASSES_WITHIN (pass_tree_loop)
  	  NEXT_PASS (pass_tree_loop_init);
*************** along with GCC; see the file COPYING3.
*** 230,239 ****
--- 232,249 ----
  	  NEXT_PASS (pass_complete_unroll);
  	  NEXT_PASS (pass_slp_vectorize);
  	  NEXT_PASS (pass_loop_prefetch);
+ 	  /* Run IVOPTs after the last pass that uses data-reference analysis
+ 	     as that doesn't handle TARGET_MEM_REFs.  */
  	  NEXT_PASS (pass_iv_optimize);
  	  NEXT_PASS (pass_lim);
  	  NEXT_PASS (pass_tree_loop_done);
        POP_INSERT_PASSES ()
+       /* Pass group that runs when pass_tree_loop is disabled or there
+          are no loops in the function.  */
+       NEXT_PASS (pass_tree_no_loop);
+       PUSH_INSERT_PASSES_WITHIN (pass_tree_no_loop)
+ 	  NEXT_PASS (pass_slp_vectorize);
+       POP_INSERT_PASSES ()
        NEXT_PASS (pass_lower_vector_ssa);
        NEXT_PASS (pass_cse_reciprocals);
        NEXT_PASS (pass_reassoc);
Index: gcc/testsuite/g++.dg/vect/slp-pr50413.cc
===================================================================
*** gcc/testsuite/g++.dg/vect/slp-pr50413.cc.orig	2013-08-30 09:55:27.233781584 +0200
--- gcc/testsuite/g++.dg/vect/slp-pr50413.cc	2014-06-23 13:39:38.229077217 +0200
*************** void shift(unsigned char t)
*** 160,165 ****
    V.bitmap.b96 = t;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 160,165 ----
    V.bitmap.b96 = t;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/g++.dg/vect/slp-pr50819.cc
===================================================================
*** gcc/testsuite/g++.dg/vect/slp-pr50819.cc.orig	2013-08-30 09:55:27.234781596 +0200
--- gcc/testsuite/g++.dg/vect/slp-pr50819.cc	2014-06-23 13:40:04.382075416 +0200
*************** const & v2) {
*** 49,53 ****
    res = res + s*(v1+v2);
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 49,53 ----
    res = res + s*(v1+v2);
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/g++.dg/vect/slp-pr56812.cc
===================================================================
*** gcc/testsuite/g++.dg/vect/slp-pr56812.cc.orig	2013-10-29 15:15:40.585678487 +0100
--- gcc/testsuite/g++.dg/vect/slp-pr56812.cc	2014-06-23 13:40:28.401073763 +0200
*************** void mydata::Set (float x)
*** 17,21 ****
      data[i] = x;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 17,21 ----
      data[i] = x;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
Index: gcc/testsuite/gcc.dg/vect/bb-slp-1.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-1.c.orig	2013-08-30 09:55:27.136780433 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-1.c	2014-06-23 14:05:12.432971589 +0200
*************** int main (void)
*** 56,61 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 56,62 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-10.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-10.c.orig	2013-08-30 09:55:27.136780433 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-10.c	2014-06-23 14:05:23.580970821 +0200
*************** int main (void)
*** 49,55 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "unsupported alignment in basic block." 1 "slp" { xfail vect_element_align } } } */
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 49,55 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "unsupported alignment in basic block." 1 "slp2" { xfail vect_element_align } } } */
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-11.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-11.c.orig	2013-08-30 09:55:27.137780445 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-11.c	2014-06-23 13:48:32.108040460 +0200
*************** int main (void)
*** 48,53 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect64 } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 48,53 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect64 } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-13.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-13.c.orig	2013-08-30 09:55:27.126780313 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-13.c	2014-06-23 13:48:50.026039226 +0200
*************** int main (void)
*** 46,51 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 46,51 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-14.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-14.c.orig	2013-08-30 09:55:27.127780325 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-14.c	2014-06-23 13:49:08.409037961 +0200
*************** int main (void)
*** 47,52 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp"  } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 47,52 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2"  } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-15.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-15.c.orig	2013-08-30 09:55:27.131780373 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-15.c	2014-06-23 13:49:21.367037069 +0200
*************** int main (void)
*** 51,56 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 51,56 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-16.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-16.c.orig	2013-08-30 09:55:27.132780385 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-16.c	2014-06-23 14:05:33.215970158 +0200
*************** int main (void)
*** 65,70 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 65,71 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-17.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-17.c.orig	2013-08-30 09:55:27.133780397 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-17.c	2014-06-23 13:49:54.129034813 +0200
*************** int main (void)
*** 57,62 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 57,62 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-18.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-18.c.orig	2013-08-30 09:55:27.134780409 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-18.c	2014-06-23 13:50:06.610033954 +0200
*************** int main (void)
*** 46,51 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 46,51 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-19.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-19.c.orig	2013-08-30 09:55:27.135780421 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-19.c	2014-06-23 13:50:20.741032981 +0200
*************** int main (void)
*** 53,58 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  { xfail *-*-* }  } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 53,58 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2"  { xfail *-*-* }  } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-2.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-2.c.orig	2013-08-30 09:55:27.137780445 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-2.c	2014-06-23 14:05:44.829969358 +0200
*************** int main (void)
*** 53,58 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 53,59 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-20.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-20.c.orig	2013-08-30 09:55:27.137780445 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-20.c	2014-06-23 13:50:47.792031118 +0200
*************** int main (void)
*** 63,69 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 63,69 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-21.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-21.c.orig	2013-08-30 09:55:27.126780313 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-21.c	2014-06-23 13:51:02.554030102 +0200
*************** int main (void)
*** 63,70 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  } } */
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "slp" { target { ! {vect_int_mult } } } } } */
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 63,70 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2"  } } */
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "slp2" { target { ! {vect_int_mult } } } } } */
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-22.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-22.c.orig	2013-08-30 09:55:27.127780325 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-22.c	2014-06-23 13:51:18.159029028 +0200
*************** int main (void)
*** 63,69 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  { target { ! {vect_int_mult } } } } } */
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp"  { target vect_int_mult  } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 63,69 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2"  { target { ! {vect_int_mult } } } } } */
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp2"  { target vect_int_mult  } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-23.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-23.c.orig	2013-08-30 09:55:27.131780373 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-23.c	2014-06-23 13:51:32.879028014 +0200
*************** int main (void)
*** 51,56 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 51,56 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-24.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-24.c.orig	2013-08-30 09:55:27.131780373 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-24.c	2014-06-23 14:30:13.534868240 +0200
*************** int main (void)
*** 54,59 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 54,60 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-25.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-25.c.orig	2013-08-30 09:55:27.132780385 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-25.c	2014-06-23 14:30:28.828867187 +0200
*************** int main (void)
*** 54,59 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 54,60 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-26.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-26.c.orig	2013-08-30 09:55:27.133780397 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-26.c	2014-06-23 14:30:34.141866821 +0200
*************** int main (void)
*** 55,60 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect64 } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 55,61 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target vect64 } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-27.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-27.c.orig	2013-08-30 09:55:27.134780409 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-27.c	2014-06-23 14:30:39.003866486 +0200
*************** int main (void)
*** 44,49 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target { vect_int_mult && { vect_unpack && vect_pack_trunc } } } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 44,50 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target { vect_int_mult && { vect_unpack && vect_pack_trunc } } } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-28.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-28.c.orig	2013-08-30 09:55:27.135780421 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-28.c	2014-06-23 14:30:46.722865955 +0200
*************** int main (void)
*** 66,71 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target { vect_int_mult &&  { vect_pack_trunc && vect_unpack } } } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 66,72 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target { vect_int_mult &&  { vect_pack_trunc && vect_unpack } } } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-29.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-29.c.orig	2013-08-30 09:55:27.135780421 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-29.c	2014-06-23 14:30:53.316865501 +0200
*************** int main (void)
*** 54,59 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  { target { vect_int_mult &&  vect_element_align } } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 54,60 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1"  { target { vect_int_mult &&  vect_element_align } } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-3.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-3.c.orig	2013-08-30 09:55:27.137780445 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-3.c	2014-06-23 13:53:36.125019529 +0200
*************** int main (void)
*** 42,47 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 42,47 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-30.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-30.c.orig	2013-08-30 09:55:27.126780313 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-30.c	2014-06-23 13:53:46.675018802 +0200
*************** test1(void)
*** 43,47 ****
  
  int main() { test1(); return a[21]; }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 43,47 ----
  
  int main() { test1(); return a[21]; }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/bb-slp-31.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-31.c.orig	2013-10-10 14:15:51.280493835 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-31.c	2014-06-23 13:53:51.749018453 +0200
*************** void f(){
*** 9,13 ****
    a[1]=1+2*a[1]*a[1];
  }
  
! /* { dg-final { scan-tree-dump "basic block vectorized" "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 9,13 ----
    a[1]=1+2*a[1]*a[1];
  }
  
! /* { dg-final { scan-tree-dump "basic block vectorized" "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/bb-slp-32.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-32.c.orig	2013-10-29 15:15:40.532677912 +0100
--- gcc/testsuite/gcc.dg/vect/bb-slp-32.c	2014-06-23 13:53:56.878018100 +0200
*************** int foo (int *p)
*** 19,23 ****
    return tem0 + tem1 + tem2 + tem3;
  }
  
! /* { dg-final { scan-tree-dump "vectorization is not profitable" "slp" { xfail  vect_no_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 19,23 ----
    return tem0 + tem1 + tem2 + tem3;
  }
  
! /* { dg-final { scan-tree-dump "vectorization is not profitable" "slp2" { xfail  vect_no_align } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/bb-slp-4.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-4.c.orig	2013-08-30 09:55:27.126780313 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-4.c	2014-06-23 13:54:04.122017601 +0200
*************** int main (void)
*** 38,43 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 38,43 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-5.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-5.c.orig	2013-08-30 09:55:27.130780361 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-5.c	2014-06-23 13:54:10.426017167 +0200
*************** int main (void)
*** 47,52 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 47,52 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-6.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-6.c.orig	2013-08-30 09:55:27.131780373 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-6.c	2014-06-23 13:54:15.672016806 +0200
*************** int main (void)
*** 45,50 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 45,50 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-7.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-7.c.orig	2013-08-30 09:55:27.132780385 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-7.c	2014-06-23 13:54:21.958016373 +0200
*************** int main (void)
*** 46,51 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 46,51 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-8.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-8.c.orig	2013-08-30 09:55:27.133780397 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-8.c	2014-06-23 13:54:29.503015854 +0200
*************** int main (void)
*** 48,53 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  { target vect_hw_misalign } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 48,53 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2"  { target vect_hw_misalign } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-8a.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-8a.c.orig	2013-08-30 09:55:27.135780421 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-8a.c	2014-06-23 13:54:35.707015427 +0200
*************** int main (void)
*** 47,52 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 47,52 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-8b.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-8b.c.orig	2013-08-30 09:55:27.136780433 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-8b.c	2014-06-23 13:54:40.903015069 +0200
*************** int main (void)
*** 49,54 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  { target vect_hw_misalign } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 49,54 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2"  { target vect_hw_misalign } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-9.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-9.c.orig	2013-08-30 09:55:27.134780409 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-9.c	2014-06-23 13:54:49.587014471 +0200
*************** int main (void)
*** 46,51 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp"  { xfail  vect_no_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 46,51 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2"  { xfail  vect_no_align } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c.orig	2013-08-30 09:55:27.136780433 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c	2014-06-23 14:31:03.958864768 +0200
*************** int main ()
*** 41,46 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
  
--- 41,47 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target vect_element_align } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
  
Index: gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c.orig	2012-03-16 10:54:03.000000000 +0100
--- gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c	2014-06-23 14:06:31.460966148 +0200
*************** int main (void)
*** 48,54 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "slp" { target { vect_widen_mult_hi_to_si || vect_unpack } } } } */
! /* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 8 "slp" { target vect_widen_mult_hi_to_si_pattern } } } */
! /* { dg-final { scan-tree-dump-times "pattern recognized" 8 "slp" { target vect_widen_mult_hi_to_si_pattern } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 48,55 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "slp2" { target { vect_widen_mult_hi_to_si || vect_unpack } } } } */
! /* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 8 "slp2" { target vect_widen_mult_hi_to_si_pattern } } } */
! /* { dg-final { scan-tree-dump-times "pattern recognized" 8 "slp2" { target vect_widen_mult_hi_to_si_pattern } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c.orig	2013-08-30 09:55:27.134780409 +0200
--- gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c	2014-06-23 14:31:12.229864199 +0200
*************** int main ()
*** 48,52 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target { vect_element_align && vect_pack_trunc } } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 48,53 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" { target { vect_element_align && vect_pack_trunc } } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c.orig	2013-08-30 09:55:27.132780385 +0200
--- gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c	2014-06-23 14:31:25.106863312 +0200
*************** main ()
*** 45,49 ****
    return main1 ();
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target { vect_call_copysignf && vect_call_sqrtf } } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 45,50 ----
    return main1 ();
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target { vect_call_copysignf && vect_call_sqrtf } } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c.orig	2013-08-30 09:55:27.133780397 +0200
--- gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c	2014-06-23 14:31:32.741862787 +0200
*************** main ()
*** 63,67 ****
    return main1 ();
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp" { target vect_call_lrint } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 63,68 ----
    return main1 ();
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp2" { target vect_call_lrint } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c.orig	2013-03-13 11:39:27.969477882 +0100
--- gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c	2014-06-23 14:03:08.341980132 +0200
*************** int main()
*** 65,68 ****
    return 0;
  }
  
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 65,69 ----
    return 0;
  }
  
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c.orig	2013-08-30 09:55:27.134780409 +0200
--- gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c	2014-06-23 14:03:35.684978250 +0200
*************** int main (void)
*** 47,52 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 47,53 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */
! /* { dg-final { cleanup-tree-dump "slp1" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    
Index: gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c.orig	2013-04-04 15:31:59.774876073 +0200
--- gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c	2014-06-23 14:04:13.962975614 +0200
*************** A sum(A a,A b)
*** 13,17 ****
    return a;
  }
  
! /* { dg-final { scan-tree-dump-times "not vectorized: more than one data ref in stmt" 0 "slp" } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
--- 13,17 ----
    return a;
  }
  
! /* { dg-final { scan-tree-dump-times "not vectorized: more than one data ref in stmt" 0 "slp2" } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
Index: gcc/testsuite/gcc.dg/vect/pr26359.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/pr26359.c.orig	2014-06-18 13:43:34.726803613 +0200
--- gcc/testsuite/gcc.dg/vect/pr26359.c	2014-06-23 14:32:05.609860524 +0200
*************** foo () {
*** 13,17 ****
  }
  
  /* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dce5" } } */
! /* { dg-final { cleanup-tree-dump "dce" } } */
  /* { dg-final { cleanup-tree-dump "vect" } } */
--- 13,17 ----
  }
  
  /* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dce5" } } */
! /* { dg-final { cleanup-tree-dump "dce5" } } */
  /* { dg-final { cleanup-tree-dump "vect" } } */
Index: gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c
===================================================================
*** gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c.orig	2010-11-23 10:52:09.000000000 +0100
--- gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c	2014-06-23 14:38:12.774835245 +0200
*************** int main (void)
*** 41,46 ****
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp"  { xfail  vect_no_align } } } */
! /* { dg-final { cleanup-tree-dump "slp" } } */
    
--- 41,46 ----
    return 0;
  }
  
! /* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp2"  { xfail  vect_no_align } } } */
! /* { dg-final { cleanup-tree-dump "slp2" } } */
    

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-06-23 16:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-18 10:44 [PATCH][RFC] Gate loop passes group on number-of-loops > 1, add no-loops group Richard Biener
2014-06-18 10:54 ` Jakub Jelinek
2014-06-18 13:38 ` Jeff Law
2014-06-23 16:50   ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).