aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2015-08-24 13:14:17 +0000
committerTom de Vries <vries@gcc.gnu.org>2015-08-24 13:14:17 +0000
commit6be5c241bbf8f3b6cec45f0b1074156822a96359 (patch)
treee8ba4654c7ecc7f4b815ad5cbf25b654f1dd4526
parent7373d132e1f364cb3ee2a045b6319a866f1e7d86 (diff)
downloadgcc-6be5c241bbf8f3b6cec45f0b1074156822a96359.zip
gcc-6be5c241bbf8f3b6cec45f0b1074156822a96359.tar.gz
gcc-6be5c241bbf8f3b6cec45f0b1074156822a96359.tar.bz2
Optimize expand_omp_for_static_chunk for chunk_size one
2015-08-24 Tom de Vries <tom@codesourcery.com> PR tree-optimization/65468 * omp-low.c (expand_omp_for_static_chunk): Remove inner loop if chunk_size is one. * gcc.dg/gomp/static-chunk-size-one.c: New test. * testsuite/libgomp.c/static-chunk-size-one.c: New test. From-SVN: r227124
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/omp-low.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/gomp/static-chunk-size-one.c18
-rw-r--r--libgomp/ChangeLog5
-rw-r--r--libgomp/testsuite/libgomp.c/static-chunk-size-one.c23
6 files changed, 65 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7d25402..d1a9e3a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-08-24 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/65468
+ * omp-low.c (expand_omp_for_static_chunk): Remove inner loop if
+ chunk_size is one.
+
2015-08-24 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx.c (walk_args_for_param): Revert previous
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index d181101..19f34ec 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -7204,9 +7204,14 @@ expand_omp_for_static_chunk (struct omp_region *region,
assign_stmt = gimple_build_assign (vback, t);
gsi_insert_before (&gsi, assign_stmt, GSI_SAME_STMT);
- t = build2 (fd->loop.cond_code, boolean_type_node,
- DECL_P (vback) && TREE_ADDRESSABLE (vback)
- ? t : vback, e);
+ if (tree_int_cst_equal (fd->chunk_size, integer_one_node))
+ t = build2 (EQ_EXPR, boolean_type_node,
+ build_int_cst (itype, 0),
+ build_int_cst (itype, 1));
+ else
+ t = build2 (fd->loop.cond_code, boolean_type_node,
+ DECL_P (vback) && TREE_ADDRESSABLE (vback)
+ ? t : vback, e);
gsi_insert_before (&gsi, gimple_build_cond_empty (t), GSI_SAME_STMT);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6235844..36fc88f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-24 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/65468
+ * gcc.dg/gomp/static-chunk-size-one.c: New test.
+
2015-08-23 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR libfortran/54572
diff --git a/gcc/testsuite/gcc.dg/gomp/static-chunk-size-one.c b/gcc/testsuite/gcc.dg/gomp/static-chunk-size-one.c
new file mode 100644
index 0000000..e82de77
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/static-chunk-size-one.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-fopenmp -O2 -fdump-tree-optimized -fno-tree-pre" } */
+
+int
+bar ()
+{
+ int a = 0, i;
+
+#pragma omp parallel for num_threads (3) reduction (+:a) schedule(static, 1)
+ for (i = 0; i < 10; i++)
+ a += i;
+
+ return a;
+}
+
+/* Two phis for reduction, one in loop header, one in loop exit. One phi for iv
+ in loop header. */
+/* { dg-final { scan-tree-dump-times "PHI" 3 "optimized" } } */
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index bd9111b..43aaa52 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-24 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/65468
+ * testsuite/libgomp.c/static-chunk-size-one.c: New test.
+
2015-08-24 Joost VandeVondele <vondele@gnu.gcc.org>
PR libgomp/66761
diff --git a/libgomp/testsuite/libgomp.c/static-chunk-size-one.c b/libgomp/testsuite/libgomp.c/static-chunk-size-one.c
new file mode 100644
index 0000000..9ed7b83
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/static-chunk-size-one.c
@@ -0,0 +1,23 @@
+extern void abort ();
+
+int
+bar ()
+{
+ int a = 0, i;
+
+#pragma omp parallel for num_threads (3) reduction (+:a) schedule(static, 1)
+ for (i = 0; i < 10; i++)
+ a += i;
+
+ return a;
+}
+
+int
+main (void)
+{
+ int res;
+ res = bar ();
+ if (res != 45)
+ abort ();
+ return 0;
+}