re PR fortran/34020 (Bogus codegen for openmp atomics w/ indirects operands on IPF)

PR fortran/34020
	* gimplify.c (goa_lhs_expr_p): Inside INDIRECT_REF handle unshared
	nops.

	* testsuite/libgomp.fortran/pr34020.f90: New test.

From-SVN: r130069
This commit is contained in:
Jakub Jelinek 2007-11-10 08:51:55 +01:00 committed by Jakub Jelinek
parent 416c991fdd
commit 78e4746337
4 changed files with 44 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2007-11-10 Jakub Jelinek <jakub@redhat.com>
PR fortran/34020
* gimplify.c (goa_lhs_expr_p): Inside INDIRECT_REF handle unshared
nops.
PR middle-end/34018
* tree-inline.h (copy_body_data): Add regimplify field.
* tree-inline.c (copy_body_r): Set id->regimplify to true

View File

@ -5291,8 +5291,22 @@ goa_lhs_expr_p (tree expr, tree addr)
== TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
expr = TREE_OPERAND (expr, 0);
if (TREE_CODE (expr) == INDIRECT_REF && TREE_OPERAND (expr, 0) == addr)
return true;
if (TREE_CODE (expr) == INDIRECT_REF)
{
expr = TREE_OPERAND (expr, 0);
while (expr != addr
&& (TREE_CODE (expr) == NOP_EXPR
|| TREE_CODE (expr) == CONVERT_EXPR
|| TREE_CODE (expr) == NON_LVALUE_EXPR)
&& TREE_CODE (expr) == TREE_CODE (addr)
&& TYPE_MAIN_VARIANT (TREE_TYPE (expr))
== TYPE_MAIN_VARIANT (TREE_TYPE (addr)))
{
expr = TREE_OPERAND (expr, 0);
addr = TREE_OPERAND (addr, 0);
}
return expr == addr;
}
if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
return true;
return false;

View File

@ -1,3 +1,8 @@
2007-11-10 Jakub Jelinek <jakub@redhat.com>
PR fortran/34020
* testsuite/libgomp.fortran/pr34020.f90: New test.
2007-11-06 Jakub Jelinek <jakub@redhat.com>
PR c++/33894

View File

@ -0,0 +1,19 @@
! PR fortran/34020
! { dg-do run }
subroutine atomic_add(lhs, rhs)
real lhs, rhs
!$omp atomic
lhs = rhs + lhs
end
real lhs, rhs
integer i
lhs = 0
rhs = 1
!$omp parallel do num_threads(8) shared(lhs, rhs)
do i = 1, 300000
call atomic_add(lhs, rhs)
enddo
if (lhs .ne. 300000) call abort
end