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:
parent
6b63e493a0
commit
0133bb9a96
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
|
78
libgomp/testsuite/libgomp.c/reduction-5.c
Normal file
78
libgomp/testsuite/libgomp.c/reduction-5.c
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user