1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fschedule-insns" } */
3 /* { dg-require-effective-target scheduling } */
4
5 #define PF_FROZEN 0x00010000
6 #define likely(x) __builtin_expect(!!(x), 1)
7
8 struct cur
9 {
10 unsigned long flags;
11 };
12 struct cur *cur;
13
14 unsigned long freeze_cnt;
15
16 extern int foo(void *);
17 extern int slow_path(void *);
18
19 static inline int freezing(void *p)
20 {
21 if (likely(!foo(&freeze_cnt)))
22 return 0;
23 return slow_path(p);
24 }
25
26 extern int blah(void);
27
28 int testcase(int check_kthr_stop)
29 {
30 int was_frozen = 0;
31
32 for (;;) {
33 if (!freezing(cur) ||
34 (check_kthr_stop && blah()))
35 cur->flags &= ~PF_FROZEN;
36
37 if (!(cur->flags & PF_FROZEN))
38 break;
39
40 was_frozen = 1;
41 }
42
43 return was_frozen;
44 }