aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-11-10 08:51:55 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-11-10 08:51:55 +0100
commit78e4746337d87401a818d0179597e19fab620ee0 (patch)
tree9d3f2ce4c54127ae9b5aa594d54bd9031add67ce /gcc/gimplify.c
parent416c991fdd5568197d0f545c0e0a2ad3fd577dc6 (diff)
downloadgcc-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.c18
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;