rpms/gcc/devel gcc41-pr29949.patch, NONE, 1.1 gcc41-pr29965.patch, 1.1, 1.2 gcc41.spec, 1.126, 1.127

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Fri Dec 1 16:52:42 UTC 2006


Author: jakub

Update of /cvs/dist/rpms/gcc/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv25444

Modified Files:
	gcc41-pr29965.patch gcc41.spec 
Added Files:
	gcc41-pr29949.patch 
Log Message:
4.1.1-44

gcc41-pr29949.patch:
 gcc/omp-low.c                           |   50 ++--
 libgomp/loop.c                          |   12 -
 libgomp/testsuite/libgomp.c/pr29949-1.c |  328 ++++++++++++++++++++++++++++++++
 libgomp/testsuite/libgomp.c/pr29949-2.c |  328 ++++++++++++++++++++++++++++++++
 4 files changed, 685 insertions(+), 33 deletions(-)

--- NEW FILE gcc41-pr29949.patch ---
2006-12-01  Jakub Jelinek  <jakub at redhat.com>

	PR libgomp/29949
	* omp-low.c (expand_omp_for_static_nochunk,
	expand_omp_for_static_chunk): Do all arithmetics in signed rather than
	unsigned type.

	* loop.c (gomp_loop_init): Make parameters signed.  Set ws->end to
	start if there shouldn't be any loop iterations.
	(gomp_loop_ordered_static_start): Remove start == end test.
	* testsuite/libgomp.c/pr29949-1.c: New test.
	* testsuite/libgomp.c/pr29949-2.c: New test.

