re PR middle-end/27573 (ICE with -fopenmp -fprofile-generate)

PR middle-end/27573
	* omp-low.c (expand_omp_parallel): Don't assert
	.OMP_DATA_I = &.OMP_DATA_O is the first statement in the block,
	instead search for it.

	* gcc.dg/gomp/pr27573.c: New test.
	* gfortran.dg/gomp/pr27573.f90: New test.

From-SVN: r113823
This commit is contained in:
Jakub Jelinek 2006-05-16 12:16:36 +02:00 committed by Jakub Jelinek
parent 4156f84bfb
commit b570947c8a
5 changed files with 64 additions and 14 deletions

View File

@ -1,5 +1,10 @@
2006-05-16 Jakub Jelinek <jakub@redhat.com>
PR middle-end/27573
* omp-low.c (expand_omp_parallel): Don't assert
.OMP_DATA_I = &.OMP_DATA_O is the first statement in the block,
instead search for it.
PR c/27499
* gimplify.c (gimplify_omp_for): Remove assertion that iteration var
is signed.

View File

@ -2456,7 +2456,8 @@ expand_omp_parallel (struct omp_region *region)
else
{
/* If the parallel region needs data sent from the parent
function, then the very first statement of the parallel body
function, then the very first statement (except possible
tree profile counter updates) of the parallel body
is a copy assignment .OMP_DATA_I = &.OMP_DATA_O. Since
&.OMP_DATA_O is passed as an argument to the child function,
we need to replace it with the argument as seen by the child
@ -2470,21 +2471,26 @@ expand_omp_parallel (struct omp_region *region)
if (OMP_PARALLEL_DATA_ARG (entry_stmt))
{
basic_block entry_succ_bb = single_succ (entry_bb);
block_stmt_iterator si = bsi_start (entry_succ_bb);
tree stmt;
block_stmt_iterator si;
gcc_assert (!bsi_end_p (si));
for (si = bsi_start (entry_succ_bb); ; bsi_next (&si))
{
tree stmt;
stmt = bsi_stmt (si);
gcc_assert (TREE_CODE (stmt) == MODIFY_EXPR
&& TREE_CODE (TREE_OPERAND (stmt, 1)) == ADDR_EXPR
&& TREE_OPERAND (TREE_OPERAND (stmt, 1), 0)
== OMP_PARALLEL_DATA_ARG (entry_stmt));
if (TREE_OPERAND (stmt, 0) == DECL_ARGUMENTS (child_fn))
bsi_remove (&si, true);
else
TREE_OPERAND (stmt, 1) = DECL_ARGUMENTS (child_fn);
gcc_assert (!bsi_end_p (si));
stmt = bsi_stmt (si);
if (TREE_CODE (stmt) == MODIFY_EXPR
&& TREE_CODE (TREE_OPERAND (stmt, 1)) == ADDR_EXPR
&& TREE_OPERAND (TREE_OPERAND (stmt, 1), 0)
== OMP_PARALLEL_DATA_ARG (entry_stmt))
{
if (TREE_OPERAND (stmt, 0) == DECL_ARGUMENTS (child_fn))
bsi_remove (&si, true);
else
TREE_OPERAND (stmt, 1) = DECL_ARGUMENTS (child_fn);
break;
}
}
}
/* Declare local variables needed in CHILD_CFUN. */

View File

@ -1,5 +1,9 @@
2006-05-16 Jakub Jelinek <jakub@redhat.com>
PR middle-end/27573
* gcc.dg/gomp/pr27573.c: New test.
* gfortran.dg/gomp/pr27573.f90: New test.
PR c/27499
* gcc.dg/gomp/pr27499.c: New test.
* g++.dg/gomp/pr27499.C: New test.

View File

@ -0,0 +1,20 @@
/* PR middle-end/27573 */
/* { dg-do compile } */
/* { dg-options "-O2 -fopenmp -fprofile-generate" } */
extern int puts (const char *);
int
main (void)
{
int i, j = 8;
#pragma omp parallel
{
puts ("foo");
for (i = 1; i < j - 1; i++)
;
}
return 0;
}
/* { dg-final { cleanup-coverage-files } } */

View File

@ -0,0 +1,15 @@
! PR middle-end/27573
! { dg-do compile }
! { dg-options "-O2 -fopenmp -fprofile-generate" }
program pr27573
integer i,j
j = 8
!$omp parallel
print *, "foo"
do i = 1, j - 1
end do
!$omp end parallel
end
! { dg-final { cleanup-coverage-files } }