diff options
author | Jakub Jelinek <jakub@redhat.com> | 2006-09-20 10:22:04 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2006-09-20 10:22:04 +0200 |
commit | 66bb4f322eb936da1051767834df0db13502d8fb (patch) | |
tree | a5bcdf81dc6a40d882179bebad319e8d9f329bc8 /gcc | |
parent | 1e993cb82d600a1d2d798d18454a8c2c8d4c7679 (diff) | |
download | gcc-66bb4f322eb936da1051767834df0db13502d8fb.zip gcc-66bb4f322eb936da1051767834df0db13502d8fb.tar.gz gcc-66bb4f322eb936da1051767834df0db13502d8fb.tar.bz2 |
re PR middle-end/28046 (libgomp test pr27337.C fails intermittently)
PR middle-end/28046
* c-omp.c (c_finish_omp_atomic): If ADDR is not simple enough,
wrap it into TARGET_EXPR.
* gcc.dg/gomp/atomic-10.c: New test.
* g++.dg/gomp/atomic-10.C: New test.
From-SVN: r117077
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-omp.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/gomp/atomic-10.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/gomp/atomic-10.c | 24 |
5 files changed, 69 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7361e3..8b8fe3d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-09-20 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/28046 + * c-omp.c (c_finish_omp_atomic): If ADDR is not simple enough, + wrap it into TARGET_EXPR. + 2006-09-20 Eric Christopher <echristo@apple.com> * config/i386/i386.c (x86_fisttp): Remove. diff --git a/gcc/c-omp.c b/gcc/c-omp.c index fe56824..0bae321 100644 --- a/gcc/c-omp.c +++ b/gcc/c-omp.c @@ -116,6 +116,15 @@ c_finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) if (addr == error_mark_node) return error_mark_node; addr = save_expr (addr); + if (TREE_CODE (addr) != SAVE_EXPR + && (TREE_CODE (addr) != ADDR_EXPR + || TREE_CODE (TREE_OPERAND (addr, 0)) != VAR_DECL)) + { + /* Make sure LHS is simple enough so that goa_lhs_expr_p can recognize + it even after unsharing function body. */ + tree var = create_tmp_var_raw (TREE_TYPE (addr), NULL); + addr = build4 (TARGET_EXPR, TREE_TYPE (addr), var, addr, NULL, NULL); + } lhs = build_indirect_ref (addr, NULL); /* There are lots of warnings, errors, and conversions that need to happen diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5a7a540..5c0a4f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-09-20 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/28046 + * gcc.dg/gomp/atomic-10.c: New test. + * g++.dg/gomp/atomic-10.C: New test. + 2006-09-20 Eric Christopher <echristo@apple.com> * gcc.target/i386/sse3-not-fisttp.c: New. diff --git a/gcc/testsuite/g++.dg/gomp/atomic-10.C b/gcc/testsuite/g++.dg/gomp/atomic-10.C new file mode 100644 index 0000000..c8a25e2e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-10.C @@ -0,0 +1,24 @@ +// PR middle-end/28046 +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-gimple" } + +int a[3], b; +struct C { int x; int y; } c; + +int bar (void), *baz (void); + +void +foo (void) +{ +#pragma omp atomic + a[2] += bar (); +#pragma omp atomic + b += bar (); +#pragma omp atomic + c.y += bar (); +#pragma omp atomic + *baz () += bar (); +} + +// { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 4 "gimple" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/gcc.dg/gomp/atomic-10.c b/gcc/testsuite/gcc.dg/gomp/atomic-10.c new file mode 100644 index 0000000..bbb1ef0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/atomic-10.c @@ -0,0 +1,24 @@ +/* PR middle-end/28046 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-gimple" } */ + +int a[3], b; +struct C { int x; int y; } c; + +int bar (void), *baz (void); + +void +foo (void) +{ +#pragma omp atomic + a[2] += bar (); +#pragma omp atomic + b += bar (); +#pragma omp atomic + c.y += bar (); +#pragma omp atomic + *baz () += bar (); +} + +/* { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 4 "gimple" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ |