return 0;
 }
 
+SEC("?raw_tp")
+__flag(BPF_F_TEST_STATE_FREQ)
+__failure __msg("misaligned stack access off 0+-31+0 size 8")
+__naked int absent_mark_in_the_middle_state(void)
+{
+       /* This is equivalent to C program below.
+        *
+        * r8 = bpf_get_prandom_u32();
+        * r6 = -32;
+        * bpf_iter_num_new(&fp[-8], 0, 10);
+        * if (unlikely(bpf_get_prandom_u32()))
+        *   r6 = -31;
+        * while (bpf_iter_num_next(&fp[-8])) {
+        *   if (unlikely(bpf_get_prandom_u32()))
+        *     *(fp + r6) = 7;
+        * }
+        * bpf_iter_num_destroy(&fp[-8])
+        * return 0
+        */
+       asm volatile (
+               "call %[bpf_get_prandom_u32];"
+               "r8 = r0;"
+               "r7 = 0;"
+               "r6 = -32;"
+               "r0 = 0;"
+               "*(u64 *)(r10 - 16) = r0;"
+               "r1 = r10;"
+               "r1 += -8;"
+               "r2 = 0;"
+               "r3 = 10;"
+               "call %[bpf_iter_num_new];"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto change_r6_%=;"
+       "loop_%=:"
+               "call noop;"
+               "r1 = r10;"
+               "r1 += -8;"
+               "call %[bpf_iter_num_next];"
+               "if r0 == 0 goto loop_end_%=;"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto use_r6_%=;"
+               "goto loop_%=;"
+       "loop_end_%=:"
+               "r1 = r10;"
+               "r1 += -8;"
+               "call %[bpf_iter_num_destroy];"
+               "r0 = 0;"
+               "exit;"
+       "use_r6_%=:"
+               "r0 = r10;"
+               "r0 += r6;"
+               "r1 = 7;"
+               "*(u64 *)(r0 + 0) = r1;"
+               "goto loop_%=;"
+       "change_r6_%=:"
+               "r6 = -31;"
+               "goto loop_%=;"
+               :
+               : __imm(bpf_iter_num_new),
+                 __imm(bpf_iter_num_next),
+                 __imm(bpf_iter_num_destroy),
+                 __imm(bpf_get_prandom_u32)
+               : __clobber_all
+       );
+}
+
+__used __naked
+static int noop(void)
+{
+       asm volatile (
+               "r0 = 0;"
+               "exit;"
+       );
+}
+
+SEC("?raw_tp")
+__flag(BPF_F_TEST_STATE_FREQ)
+__failure __msg("misaligned stack access off 0+-31+0 size 8")
+__naked int absent_mark_in_the_middle_state2(void)
+{
+       /* This is equivalent to C program below.
+        *
+        *     r8 = bpf_get_prandom_u32();
+        *     r6 = -32;
+        *     bpf_iter_num_new(&fp[-8], 0, 10);
+        *     if (unlikely(bpf_get_prandom_u32())) {
+        *       r6 = -31;
+        * jump_into_loop:
+        *       goto +0;
+        *       goto loop;
+        *     }
+        *     if (unlikely(bpf_get_prandom_u32()))
+        *       goto jump_into_loop;
+        * loop:
+        *     while (bpf_iter_num_next(&fp[-8])) {
+        *       if (unlikely(bpf_get_prandom_u32()))
+        *         *(fp + r6) = 7;
+        *     }
+        *     bpf_iter_num_destroy(&fp[-8])
+        *     return 0
+        */
+       asm volatile (
+               "call %[bpf_get_prandom_u32];"
+               "r8 = r0;"
+               "r7 = 0;"
+               "r6 = -32;"
+               "r0 = 0;"
+               "*(u64 *)(r10 - 16) = r0;"
+               "r1 = r10;"
+               "r1 += -8;"
+               "r2 = 0;"
+               "r3 = 10;"
+               "call %[bpf_iter_num_new];"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto change_r6_%=;"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto jump_into_loop_%=;"
+       "loop_%=:"
+               "r1 = r10;"
+               "r1 += -8;"
+               "call %[bpf_iter_num_next];"
+               "if r0 == 0 goto loop_end_%=;"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto use_r6_%=;"
+               "goto loop_%=;"
+       "loop_end_%=:"
+               "r1 = r10;"
+               "r1 += -8;"
+               "call %[bpf_iter_num_destroy];"
+               "r0 = 0;"
+               "exit;"
+       "use_r6_%=:"
+               "r0 = r10;"
+               "r0 += r6;"
+               "r1 = 7;"
+               "*(u64 *)(r0 + 0) = r1;"
+               "goto loop_%=;"
+       "change_r6_%=:"
+               "r6 = -31;"
+       "jump_into_loop_%=: "
+               "goto +0;"
+               "goto loop_%=;"
+               :
+               : __imm(bpf_iter_num_new),
+                 __imm(bpf_iter_num_next),
+                 __imm(bpf_iter_num_destroy),
+                 __imm(bpf_get_prandom_u32)
+               : __clobber_all
+       );
+}
+
+SEC("?raw_tp")
+__flag(BPF_F_TEST_STATE_FREQ)
+__failure __msg("misaligned stack access off 0+-31+0 size 8")
+__naked int absent_mark_in_the_middle_state3(void)
+{
+       /*
+        * bpf_iter_num_new(&fp[-8], 0, 10)
+        * loop1(-32, &fp[-8])
+        * loop1_wrapper(&fp[-8])
+        * bpf_iter_num_destroy(&fp[-8])
+        */
+       asm volatile (
+               "r1 = r10;"
+               "r1 += -8;"
+               "r2 = 0;"
+               "r3 = 10;"
+               "call %[bpf_iter_num_new];"
+               /* call #1 */
+               "r1 = -32;"
+               "r2 = r10;"
+               "r2 += -8;"
+               "call loop1;"
+               "r1 = r10;"
+               "r1 += -8;"
+               "call %[bpf_iter_num_destroy];"
+               /* call #2 */
+               "r1 = r10;"
+               "r1 += -8;"
+               "r2 = 0;"
+               "r3 = 10;"
+               "call %[bpf_iter_num_new];"
+               "r1 = r10;"
+               "r1 += -8;"
+               "call loop1_wrapper;"
+               /* return */
+               "r1 = r10;"
+               "r1 += -8;"
+               "call %[bpf_iter_num_destroy];"
+               "r0 = 0;"
+               "exit;"
+               :
+               : __imm(bpf_iter_num_new),
+                 __imm(bpf_iter_num_destroy),
+                 __imm(bpf_get_prandom_u32)
+               : __clobber_all
+       );
+}
+
+__used __naked
+static int loop1(void)
+{
+       /*
+        *  int loop1(num, iter) {
+        *     r6 = num;
+        *     r7 = iter;
+        *     while (bpf_iter_num_next(r7)) {
+        *       if (unlikely(bpf_get_prandom_u32()))
+        *         *(fp + r6) = 7;
+        *     }
+        *     return 0
+        *  }
+        */
+       asm volatile (
+               "r6 = r1;"
+               "r7 = r2;"
+               "call %[bpf_get_prandom_u32];"
+               "r8 = r0;"
+       "loop_%=:"
+               "r1 = r7;"
+               "call %[bpf_iter_num_next];"
+               "if r0 == 0 goto loop_end_%=;"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto use_r6_%=;"
+               "goto loop_%=;"
+       "loop_end_%=:"
+               "r0 = 0;"
+               "exit;"
+       "use_r6_%=:"
+               "r0 = r10;"
+               "r0 += r6;"
+               "r1 = 7;"
+               "*(u64 *)(r0 + 0) = r1;"
+               "goto loop_%=;"
+               :
+               : __imm(bpf_iter_num_next),
+                 __imm(bpf_get_prandom_u32)
+               : __clobber_all
+       );
+}
+
+__used __naked
+static int loop1_wrapper(void)
+{
+       /*
+        *  int loop1_wrapper(iter) {
+        *    r6 = -32;
+        *    r7 = iter;
+        *    if (unlikely(bpf_get_prandom_u32()))
+        *      r6 = -31;
+        *    loop1(r6, r7);
+        *    return 0;
+        *  }
+        */
+       asm volatile (
+               "r6 = -32;"
+               "r7 = r1;"
+               "call %[bpf_get_prandom_u32];"
+               "r8 = r0;"
+               "call %[bpf_get_prandom_u32];"
+               "if r0 == r8 goto change_r6_%=;"
+       "loop_%=:"
+               "r1 = r6;"
+               "r2 = r7;"
+               "call loop1;"
+               "r0 = 0;"
+               "exit;"
+       "change_r6_%=:"
+               "r6 = -31;"
+               "goto loop_%=;"
+               :
+               : __imm(bpf_iter_num_next),
+                 __imm(bpf_get_prandom_u32)
+               : __clobber_all
+       );
+}
+
 char _license[] SEC("license") = "GPL";