aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.dg/pr57154.c
blob: 6e436befe9da4fd7f486dc6570fdb68dc3b92f66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* { dg-do compile } */
/* { dg-options "-O2 -fschedule-insns" } */
/* { dg-require-effective-target scheduling } */

#define PF_FROZEN 0x00010000
#define likely(x)      __builtin_expect(!!(x), 1)

struct cur
{
  unsigned long flags;
};
struct cur *cur;

unsigned long freeze_cnt;

extern int foo(void *);
extern int slow_path(void *);

static inline int freezing(void *p)
{
        if (likely(!foo(&freeze_cnt)))
                return 0;
        return slow_path(p);
}

extern int blah(void);

int testcase(int check_kthr_stop)
{
  int was_frozen = 0;

  for (;;) {
    if (!freezing(cur) ||
        (check_kthr_stop && blah()))
      cur->flags &= ~PF_FROZEN;

    if (!(cur->flags & PF_FROZEN))
      break;

    was_frozen = 1;
  }

  return was_frozen;
}