45 lines
761 B
C
45 lines
761 B
C
/* { 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;
|
|
}
|