diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-10 08:51:55 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-10 08:51:55 +0100 |
commit | 78e4746337d87401a818d0179597e19fab620ee0 (patch) | |
tree | 9d3f2ce4c54127ae9b5aa594d54bd9031add67ce /gcc/gimplify.c | |
parent | 416c991fdd5568197d0f545c0e0a2ad3fd577dc6 (diff) | |
download | gcc-78e4746337d87401a818d0179597e19fab620ee0.zip gcc-78e4746337d87401a818d0179597e19fab620ee0.tar.gz gcc-78e4746337d87401a818d0179597e19fab620ee0.tar.bz2 |
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
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 5c11bad..212a9dc 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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; |