aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2012-08-16 22:05:32 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2012-08-16 22:05:32 +0000
commitaf4bd9204179f9820bc4b17099fc75a4f603abf8 (patch)
treeec74ba4c54e8d57faccec032d8530f2ee5e6469b /gcc
parentdf1a3a7ca6c2623dffbfd205cb5497df6106e6d2 (diff)
downloadgcc-af4bd9204179f9820bc4b17099fc75a4f603abf8.zip
gcc-af4bd9204179f9820bc4b17099fc75a4f603abf8.tar.gz
gcc-af4bd9204179f9820bc4b17099fc75a4f603abf8.tar.bz2
re PR middle-end/54261 (reverse sync/atomic operators when only sync_compare_and_swap_optab libfuncs implemented)
PR middle-end/54261 * gcc.dg/torture/pr54261-1.c: New test. From-SVN: r190455
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr54261-1.c42
2 files changed, 47 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9c454bf..6e4d352 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-17 Hans-Peter Nilsson <hp@axis.com>
+
+ PR middle-end/54261
+ * gcc.dg/torture/pr54261-1.c: New test.
+
2012-08-15 Janus Weil <janus@gcc.gnu.org>
PR fortran/54243
diff --git a/gcc/testsuite/gcc.dg/torture/pr54261-1.c b/gcc/testsuite/gcc.dg/torture/pr54261-1.c
new file mode 100644
index 0000000..571727b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr54261-1.c
@@ -0,0 +1,42 @@
+/* { dg-do run } */
+/* { dg-additional-options "-DSYNC_FALLBACK" { target { ! cas_int } } } */
+
+#ifdef SYNC_FALLBACK
+/* The SYNC_FALLBACK code is just so we don't have to restrict this test
+ to any subset of targets. For targets with no atomics support at
+ all, the cas_int effective-target is false and the fallback provides
+ a PASS. Where the bug trigs (at the time this test-case was added),
+ cas_int is also false but the fallback isn't used. */
+__attribute__((__noinline__, __noclone__))
+int
+# if __INT_MAX__ == 0x7fff
+ __sync_fetch_and_add_2
+# else
+ __sync_fetch_and_add_4
+# endif
+ (int *at, int val)
+{
+ int tmp = *at;
+ asm ("");
+ *at = tmp + val;
+ return tmp;
+}
+#endif
+
+__attribute__((__noinline__, __noclone__))
+void g (int *at, int val)
+{
+ asm ("");
+ __sync_fetch_and_add (at, val);
+}
+
+int main(void)
+{
+ int x = 41;
+ int a = 1;
+ g (&x, a);
+
+ if (x != 42)
+ __builtin_abort ();
+ __builtin_exit (0);
+}