Patchwork PR testsuite/54184: rewriting failing data race test

login
register
mail settings
Submitter Aldy Hernandez
Date Sept. 6, 2012, 3:44 p.m.
Message ID <5048C4E9.8030608@redhat.com>
Download mbox | patch
Permalink /patch/182237/
State New
Headers show

Comments

Aldy Hernandez - Sept. 6, 2012, 3:44 p.m.
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?
testsuite/
	PR testsuite/54184
	* gcc.dg/pr52558-1.c: Delete.
	* gcc.dg/simulate-thread/speculative-store-2.c: New.
Richard Guenther - Sept. 7, 2012, 8:04 a.m.
On Thu, 6 Sep 2012, Aldy Hernandez wrote:

> 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?

Ok.

Thanks,
Richard.
Andrew MacLeod - Sept. 7, 2012, 1:21 p.m.
On 09/06/2012 11:44 AM, Aldy Hernandez wrote:
> 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.
>
Yeah, the test case looks good.

Andrew

Patch

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;
+}