From 9857228c4ca42e03fb12177065a14b5dadaf7e00 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Tue, 20 May 2008 19:17:12 +0000 Subject: [PATCH] re PR tree-optimization/36181 (Simple for loop generates ICE with -ftree-parallelize-loops=2) 2008-05-20 Sebastian Pop Jan Sjodin PR tree-optimization/36181 * tree-parloops.c (loop_has_vector_phi_nodes): New. (parallelize_loops): Don't parallelize when the loop has vector phi nodes. * gcc.dg/tree-ssa/pr36181.c: New. From-SVN: r135673 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/tree-ssa/pr36181.c | 13 +++++++++++++ gcc/tree-parloops.c | 23 +++++++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr36181.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba15ab5..65cb134 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-05-20 Sebastian Pop + Jan Sjodin + + PR tree-optimization/36181 + * tree-parloops.c (loop_has_vector_phi_nodes): New. + (parallelize_loops): Don't parallelize when the loop has vector + phi nodes. + 2008-05-20 Jan Sjodin Sebastian Pop diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fae9687..0ff1a09 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-05-20 Jan Sjodin + Sebastian Pop + + PR tree-optimization/36181 + * gcc.dg/tree-ssa/pr36181.c: New. + 2008-05-20 Uros Bizjak PR testsuite/36057 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr36181.c b/gcc/testsuite/gcc.dg/tree-ssa/pr36181.c new file mode 100644 index 0000000..6eda0a4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr36181.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -ftree-parallelize-loops=2" } */ + +int foo () +{ + int i, sum = 0, data[1024]; + + for(i = 0; i<1024; i++) + sum += data[i]; + + return sum; +} + diff --git a/gcc/tree-parloops.c b/gcc/tree-parloops.c index de4f306..109e305 100644 --- a/gcc/tree-parloops.c +++ b/gcc/tree-parloops.c @@ -1797,6 +1797,27 @@ gen_parallel_loop (struct loop *loop, htab_t reduction_list, omp_expand_local (parallel_head); } +/* Returns true when LOOP contains vector phi nodes. */ + +static bool +loop_has_vector_phi_nodes (struct loop *loop) +{ + unsigned i; + basic_block *bbs = get_loop_body_in_dom_order (loop); + bool res = true; + tree phi; + + for (i = 0; i < loop->num_nodes; i++) + for (phi = phi_nodes (bbs[i]); phi; phi = PHI_CHAIN (phi)) + if (TREE_CODE (TREE_TYPE (PHI_RESULT (phi))) == VECTOR_TYPE) + goto end; + + res = false; + end: + free (bbs); + return res; +} + /* Detect parallel loops and generate parallel code using libgomp primitives. Returns true if some loop was parallelized, false otherwise. */ @@ -1828,6 +1849,8 @@ parallelize_loops (void) /* And of course, the loop must be parallelizable. */ || !can_duplicate_loop_p (loop) || loop_has_blocks_with_irreducible_flag (loop) + /* FIXME: the check for vector phi nodes could be removed. */ + || loop_has_vector_phi_nodes (loop) || !loop_parallel_p (loop, reduction_list, &niter_desc)) continue; -- 2.7.4