diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 06763f0bcbc..14d4b3f75da 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2014-06-23 Richard Biener + + * 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. + 2014-06-23 H.J. Lu PR target/61570 diff --git a/gcc/passes.def b/gcc/passes.def index 26b30c938f1..c574b4ecff4 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -198,6 +198,8 @@ along with GCC; see the file COPYING3. If not see 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); @@ -230,10 +232,18 @@ along with GCC; see the file COPYING3. If not see 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d623f6ecb92..ad97d0b17d0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,52 @@ +2014-06-23 Richard Biener + + * 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. + 2014-06-23 Marek Polacek * c-c++-common/pr49706-2.c: New test. diff --git a/gcc/testsuite/g++.dg/vect/slp-pr50413.cc b/gcc/testsuite/g++.dg/vect/slp-pr50413.cc index 6e69f11b382..4ba606c8bd7 100644 --- a/gcc/testsuite/g++.dg/vect/slp-pr50413.cc +++ b/gcc/testsuite/g++.dg/vect/slp-pr50413.cc @@ -160,6 +160,6 @@ void shift(unsigned char t) V.bitmap.b96 = t; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/g++.dg/vect/slp-pr50819.cc b/gcc/testsuite/g++.dg/vect/slp-pr50819.cc index 515d774a228..60fd1561b34 100644 --- a/gcc/testsuite/g++.dg/vect/slp-pr50819.cc +++ b/gcc/testsuite/g++.dg/vect/slp-pr50819.cc @@ -49,5 +49,5 @@ const & v2) { res = res + s*(v1+v2); } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/g++.dg/vect/slp-pr56812.cc b/gcc/testsuite/g++.dg/vect/slp-pr56812.cc index 9c0b2b8b78b..a0155a921d6 100644 --- a/gcc/testsuite/g++.dg/vect/slp-pr56812.cc +++ b/gcc/testsuite/g++.dg/vect/slp-pr56812.cc @@ -17,5 +17,5 @@ void mydata::Set (float x) data[i] = x; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp1" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-1.c index 1caa3cf5c60..138a8ddbcc3 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-1.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-1.c @@ -56,6 +56,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-10.c b/gcc/testsuite/gcc.dg/vect/bb-slp-10.c index 658bf03ca56..a1850ed7328 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-10.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-10.c @@ -49,7 +49,7 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-11.c b/gcc/testsuite/gcc.dg/vect/bb-slp-11.c index 3c350a7ab22..1ae31416b83 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-11.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-11.c @@ -48,6 +48,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect64 } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect64 } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-13.c b/gcc/testsuite/gcc.dg/vect/bb-slp-13.c index 88838cea9bc..9c153a1fff3 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-13.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-13.c @@ -46,6 +46,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-14.c b/gcc/testsuite/gcc.dg/vect/bb-slp-14.c index d46deadd0dc..a55c48eb09b 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-14.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-14.c @@ -47,6 +47,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-15.c b/gcc/testsuite/gcc.dg/vect/bb-slp-15.c index fd065e6ce35..93d792d63f8 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-15.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-15.c @@ -51,6 +51,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-16.c b/gcc/testsuite/gcc.dg/vect/bb-slp-16.c index 0cbec65b773..5107408aa19 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-16.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-16.c @@ -65,6 +65,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-17.c b/gcc/testsuite/gcc.dg/vect/bb-slp-17.c index 3f14ff487a5..0a92ee70ddf 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-17.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-17.c @@ -57,6 +57,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-18.c b/gcc/testsuite/gcc.dg/vect/bb-slp-18.c index 7d73dbd8b23..21b1dfd25bc 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-18.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-18.c @@ -46,6 +46,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-19.c b/gcc/testsuite/gcc.dg/vect/bb-slp-19.c index 576bbc16921..021a4ee3e86 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-19.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-19.c @@ -53,6 +53,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { xfail *-*-* } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { xfail *-*-* } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-2.c b/gcc/testsuite/gcc.dg/vect/bb-slp-2.c index accc472f791..8947f5e60f7 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-2.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-2.c @@ -53,6 +53,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-20.c b/gcc/testsuite/gcc.dg/vect/bb-slp-20.c index a7978a70d7a..c17186931b6 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-20.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-20.c @@ -63,7 +63,7 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-21.c b/gcc/testsuite/gcc.dg/vect/bb-slp-21.c index 8ad71454afe..5b2247bcc18 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-21.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-21.c @@ -63,8 +63,8 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-22.c b/gcc/testsuite/gcc.dg/vect/bb-slp-22.c index e425dc9ade1..597f2cec04d 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-22.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-22.c @@ -63,7 +63,7 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-23.c b/gcc/testsuite/gcc.dg/vect/bb-slp-23.c index 35f5186fd74..adb69795e6e 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-23.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-23.c @@ -51,6 +51,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-24.c b/gcc/testsuite/gcc.dg/vect/bb-slp-24.c index d0c1d69d1fa..54148384f78 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-24.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-24.c @@ -54,6 +54,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-25.c b/gcc/testsuite/gcc.dg/vect/bb-slp-25.c index 737b3b06c04..92137d9ef51 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-25.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-25.c @@ -54,6 +54,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-26.c b/gcc/testsuite/gcc.dg/vect/bb-slp-26.c index 881f3204f40..f33a94abd0b 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-26.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-26.c @@ -55,6 +55,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect64 } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-27.c b/gcc/testsuite/gcc.dg/vect/bb-slp-27.c index 7fcc1e61041..ae6ff8368b1 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-27.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-27.c @@ -44,6 +44,7 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-28.c b/gcc/testsuite/gcc.dg/vect/bb-slp-28.c index 650c50eb938..2ef0667972d 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-28.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-28.c @@ -66,6 +66,7 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-29.c b/gcc/testsuite/gcc.dg/vect/bb-slp-29.c index c5b31343a44..dcc40e5d850 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-29.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-29.c @@ -54,6 +54,7 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-3.c b/gcc/testsuite/gcc.dg/vect/bb-slp-3.c index 093389faf9f..0fbd3b2b8f0 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-3.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-3.c @@ -42,6 +42,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-30.c b/gcc/testsuite/gcc.dg/vect/bb-slp-30.c index 86da55a47cc..11c06087fcb 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-30.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-30.c @@ -43,5 +43,5 @@ test1(void) int main() { test1(); return a[21]; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-31.c b/gcc/testsuite/gcc.dg/vect/bb-slp-31.c index 7ea341216d6..017eba6627c 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-31.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-31.c @@ -9,5 +9,5 @@ void f(){ a[1]=1+2*a[1]*a[1]; } -/* { dg-final { scan-tree-dump "basic block vectorized" "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump "basic block vectorized" "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-32.c b/gcc/testsuite/gcc.dg/vect/bb-slp-32.c index 6d69d15c965..2e291591129 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-32.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-32.c @@ -19,5 +19,5 @@ int foo (int *p) 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" } } */ +/* { dg-final { scan-tree-dump "vectorization is not profitable" "slp2" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-4.c b/gcc/testsuite/gcc.dg/vect/bb-slp-4.c index 2c4b62dc4ac..99589591a49 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-4.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-4.c @@ -38,6 +38,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-5.c b/gcc/testsuite/gcc.dg/vect/bb-slp-5.c index ca093e795fc..10a410bafcf 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-5.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-5.c @@ -47,6 +47,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-6.c b/gcc/testsuite/gcc.dg/vect/bb-slp-6.c index c233a9d5010..6ab81832c02 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-6.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-6.c @@ -45,6 +45,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_int_mult } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-7.c b/gcc/testsuite/gcc.dg/vect/bb-slp-7.c index b7b90f0b95b..275f1d3142f 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-7.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-7.c @@ -46,6 +46,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-8.c b/gcc/testsuite/gcc.dg/vect/bb-slp-8.c index 303fe3e4336..5012d02cdc2 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-8.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-8.c @@ -48,6 +48,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_hw_misalign } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_hw_misalign } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-8a.c b/gcc/testsuite/gcc.dg/vect/bb-slp-8a.c index 55a6a81d38c..87b6cb3e94c 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-8a.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-8a.c @@ -47,6 +47,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp" } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 0 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-8b.c b/gcc/testsuite/gcc.dg/vect/bb-slp-8b.c index 8c5c5ab9182..13eba70c359 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-8b.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-8b.c @@ -49,6 +49,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_hw_misalign } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { target vect_hw_misalign } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-9.c b/gcc/testsuite/gcc.dg/vect/bb-slp-9.c index 9f1a5877a29..d55f388c8d7 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-9.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-9.c @@ -46,6 +46,6 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { xfail vect_no_align } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp2" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c index 86376b44641..11415c89cdd 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-cond-1.c @@ -41,6 +41,7 @@ int main () return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_element_align } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c index ff520c06f52..205c0b047fc 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-1.c @@ -48,7 +48,8 @@ int main (void) 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c index 545c08d86e9..11aeb4afb52 100644 --- a/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pattern-2.c @@ -48,5 +48,6 @@ int main () 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c index 4e8d71b9673..e1bc1a8e339 100644 --- a/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c +++ b/gcc/testsuite/gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c @@ -41,6 +41,6 @@ int main (void) 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" } } */ +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp2" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c index c138a78b328..5fa50d6e2fd 100644 --- a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c +++ b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-1.c @@ -45,5 +45,6 @@ main () 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" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c index c126c1c0085..982b32dce4e 100644 --- a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c +++ b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-2.c @@ -63,5 +63,6 @@ main () return main1 (); } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 2 "slp" { target vect_call_lrint } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c index 5878d418f50..92caddef418 100644 --- a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c +++ b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c @@ -65,4 +65,5 @@ int main() return 0; } -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { dg-final { cleanup-tree-dump "slp1" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c b/gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c index 49274f88f57..c75ae5ecb40 100644 --- a/gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c +++ b/gcc/testsuite/gcc.dg/vect/no-tree-reassoc-bb-slp-12.c @@ -47,6 +47,7 @@ int main (void) return 0; } -/* { dg-final { scan-tree-dump-times "basic block vectorized" 1 "slp" { target vect_int_mult } } } */ -/* { dg-final { cleanup-tree-dump "slp" } } */ +/* { 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" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c b/gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c index 90dcd844334..6d70bd05e00 100644 --- a/gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c +++ b/gcc/testsuite/gcc.dg/vect/no-tree-sra-bb-slp-pr50730.c @@ -13,5 +13,5 @@ A sum(A a,A b) 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" } } */ +/* { dg-final { scan-tree-dump-times "not vectorized: more than one data ref in stmt" 0 "slp2" } } */ +/* { dg-final { cleanup-tree-dump "slp2" } } */ diff --git a/gcc/testsuite/gcc.dg/vect/pr26359.c b/gcc/testsuite/gcc.dg/vect/pr26359.c index f4e2a379cf1..7a0cb0daca9 100644 --- a/gcc/testsuite/gcc.dg/vect/pr26359.c +++ b/gcc/testsuite/gcc.dg/vect/pr26359.c @@ -13,5 +13,5 @@ foo () { } /* { dg-final { scan-tree-dump-times "Deleting : vect_" 0 "dce5" } } */ -/* { dg-final { cleanup-tree-dump "dce" } } */ +/* { dg-final { cleanup-tree-dump "dce5" } } */ /* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/timevar.def b/gcc/timevar.def index cbb64d5b73f..6b1b6dfc04d 100644 --- a/gcc/timevar.def +++ b/gcc/timevar.def @@ -162,6 +162,7 @@ DEFTIMEVAR (TV_TREE_CALL_CDCE , "tree buildin call DCE") 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") diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index bdaf673e3a4..ec5f367d24d 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -354,6 +354,7 @@ extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt); 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); diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index b49ed8a52b2..9da77a9ee4f 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -42,6 +42,27 @@ along with GCC; see the file COPYING3. If not see #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 { @@ -68,7 +89,7 @@ public: {} /* opt_pass methods: */ - virtual bool gate (function *) { return flag_tree_loop_optimize != 0; } + virtual bool gate (function *fn) { return gate_loop (fn); } }; // class pass_tree_loop @@ -80,6 +101,45 @@ make_pass_tree_loop (gcc::context *ctxt) 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 { diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index e2939b18ffc..f10e6218273 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -82,6 +82,8 @@ along with GCC; see the file COPYING3. If not see #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; @@ -610,6 +612,7 @@ public: {} /* 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 *); @@ -620,6 +623,13 @@ pass_slp_vectorize::execute (function *fun) { 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) @@ -639,6 +649,13 @@ pass_slp_vectorize::execute (function *fun) } free_stmt_vec_info_vec (); + + if (!in_loop_pipeline) + { + scev_finalize (); + loop_optimizer_finalize (); + } + return 0; }