--- gcc/omp-low.c.jj	2006-11-30 14:51:52.000000000 +0100
+++ gcc/omp-low.c	2006-12-01 16:44:51.000000000 +0100
@@ -2771,13 +2771,12 @@ expand_omp_for_static_nochunk (struct om
 			       struct omp_for_data *fd)
 {
   tree l0, l1, l2, n, q, s0, e0, e, t, nthreads, threadid;
-  tree type, utype, list;
+  tree type, list;
   basic_block entry_bb, exit_bb, seq_start_bb, body_bb, cont_bb;
   basic_block fin_bb;
   block_stmt_iterator si;
 
   type = TREE_TYPE (fd->v);
-  utype = lang_hooks.types.unsigned_type (type);
 
   entry_bb = region->entry;
   seq_start_bb = create_empty_bb (entry_bb);
@@ -2795,12 +2794,12 @@ expand_omp_for_static_nochunk (struct om
 
   t = built_in_decls[BUILT_IN_OMP_GET_NUM_THREADS];
   t = build_function_call_expr (t, NULL);
-  t = fold_convert (utype, t);
+  t = fold_convert (type, t);
   nthreads = get_formal_tmp_var (t, &list);
   
   t = built_in_decls[BUILT_IN_OMP_GET_THREAD_NUM];
   t = build_function_call_expr (t, NULL);
-  t = fold_convert (utype, t);
+  t = fold_convert (type, t);
   threadid = get_formal_tmp_var (t, &list);
 
   fd->n1 = fold_convert (type, fd->n1);
@@ -2820,25 +2819,25 @@ expand_omp_for_static_nochunk (struct om
   t = fold_build2 (PLUS_EXPR, type, t, fd->n2);
   t = fold_build2 (MINUS_EXPR, type, t, fd->n1);
   t = fold_build2 (TRUNC_DIV_EXPR, type, t, fd->step);
-  t = fold_convert (utype, t);
+  t = fold_convert (type, t);
   if (is_gimple_val (t))
     n = t;
   else
     n = get_formal_tmp_var (t, &list);
 
-  t = build2 (TRUNC_DIV_EXPR, utype, n, nthreads);
+  t = build2 (TRUNC_DIV_EXPR, type, n, nthreads);
   q = get_formal_tmp_var (t, &list);
 
-  t = build2 (MULT_EXPR, utype, q, nthreads);
-  t = build2 (NE_EXPR, utype, t, n);
-  t = build2 (PLUS_EXPR, utype, q, t);
+  t = build2 (MULT_EXPR, type, q, nthreads);
+  t = build2 (NE_EXPR, type, t, n);
+  t = build2 (PLUS_EXPR, type, q, t);
   q = get_formal_tmp_var (t, &list);
 
-  t = build2 (MULT_EXPR, utype, q, threadid);
+  t = build2 (MULT_EXPR, type, q, threadid);
   s0 = get_formal_tmp_var (t, &list);
 
-  t = build2 (PLUS_EXPR, utype, s0, q);
-  t = build2 (MIN_EXPR, utype, t, n);
+  t = build2 (PLUS_EXPR, type, s0, q);
+  t = build2 (MIN_EXPR, type, t, n);
   e0 = get_formal_tmp_var (t, &list);
 
   t = build2 (GE_EXPR, boolean_type_node, s0, e0);
@@ -2944,14 +2943,13 @@ expand_omp_for_static_chunk (struct omp_
 {
   tree l0, l1, l2, l3, l4, n, s0, e0, e, t;
   tree trip, nthreads, threadid;
-  tree type, utype;
+  tree type;
   basic_block entry_bb, exit_bb, body_bb, seq_start_bb, iter_part_bb;
   basic_block trip_update_bb, cont_bb, fin_bb;
   tree list;
   block_stmt_iterator si;
 
   type = TREE_TYPE (fd->v);
-  utype = lang_hooks.types.unsigned_type (type);
 
   entry_bb = region->entry;
   iter_part_bb = create_empty_bb (entry_bb);
@@ -2973,12 +2971,12 @@ expand_omp_for_static_chunk (struct omp_
 
   t = built_in_decls[BUILT_IN_OMP_GET_NUM_THREADS];
   t = build_function_call_expr (t, NULL);
-  t = fold_convert (utype, t);
+  t = fold_convert (type, t);
   nthreads = get_formal_tmp_var (t, &list);
   
   t = built_in_decls[BUILT_IN_OMP_GET_THREAD_NUM];
   t = build_function_call_expr (t, NULL);
-  t = fold_convert (utype, t);
+  t = fold_convert (type, t);
   threadid = get_formal_tmp_var (t, &list);
 
   fd->n1 = fold_convert (type, fd->n1);
@@ -2993,7 +2991,7 @@ expand_omp_for_static_chunk (struct omp_
   if (!is_gimple_val (fd->step))
     fd->step = get_formal_tmp_var (fd->step, &list);
 
-  fd->chunk_size = fold_convert (utype, fd->chunk_size);
+  fd->chunk_size = fold_convert (type, fd->chunk_size);
   if (!is_gimple_val (fd->chunk_size))
     fd->chunk_size = get_formal_tmp_var (fd->chunk_size, &list);
 
@@ -3002,13 +3000,13 @@ expand_omp_for_static_chunk (struct omp_
   t = fold_build2 (PLUS_EXPR, type, t, fd->n2);
   t = fold_build2 (MINUS_EXPR, type, t, fd->n1);
   t = fold_build2 (TRUNC_DIV_EXPR, type, t, fd->step);
-  t = fold_convert (utype, t);
+  t = fold_convert (type, t);
   if (is_gimple_val (t))
     n = t;
   else
     n = get_formal_tmp_var (t, &list);
 
-  t = build_int_cst (utype, 0);
+  t = build_int_cst (type, 0);
   trip = get_initialized_tmp_var (t, &list, NULL);
 
   si = bsi_last (entry_bb);
@@ -3019,13 +3017,13 @@ expand_omp_for_static_chunk (struct omp_
   /* Iteration space partitioning goes in ITER_PART_BB.  */
   list = alloc_stmt_list ();
 
-  t = build2 (MULT_EXPR, utype, trip, nthreads);
-  t = build2 (PLUS_EXPR, utype, t, threadid);
-  t = build2 (MULT_EXPR, utype, t, fd->chunk_size);
+  t = build2 (MULT_EXPR, type, trip, nthreads);
+  t = build2 (PLUS_EXPR, type, t, threadid);
+  t = build2 (MULT_EXPR, type, t, fd->chunk_size);
   s0 = get_formal_tmp_var (t, &list);
 
-  t = build2 (PLUS_EXPR, utype, s0, fd->chunk_size);
-  t = build2 (MIN_EXPR, utype, t, n);
+  t = build2 (PLUS_EXPR, type, s0, fd->chunk_size);
+  t = build2 (MIN_EXPR, type, t, n);
   e0 = get_formal_tmp_var (t, &list);
 
   t = build2 (LT_EXPR, boolean_type_node, s0, n);
@@ -3075,8 +3073,8 @@ expand_omp_for_static_chunk (struct omp_
   /* Trip update code goes into TRIP_UPDATE_BB.  */
   list = alloc_stmt_list ();
 
-  t = build_int_cst (utype, 1);
-  t = build2 (PLUS_EXPR, utype, trip, t);
+  t = build_int_cst (type, 1);
+  t = build2 (PLUS_EXPR, type, trip, t);
   t = build2 (MODIFY_EXPR, void_type_node, trip, t);
   gimplify_and_add (t, &list);
 
--- libgomp/loop.c.jj	2006-10-05 00:24:40.000000000 +0200
+++ libgomp/loop.c	2006-12-01 16:33:39.000000000 +0100
@@ -34,13 +34,14 @@
 /* Initialize the given work share construct from the given arguments.  */
 
 static inline void
-gomp_loop_init (struct gomp_work_share *ws, unsigned long start,
-		unsigned long end, unsigned long incr,
-		enum gomp_schedule_type sched, unsigned long chunk_size)
+gomp_loop_init (struct gomp_work_share *ws, long start, long end, long incr,
+		enum gomp_schedule_type sched, long chunk_size)
 {
   ws->sched = sched;
   ws->chunk_size = chunk_size;
-  ws->end = end;
+  /* Canonicalize loops that have zero iterations to ->next == ->end.  */
+  ws->end = ((incr > 0 && start > end) || (incr < 0 && start < end))
+	    ? start : end;
   ws->incr = incr;
   ws->next = start;
 }
@@ -148,9 +149,6 @@ gomp_loop_ordered_static_start (long sta
 {
   struct gomp_thread *thr = gomp_thread ();
 
-  if (start == end)
-    return false;
-
   if (gomp_work_share_start (true))
     {
       gomp_loop_init (thr->ts.work_share, start, end, incr,
--- libgomp/testsuite/libgomp.c/pr29949-1.c.jj	2006-12-01 16:52:27.000000000 +0100
+++ libgomp/testsuite/libgomp.c/pr29949-1.c	2006-12-01 16:52:08.000000000 +0100
@@ -0,0 +1,328 @@
+/* PR libgomp/29949 */
+/* { dg-options "-O2 -fopenmp" } */
+/* { dg-do run } */
+
+extern void abort (void);
+
+int cnt;
+
+void
+test1 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (dynamic)
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test2 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (dynamic)
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test3 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (guided)
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test4 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (guided)
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test5 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (dynamic) ordered
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test6 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (dynamic) ordered
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test7 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (guided) ordered
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test8 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (guided) ordered
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test9 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (dynamic)
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test10 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (dynamic)
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test11 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (guided)
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test12 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (guided)
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test13 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (dynamic) ordered
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test14 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (dynamic) ordered
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test15 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (guided) ordered
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test16 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (guided) ordered
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+int
+__attribute__((noinline))
+test (long j1, long k1, long j2, long k2)
+{
+  test1 (j1, k1, j2, k2);
+  test2 (j1, k1, j2, k2);
+  test3 (j1, k1, j2, k2);
+  test4 (j1, k1, j2, k2);
+  test5 (j1, k1, j2, k2);
+  test6 (j1, k1, j2, k2);
+  test7 (j1, k1, j2, k2);
+  test8 (j1, k1, j2, k2);
+  test9 (j1, k1, j2, k2);
+  test10 (j1, k1, j2, k2);
+  test11 (j1, k1, j2, k2);
+  test12 (j1, k1, j2, k2);
+  test13 (j1, k1, j2, k2);
+  test14 (j1, k1, j2, k2);
+  test15 (j1, k1, j2, k2);
+  test16 (j1, k1, j2, k2);
+  return cnt;
+}
+
+int
+main (void)
+{
+  test (1, 5, 1, 5);
+  test (5, 5, 5, 5);
+  test (5, 4, 5, 4);
+  test (5, 1, 5, 1);
+  return 0;
+}
--- libgomp/testsuite/libgomp.c/pr29949-2.c.jj	2006-12-01 16:52:29.000000000 +0100
+++ libgomp/testsuite/libgomp.c/pr29949-2.c	2006-12-01 16:52:13.000000000 +0100
@@ -0,0 +1,328 @@
+/* PR libgomp/29949 */
+/* { dg-options "-O2 -fopenmp" } */
+/* { dg-do run } */
+
+extern void abort (void);
+
+int cnt;
+
+void
+test1 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static)
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test2 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static)
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test3 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static, 1)
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test4 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static, 1)
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test5 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static) ordered
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test6 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static) ordered
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test7 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static, 1) ordered
+    for (i = j1; i <= k1; ++i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test8 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel reduction (+:e,c)
+  {
+#pragma omp for schedule (static, 1) ordered
+    for (i = k1; i >= j1; --i)
+      {
+	if (i < j2 || i > k2)
+	  ++e;
+#pragma omp ordered
+	++c;
+      }
+#pragma omp atomic
+    ++cnt;
+  }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test9 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static)
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test10 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static)
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test11 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static, 1)
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test12 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static, 1)
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test13 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static) ordered
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test14 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static) ordered
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test15 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static, 1) ordered
+  for (i = j1; i <= k1; ++i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+void
+test16 (long j1, long k1, long j2, long k2)
+{
+  long i, e = 0, c = 0;
+#pragma omp parallel for reduction (+:e,c) schedule (static, 1) ordered
+  for (i = k1; i >= j1; --i)
+    {
+      if (i < j2 || i > k2)
+	++e;
+#pragma omp ordered
+      ++c;
+    }
+  if (e || (c != j2 > k2 ? 0 : k2 - j2 + 1))
+    abort ();
+}
+
+int
+__attribute__((noinline))
+test (long j1, long k1, long j2, long k2)
+{
+  test1 (j1, k1, j2, k2);
+  test2 (j1, k1, j2, k2);
+  test3 (j1, k1, j2, k2);
+  test4 (j1, k1, j2, k2);
+  test5 (j1, k1, j2, k2);
+  test6 (j1, k1, j2, k2);
+  test7 (j1, k1, j2, k2);
+  test8 (j1, k1, j2, k2);
+  test9 (j1, k1, j2, k2);
+  test10 (j1, k1, j2, k2);
+  test11 (j1, k1, j2, k2);
+  test12 (j1, k1, j2, k2);
+  test13 (j1, k1, j2, k2);
+  test14 (j1, k1, j2, k2);
+  test15 (j1, k1, j2, k2);
+  test16 (j1, k1, j2, k2);
+  return cnt;
+}
+
+int
+main (void)
+{
+  test (1, 5, 1, 5);
+  test (5, 5, 5, 5);
+  test (5, 4, 5, 4);
+  test (5, 1, 5, 1);
+  return 0;
+}

gcc41-pr29965.patch:
 omp-low.c                          |  150 +++++++++++++++++++++++++------------
 testsuite/g++.dg/gomp/pr29965-1.C  |   45 +++++++++++
 testsuite/g++.dg/gomp/pr29965-10.C |   24 +++++
 testsuite/g++.dg/gomp/pr29965-2.C  |   98 ++++++++++++++++++++++++
 testsuite/g++.dg/gomp/pr29965-3.C  |   62 +++++++++++++++
 testsuite/g++.dg/gomp/pr29965-4.C  |   44 ++++++++++
 testsuite/g++.dg/gomp/pr29965-5.C  |   44 ++++++++++
 testsuite/g++.dg/gomp/pr29965-6.C  |   44 ++++++++++
 testsuite/g++.dg/gomp/pr29965-7.C  |   32 +++++++
 testsuite/g++.dg/gomp/pr29965-8.C  |   94 +++++++++++++++++++++++
 testsuite/g++.dg/gomp/pr29965-9.C  |   34 ++++++++
 testsuite/gcc.dg/gomp/pr29965-1.c  |   45 +++++++++++
 testsuite/gcc.dg/gomp/pr29965-2.c  |   98 ++++++++++++++++++++++++
 testsuite/gcc.dg/gomp/pr29965-3.c  |   62 +++++++++++++++
 testsuite/gcc.dg/gomp/pr29965-4.c  |   44 ++++++++++
 testsuite/gcc.dg/gomp/pr29965-5.c  |   44 ++++++++++
 testsuite/gcc.dg/gomp/pr29965-6.c  |   44 ++++++++++
 17 files changed, 961 insertions(+), 47 deletions(-)

Index: gcc41-pr29965.patch
===================================================================
RCS file: /cvs/dist/rpms/gcc/devel/gcc41-pr29965.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- gcc41-pr29965.patch	30 Nov 2006 18:50:43 -0000	1.1
+++ gcc41-pr29965.patch	1 Dec 2006 16:52:40 -0000	1.2
@@ -40,7 +40,7 @@
      return;
  
    /* We only support parallel+for and parallel+sections.  */
-@@ -2443,7 +2444,6 @@ expand_omp_parallel (struct omp_region *
+@@ -2444,7 +2445,6 @@ expand_omp_parallel (struct omp_region *
        block_stmt_iterator si;
  
        entry_succ_e = single_succ_edge (entry_bb);
@@ -48,7 +48,7 @@
  
        si = bsi_last (entry_bb);
        gcc_assert (TREE_CODE (bsi_stmt (si)) == OMP_PARALLEL);
-@@ -2451,7 +2451,11 @@ expand_omp_parallel (struct omp_region *
+@@ -2452,7 +2452,11 @@ expand_omp_parallel (struct omp_region *
  
        new_bb = entry_bb;
        remove_edge (entry_succ_e);
@@ -58,10 +58,10 @@
 +	  exit_succ_e = single_succ_edge (exit_bb);
 +	  make_edge (new_bb, exit_succ_e->dest, EDGE_FALLTHRU);
 +	}
+       do_cleanup_cfg = true;
      }
    else
-     {
-@@ -2574,10 +2578,11 @@ expand_omp_for_generic (struct omp_regio
+@@ -2584,10 +2588,11 @@ expand_omp_for_generic (struct omp_regio
  			enum built_in_function start_fn,
  			enum built_in_function next_fn)
  {
@@ -75,7 +75,7 @@
    block_stmt_iterator si;
    bool in_combined_parallel = is_combined_parallel (region);
  
-@@ -2589,18 +2594,25 @@ expand_omp_for_generic (struct omp_regio
+@@ -2599,18 +2604,25 @@ expand_omp_for_generic (struct omp_regio
    TREE_ADDRESSABLE (istart0) = 1;
    TREE_ADDRESSABLE (iend0) = 1;
  
@@ -107,7 +107,7 @@
  
    si = bsi_last (entry_bb);
    gcc_assert (TREE_CODE (bsi_stmt (si)) == OMP_FOR);
-@@ -2626,9 +2638,12 @@ expand_omp_for_generic (struct omp_regio
+@@ -2636,9 +2648,12 @@ expand_omp_for_generic (struct omp_regio
        args = tree_cons (NULL, t, args);
        t = build_function_call_expr (built_in_decls[start_fn], args);
        t = get_formal_tmp_var (t, &list);
@@ -123,7 +123,7 @@
        bsi_insert_after (&si, list, BSI_SAME_STMT);
      }
    bsi_remove (&si, true);
-@@ -2646,6 +2661,15 @@ expand_omp_for_generic (struct omp_regio
+@@ -2656,6 +2671,15 @@ expand_omp_for_generic (struct omp_regio
    si = bsi_start (l0_bb);
    bsi_insert_after (&si, list, BSI_CONTINUE_LINKING);
  
@@ -139,7 +139,7 @@
    /* Code to control the increment and predicate for the sequential
       loop goes in the first half of EXIT_BB (we split EXIT_BB so
       that we can inherit all the edges going out of the loop
-@@ -3098,7 +3122,10 @@ expand_omp_for (struct omp_region *regio
+@@ -3108,7 +3132,10 @@ expand_omp_for (struct omp_region *regio
    extract_omp_for_data (last_stmt (region->entry), &fd);
    region->sched_kind = fd.sched_kind;
  
@@ -151,7 +151,7 @@
      {
        if (fd.chunk_size == NULL)
  	expand_omp_for_static_nochunk (region, &fd);
-@@ -3156,15 +3183,28 @@ expand_omp_sections (struct omp_region *
+@@ -3166,15 +3193,28 @@ expand_omp_sections (struct omp_region *
  
    entry_bb = region->entry;
    l0_bb = create_empty_bb (entry_bb);
@@ -185,7 +185,7 @@
    v = create_tmp_var (unsigned_type_node, ".section");
  
    /* We will build a switch() with enough cases for all the
-@@ -3201,7 +3241,7 @@ expand_omp_sections (struct omp_region *
+@@ -3211,7 +3251,7 @@ expand_omp_sections (struct omp_region *
  	      build_int_cst (unsigned_type_node, 0), NULL, l2);
    TREE_VEC_ELT (label_vec, 0) = t;
    make_edge (l0_bb, l2_bb, 0);
@@ -194,7 +194,7 @@
    /* Convert each OMP_SECTION into a CASE_LABEL_EXPR.  */
    for (inner = region->inner, i = 1; inner; inner = inner->next, ++i)
      {
-@@ -3220,15 +3260,19 @@ expand_omp_sections (struct omp_region *
+@@ -3230,15 +3270,19 @@ expand_omp_sections (struct omp_region *
        gcc_assert (i < len || OMP_SECTION_LAST (bsi_stmt (si)));
        bsi_remove (&si, true);
  
@@ -218,7 +218,7 @@
        single_succ_edge (s_exit_bb)->flags = EDGE_FALLTHRU;
      }
  
-@@ -3244,24 +3288,30 @@ expand_omp_sections (struct omp_region *
+@@ -3254,24 +3298,30 @@ expand_omp_sections (struct omp_region *
    bsi_insert_after (&si, t, BSI_CONTINUE_LINKING);
  
    /* Code to get the next section goes in L1_BB.  */
@@ -264,7 +264,7 @@
  
    /* Connect the new blocks.  */
    if (is_combined_parallel (region))
-@@ -3274,9 +3324,12 @@ expand_omp_sections (struct omp_region *
+@@ -3284,9 +3334,12 @@ expand_omp_sections (struct omp_region *
    else
      make_edge (entry_bb, l0_bb, EDGE_FALLTHRU);
  
@@ -280,7 +280,7 @@
  }
  
  
-@@ -3337,10 +3390,13 @@ expand_omp_synch (struct omp_region *reg
+@@ -3347,10 +3400,13 @@ expand_omp_synch (struct omp_region *reg
    bsi_remove (&si, true);
    single_succ_edge (entry_bb)->flags = EDGE_FALLTHRU;
  


Index: gcc41.spec
===================================================================
RCS file: /cvs/dist/rpms/gcc/devel/gcc41.spec,v
retrieving revision 1.126
retrieving revision 1.127
diff -u -r1.126 -r1.127
--- gcc41.spec	30 Nov 2006 18:50:43 -0000	1.126
+++ gcc41.spec	1 Dec 2006 16:52:40 -0000	1.127
@@ -1,6 +1,6 @@
 %define DATE 20061130
 %define gcc_version 4.1.1
-%define gcc_release 43
+%define gcc_release 44
 %define _unpackaged_files_terminate_build 0
 %define multilib_64_archs sparc64 ppc64 s390x x86_64
 %ifarch %{ix86} x86_64 ia64
@@ -138,6 +138,7 @@
 Patch31: gcc41-libjava-anonverscript.patch
 Patch32: gcc41-ppc64-libffi-unwind.patch
 Patch33: gcc41-pr29965.patch
+Patch34: gcc41-pr29949.patch
 
 %define _gnu %{nil}
 %ifarch sparc
@@ -447,6 +448,7 @@
 %patch31 -p0 -b .libjava-anonverscript~
 %patch32 -p0 -b .ppc64-libffi-unwind~
 %patch33 -p0 -b .pr29965~
+%patch34 -p0 -b .pr29949~
 
 sed -i -e 's/4\.1\.2/4.1.1/' gcc/BASE-VER gcc/version.c
 sed -i -e 's/" (Red Hat[^)]*)"/" (Red Hat %{version}-%{gcc_release})"/' gcc/version.c
@@ -1506,6 +1508,9 @@
 %doc rpm.doc/changelogs/libmudflap/ChangeLog*
 
 %changelog
+* Fri Dec  1 2006 Jakub Jelinek <jakub at redhat.com> 4.1.1-44
+- fix OpenMP loops with 0 iterations (PR libgomp/29949)
+
 * Thu Nov 30 2006 Jakub Jelinek <jakub at redhat.com> 4.1.1-43
 - update from gcc-4_1-branch (-r119167:119343)
   - PRs c++/29022, fortran/29391, fortran/29489, fortran/29982,




More information about the fedora-cvs-commits mailing list