blob: 6e436befe9da4fd7f486dc6570fdb68dc3b92f66 [file] [log] [blame]
/* { 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;
}