PR testsuite/54184: rewriting failing data race test

Aldy Hernandez aldyh@redhat.com
Thu Sep 6 15:44:00 GMT 2012


The current test is failing on some architectures because the underlying 
gimple has changed.  I believe the best way to test the speculative 
store data race is with the simulate-thread/ harness.  We already have a 
speculative store test in the harness, so this will be a nice addition.

I have manually inspected that we are performing the speculative store 
without --param allow-store-data-races=0, and avoiding it with =1.

Tested on x86-64 with and without the --param.

OK for trunk?
-------------- next part --------------
testsuite/
	PR testsuite/54184
	* gcc.dg/pr52558-1.c: Delete.
	* gcc.dg/simulate-thread/speculative-store-2.c: New.

diff --git a/gcc/testsuite/gcc.dg/pr52558-1.c b/gcc/testsuite/gcc.dg/pr52558-1.c
deleted file mode 100644
index c34ad06..0000000
--- a/gcc/testsuite/gcc.dg/pr52558-1.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "--param allow-store-data-races=0 -O2 -fdump-tree-lim1" } */
-
-/* Test that `count' is not written to unless p->data > 0.  */
-
-int count;
-
-struct obj {
-    int data;
-    struct obj *next;
-} *q;
-
-void func()
-{
-  struct obj *p;
-  for (p = q; p; p = p->next)
-    if (p->data > 0)
-      count++;
-}
-
-/* { dg-final { scan-tree-dump-times "MEM count_lsm.. count_lsm_flag" 1 "lim1" } } */
-/* { dg-final { cleanup-tree-dump "lim1" } } */
diff --git a/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-2.c b/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-2.c
new file mode 100644
index 0000000..d4d28f5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-2.c
@@ -0,0 +1,74 @@
+/* { dg-do link } */
+/* { dg-options "--param allow-store-data-races=0 -O2" } */
+/* { dg-final { simulate-thread } } */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "simulate-thread.h"
+
+/* Test that speculative stores do not happen for --param
+   allow-store-data-races=0.  */
+
+int count, insns;
+
+struct obj {
+    int data;
+    struct obj *next;
+} *q;
+
+void simulate_thread_other_threads ()
+{
+  ++insns;
+  ++count;
+}
+
+int simulate_thread_step_verify ()
+{
+  return 0;
+}
+
+int simulate_thread_final_verify ()
+{
+  /* If count != insns, someone must have cached `count' and stored a
+     racy value into it.  */
+  if (count != insns)
+    {
+      printf("FAIL: count was incorrectly cached\n");
+      return 1;
+    }
+  return 0;
+}
+
+/* Test that `count' is not written to unless p->data > 0.  */
+
+__attribute__((noinline))
+void simulate_thread_main()
+{
+  struct obj *p;
+  for (p = q; p; p = p->next)
+    if (p->data > 0)
+      count++;
+}
+
+struct obj *
+insert(struct obj *head, int data)
+{
+  struct obj *t = (struct obj *) malloc (sizeof (struct obj));
+  t->next = head;
+  t->data = data;
+  return t;
+}
+
+int main()
+{
+  q = insert (0, 0);
+  q = insert (q, 0);
+  q = insert (q, 0);
+  q = insert (q, 0);
+  q = insert (q, 0);
+
+  simulate_thread_main ();
+  simulate_thread_done ();
+  return 0;
+}


More information about the Gcc-patches mailing list