diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr52558-1.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/simulate-thread/speculative-store-2.c | 74 |
2 files changed, 74 insertions, 22 deletions
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; +} |