From 251923f5e4950ce2e43020f663723f84b7cfe31a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 6 Mar 2008 18:28:54 +0100 Subject: [PATCH] gimplify.c (goa_lhs_expr_p): Allow different ADDR_EXPR nodes for the same VAR_DECL. * gimplify.c (goa_lhs_expr_p): Allow different ADDR_EXPR nodes for the same VAR_DECL. * testsuite/libgomp.c/atomic-3.c: New test. From-SVN: r132977 --- gcc/ChangeLog | 5 +++ gcc/gimplify.c | 5 ++- libgomp/ChangeLog | 6 +++- libgomp/testsuite/libgomp.c/atomic-3.c | 50 ++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 libgomp/testsuite/libgomp.c/atomic-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e39eae75b76..4bc1c280e78 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-03-06 Jakub Jelinek + + * gimplify.c (goa_lhs_expr_p): Allow different ADDR_EXPR nodes + for the same VAR_DECL. + 2008-03-06 Tom Tromey * treelang: Delete. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 04ed39c533a..cb7460ee302 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -5464,7 +5464,10 @@ goa_lhs_expr_p (tree expr, tree addr) expr = TREE_OPERAND (expr, 0); addr = TREE_OPERAND (addr, 0); } - return expr == addr; + if (expr == addr) + return true; + return (TREE_CODE (addr) == ADDR_EXPR && TREE_CODE (expr) == ADDR_EXPR + && TREE_OPERAND (addr, 0) == TREE_OPERAND (expr, 0)); } if (TREE_CODE (addr) == ADDR_EXPR && expr == TREE_OPERAND (addr, 0)) return true; diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 6e978d912d0..84c70491ece 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,7 +1,11 @@ +2008-03-06 Jakub Jelinek + + * testsuite/libgomp.c/atomic-3.c: New test. + 2008-03-03 Francois-Xavier Coudert PR fortran/33197 - * libgomp/testsuite/libgomp.fortran/fortran.exp: Add .f08 and + * testsuite/libgomp.fortran/fortran.exp: Add .f08 and .F08 file suffixes. 2008-03-03 Peter O'Gorman diff --git a/libgomp/testsuite/libgomp.c/atomic-3.c b/libgomp/testsuite/libgomp.c/atomic-3.c new file mode 100644 index 00000000000..5b8fdc1a79e --- /dev/null +++ b/libgomp/testsuite/libgomp.c/atomic-3.c @@ -0,0 +1,50 @@ +/* { dg-do run } */ +/* { dg-options "-fopenmp -O0" } */ + +#include +#include + +short e[64]; +int g; +_Complex double d, f; +int num_threads; + +__attribute__((noinline)) void +foo (int x, long long y) +{ +#pragma omp parallel num_threads (4) + { + int i; + #pragma omp barrier + for (i = 0; i < 2400; i++) + { + if (i == 0) + num_threads = omp_get_num_threads (); + #pragma omp atomic + e[0] += x; + #pragma omp atomic + e[16] += x; + #pragma omp atomic + g += y; + #pragma omp atomic + __real__ d += x; + #pragma omp atomic + __imag__ f += x; + } + } +} + +int +main (void) +{ + int i; + foo (3, 3LL); + if (g != 3 * 2400 * num_threads + || __real__ d != g || __imag__ d != 0 + || __real__ f != 0 || __imag__ f != g) + abort (); + for (i = 0; i < 64; i++) + if (e[i] != ((i && i != 16) ? 0 : g)) + abort (); + return 0; +}