--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fschedule-insns" } */
+
+#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;
+}