u64 imm = insn->imm; /* sign extend */
 
        if (skip) {
-               meta->skip = true;
+               meta->flags |= FLAG_INSN_SKIP_NOOP;
                return 0;
        }
 
        const struct bpf_insn *insn = &meta->insn;
 
        if (skip) {
-               meta->skip = true;
+               meta->flags |= FLAG_INSN_SKIP_NOOP;
                return 0;
        }
 
        int err;
 
        list_for_each_entry(meta, &nfp_prog->insns, l) {
-               if (meta->skip)
+               if (meta->flags & FLAG_INSN_SKIP_MASK)
                        continue;
                if (BPF_CLASS(meta->insn.code) != BPF_JMP)
                        continue;
 
                jmp_dst = meta->jmp_dst;
 
-               if (jmp_dst->skip) {
+               if (jmp_dst->flags & FLAG_INSN_SKIP_PREC_DEPENDENT) {
                        pr_err("Branch landing on removed instruction!!\n");
                        return -ELOOP;
                }
                                return nfp_prog->error;
                }
 
-               if (meta->skip) {
+               if (meta->flags & FLAG_INSN_SKIP_MASK) {
                        nfp_prog->n_translated++;
                        continue;
                }
                /* Programs start with R6 = R1 but we ignore the skb pointer */
                if (insn.code == (BPF_ALU64 | BPF_MOV | BPF_X) &&
                    insn.src_reg == 1 && insn.dst_reg == 6)
-                       meta->skip = true;
+                       meta->flags |= FLAG_INSN_SKIP_PREC_DEPENDENT;
 
                /* Return as soon as something doesn't match */
-               if (!meta->skip)
+               if (!(meta->flags & FLAG_INSN_SKIP_MASK))
                        return;
        }
 }
        list_for_each_entry(meta, &nfp_prog->insns, l) {
                struct bpf_insn insn = meta->insn;
 
-               if (meta->skip)
+               if (meta->flags & FLAG_INSN_SKIP_MASK)
                        continue;
 
                if (BPF_CLASS(insn.code) != BPF_ALU &&
                if (meta2->flags & FLAG_INSN_IS_JUMP_DST)
                        continue;
 
-               meta2->skip = true;
+               meta2->flags |= FLAG_INSN_SKIP_PREC_DEPENDENT;
        }
 }
 
                    meta3->flags & FLAG_INSN_IS_JUMP_DST)
                        continue;
 
-               meta2->skip = true;
-               meta3->skip = true;
+               meta2->flags |= FLAG_INSN_SKIP_PREC_DEPENDENT;
+               meta3->flags |= FLAG_INSN_SKIP_PREC_DEPENDENT;
        }
 }
 
                                }
 
                                head_ld_meta->paired_st = &head_st_meta->insn;
-                               head_st_meta->skip = true;
+                               head_st_meta->flags |=
+                                       FLAG_INSN_SKIP_PREC_DEPENDENT;
                        } else {
                                head_ld_meta->ldst_gather_len = 0;
                        }
                        head_ld_meta = meta1;
                        head_st_meta = meta2;
                } else {
-                       meta1->skip = true;
-                       meta2->skip = true;
+                       meta1->flags |= FLAG_INSN_SKIP_PREC_DEPENDENT;
+                       meta2->flags |= FLAG_INSN_SKIP_PREC_DEPENDENT;
                }
 
                head_ld_meta->ldst_gather_len += BPF_LDST_BYTES(ld);
                if (meta->flags & FLAG_INSN_IS_JUMP_DST)
                        cache_avail = false;
 
-               if (meta->skip)
+               if (meta->flags & FLAG_INSN_SKIP_MASK)
                        continue;
 
                insn = &meta->insn;
        }
 
        list_for_each_entry(meta, &nfp_prog->insns, l) {
-               if (meta->skip)
+               if (meta->flags & FLAG_INSN_SKIP_MASK)
                        continue;
 
                if (is_mbpf_load_pkt(meta) && !meta->ldst_gather_len) {
        u32 id;
 
        nfp_for_each_insn_walk2(nfp_prog, meta1, meta2) {
-               if (meta1->skip || meta2->skip)
+               if (meta1->flags & FLAG_INSN_SKIP_MASK ||
+                   meta2->flags & FLAG_INSN_SKIP_MASK)
                        continue;
 
                if (meta1->insn.code != (BPF_LD | BPF_IMM | BPF_DW) ||
 
 #define FLAG_INSN_IS_JUMP_DST                  BIT(0)
 #define FLAG_INSN_IS_SUBPROG_START             BIT(1)
 #define FLAG_INSN_PTR_CALLER_STACK_FRAME       BIT(2)
+/* Instruction is pointless, noop even on its own */
+#define FLAG_INSN_SKIP_NOOP                    BIT(3)
+/* Instruction is optimized out based on preceding instructions */
+#define FLAG_INSN_SKIP_PREC_DEPENDENT          BIT(4)
+
+#define FLAG_INSN_SKIP_MASK            (FLAG_INSN_SKIP_NOOP | \
+                                        FLAG_INSN_SKIP_PREC_DEPENDENT)
 
 /**
  * struct nfp_insn_meta - BPF instruction wrapper
  * @n: eBPF instruction number
  * @flags: eBPF instruction extra optimization flags
  * @subprog_idx: index of subprogram to which the instruction belongs
- * @skip: skip this instruction (optimized out)
  * @double_cb: callback for second part of the instruction
  * @l: link on nfp_prog->insns list
  */
        unsigned short n;
        unsigned short flags;
        unsigned short subprog_idx;
-       bool skip;
        instr_cb_t double_cb;
 
        struct list_head l;