#define FLAG_INSN_SKIP_NOOP                    BIT(3)
 /* Instruction is optimized out based on preceding instructions */
 #define FLAG_INSN_SKIP_PREC_DEPENDENT          BIT(4)
+/* Instruction is optimized by the verifier */
+#define FLAG_INSN_SKIP_VERIFIER_OPT            BIT(5)
 
 #define FLAG_INSN_SKIP_MASK            (FLAG_INSN_SKIP_NOOP | \
-                                        FLAG_INSN_SKIP_PREC_DEPENDENT)
+                                        FLAG_INSN_SKIP_PREC_DEPENDENT | \
+                                        FLAG_INSN_SKIP_VERIFIER_OPT)
 
 /**
  * struct nfp_insn_meta - BPF instruction wrapper
 
 int nfp_bpf_opt_replace_insn(struct bpf_verifier_env *env, u32 off,
                             struct bpf_insn *insn);
+int nfp_bpf_opt_remove_insns(struct bpf_verifier_env *env, u32 off, u32 cnt);
 
 extern const struct bpf_prog_offload_ops nfp_bpf_dev_ops;
 
 
        unsigned int max_instr;
        int err;
 
+       /* We depend on dead code elimination succeeding */
+       if (prog->aux->offload->opt_failed)
+               return -EINVAL;
+
        max_instr = nn_readw(nn, NFP_NET_CFG_BPF_MAX_LEN);
        nfp_prog->__prog_alloc_len = max_instr * sizeof(u64);
 
        .insn_hook      = nfp_verify_insn,
        .finalize       = nfp_bpf_finalize,
        .replace_insn   = nfp_bpf_opt_replace_insn,
+       .remove_insns   = nfp_bpf_opt_remove_insns,
        .prepare        = nfp_bpf_verifier_prep,
        .translate      = nfp_bpf_translate,
        .destroy        = nfp_bpf_destroy,
 
                meta->insn.code, insn->code);
        return -EINVAL;
 }
+
+int nfp_bpf_opt_remove_insns(struct bpf_verifier_env *env, u32 off, u32 cnt)
+{
+       struct nfp_prog *nfp_prog = env->prog->aux->offload->dev_priv;
+       struct bpf_insn_aux_data *aux_data = env->insn_aux_data;
+       struct nfp_insn_meta *meta = nfp_prog->verifier_meta;
+       unsigned int i;
+
+       meta = nfp_bpf_goto_meta(nfp_prog, meta, aux_data[off].orig_idx);
+
+       for (i = 0; i < cnt; i++) {
+               if (WARN_ON_ONCE(&meta->l == &nfp_prog->insns))
+                       return -EINVAL;
+
+               /* doesn't count if it already has the flag */
+               if (meta->flags & FLAG_INSN_SKIP_VERIFIER_OPT)
+                       i--;
+
+               meta->flags |= FLAG_INSN_SKIP_VERIFIER_OPT;
+               meta = list_next_entry(meta, l);
+       }
+
+       return 0;
+}