re PR middle-end/36506 (Broken #pragma omp sections reduction (+:x))

PR middle-end/36506
	* omp-low.c (expand_omp_sections): Handle #pragma omp sections with
	reductions.

	* testsuite/libgomp.c/reduction-5.c: New test.

From-SVN: r136697
This commit is contained in:
Jakub Jelinek 2008-06-12 13:07:20 +02:00 committed by Jakub Jelinek
parent 6b63e493a0
commit 0133bb9a96
4 changed files with 121 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2008-06-12 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36506
* omp-low.c (expand_omp_sections): Handle #pragma omp sections with
reductions.
2008-06-11 Tom Tromey <tromey@redhat.com>
* c-lex.c (fe_file_change): Pass SOURCE_LINE to start_source_file

View File

@ -3418,6 +3418,8 @@ expand_omp_sections (struct omp_region *region)
unsigned i, casei, len;
basic_block entry_bb, l0_bb, l1_bb, l2_bb, default_bb;
block_stmt_iterator si;
edge_iterator ei;
edge e;
struct omp_region *inner;
bool exit_reachable = region->cont != NULL;
@ -3428,10 +3430,30 @@ expand_omp_sections (struct omp_region *region)
l2_bb = region->exit;
if (exit_reachable)
{
gcc_assert (single_pred (l2_bb) == l0_bb);
if (single_pred (l2_bb) == l0_bb)
l2 = tree_block_label (l2_bb);
else
{
/* This can happen if there are reductions. */
len = EDGE_COUNT (l0_bb->succs);
gcc_assert (len > 0);
e = EDGE_SUCC (l0_bb, len - 1);
si = bsi_last (e->dest);
if (bsi_end_p (si) || TREE_CODE (bsi_stmt (si)) != OMP_SECTION)
l2 = tree_block_label (e->dest);
else
FOR_EACH_EDGE (e, ei, l0_bb->succs)
{
si = bsi_last (e->dest);
if (bsi_end_p (si) || TREE_CODE (bsi_stmt (si)) != OMP_SECTION)
{
l2 = tree_block_label (e->dest);
break;
}
}
}
default_bb = create_empty_bb (l1_bb->prev_bb);
l1 = tree_block_label (l1_bb);
l2 = tree_block_label (l2_bb);
}
else
{
@ -3509,6 +3531,14 @@ expand_omp_sections (struct omp_region *region)
{
basic_block s_entry_bb, s_exit_bb;
/* Skip optional reduction region. */
if (inner->type == OMP_ATOMIC_LOAD)
{
--i;
--casei;
continue;
}
s_entry_bb = inner->entry;
s_exit_bb = inner->exit;

View File

@ -1,3 +1,8 @@
2008-06-12 Jakub Jelinek <jakub@redhat.com>
PR middle-end/36506
* testsuite/libgomp.c/reduction-5.c: New test.
2008-06-06 Release Manager
* GCC 4.3.1 released.

View File

@ -0,0 +1,78 @@
/* PR middle-end/36506 */
extern void abort (void);
int
main (void)
{
int sum = 0, prod = 1;
#pragma omp parallel
#pragma omp sections reduction (+:sum)
{
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
}
if (sum != 6)
abort ();
sum = 0;
#pragma omp parallel sections reduction (+:sum)
{
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
#pragma omp section
sum += 2;
}
if (sum != 6)
abort ();
sum = 0;
#pragma omp parallel
#pragma omp sections reduction (+:sum) reduction (*:prod)
{
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
}
if (sum != 6 || prod != 8)
abort ();
sum = 0;
prod = 1;
#pragma omp parallel sections reduction (+:sum) reduction (*:prod)
{
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
#pragma omp section
{
sum += 2;
prod *= 2;
}
}
if (sum != 6 || prod != 8)
abort ();
return 0;
}