Commit state of repository at time of OOPSLA 2015 submission.
[satcheck.git] / test / userprog2.c
1 #include <stdio.h>
2 #include <threads.h>
3 #include <stdatomic.h>
4
5 #include "libinterface.h"
6
7 int x;
8 int y;
9 int gr1;
10 int gr2;
11
12 static void a(void *obj)
13 {
14         MCID mr1=MC2_nextOpLoad(MCID_NODEP);
15         int r1=load_32(&y);
16         MCID br1;
17         if (r1) {
18                 br1=MC2_branchUsesID(mr1, 1, 2, true);
19                 r1=42;
20                 mr1=MC2_function(0, 4, r1);  
21         } else {
22                 br1=MC2_branchUsesID(mr1, 0, 2, true);
23                 r1=0;
24                 mr1=MC2_function(0, 4, r1);  
25         }
26         MC2_merge(br1);
27         mr1=MC2_phi(mr1);
28
29         MC2_nextOpStore(MCID_NODEP, mr1);
30         store_32(&x, r1);
31
32         MC2_nextOpStore(MCID_NODEP, mr1);
33         store_32(&gr1, r1);
34         printf("r1=%d\n",r1);
35 }
36
37 static void b(void *obj)
38 {
39         MCID mr2=MC2_nextOpLoad(MCID_NODEP);
40         int r2=load_32(&x);
41         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
42         store_32(&y, 42);
43
44         MC2_nextOpStore(MCID_NODEP, mr2);
45         store_32(&gr2, r2);
46         printf("r2=%d\n",r2);
47 }
48
49 int user_main(int argc, char **argv)
50 {
51         thrd_t t1, t2;
52
53         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
54         store_32(&x, 0);
55         MC2_nextOpStore(MCID_NODEP, MCID_NODEP);
56         store_32(&y, 0);
57
58         printf("Main thread: creating 2 threads\n");
59         MC2_nextOpThrd_create(MCID_NODEP, MCID_NODEP);
60         thrd_create(&t1, (thrd_start_t)&a, NULL);
61         MC2_nextOpThrd_create(MCID_NODEP, MCID_NODEP);
62         thrd_create(&t2, (thrd_start_t)&b, NULL);
63
64         MC2_nextOpThrd_join(MCID_NODEP);
65         thrd_join(t1);
66         MC2_nextOpThrd_join(MCID_NODEP);
67         thrd_join(t2);
68         printf("Main thread is finished\n");
69         MCID mr1=MC2_nextOpLoad(MCID_NODEP);
70         int lgr1=load_32(&gr1);
71
72         MCID mr2=MC2_nextOpLoad(MCID_NODEP);
73         int lgr2=load_32(&gr2);
74         MCID br1,br2;
75         if (lgr1==42) {
76                 br1=MC2_branchUsesID(mr1, 1, 2, true);
77                 if (lgr2==42) {
78                         br2=MC2_branchUsesID(mr2, 1, 2, true);
79                 } else {
80                         br2=MC2_branchUsesID(mr2, 0, 2, true);
81                 }
82                 MC2_merge(br2);
83         } else {
84                 br1=MC2_branchUsesID(mr1, 0, 2, true);
85         }
86         MC2_merge(br1);
87
88         return 0;
89 }