Commit 78e47463 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 416c991f
2007-11-10 Jakub Jelinek <jakub@redhat.com> 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 PR middle-end/34018
* tree-inline.h (copy_body_data): Add regimplify field. * tree-inline.h (copy_body_data): Add regimplify field.
* tree-inline.c (copy_body_r): Set id->regimplify to true * tree-inline.c (copy_body_r): Set id->regimplify to true
...@@ -5291,8 +5291,22 @@ goa_lhs_expr_p (tree expr, tree addr) ...@@ -5291,8 +5291,22 @@ goa_lhs_expr_p (tree expr, tree addr)
== TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0))))) == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (expr, 0)))))
expr = TREE_OPERAND (expr, 0); expr = TREE_OPERAND (expr, 0);
if (TREE_CODE (expr) == INDIRECT_REF && TREE_OPERAND (expr, 0) == addr) if (TREE_CODE (expr) == INDIRECT_REF)
return true; {
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)) if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0))
return true; return true;
return false; return false;
......
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> 2007-11-06 Jakub Jelinek <jakub@redhat.com>
PR c++/33894 PR c++/33894
......
! 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment