> On Fri, 2022-06-10 at 15:40 -0700, Song Liu wrote: > Yes, I was thinking about this change. I guess it can also be clear: > > static void update_loop_inline_state(struct bpf_verifier_env *env, u32 > subprogno) > { > struct bpf_loop_inline_state *state = &cur_aux(env)->loop_inline_state; > struct bpf_reg_state *regs = cur_regs(env); > struct bpf_reg_state *flags_reg = ®s[BPF_REG_4]; > int flags_is_zero; > > if (state->cannot_inline) > return; > > flags_is_zero = register_is_const(flags_reg) && > flags_reg->var_off.value == 0; > > if (!state->initialized) { > state->initialized = 1; > state->cannot_inline = !flags_is_zero; > state->callback_subprogno = subprogno; > return; > } > > state->cannot_inline = !flags_is_zero || > state->callback_subprogno != subprogno; > } > > What do you think about this version? Maybe keep `fit_for_inline` to minimize amount of negations? As below: static void update_loop_inline_state(struct bpf_verifier_env *env, u32 subprogno) { struct bpf_loop_inline_state *state = &cur_aux(env)->loop_inline_state; struct bpf_reg_state *regs = cur_regs(env); struct bpf_reg_state *flags_reg = ®s[BPF_REG_4]; int flags_is_zero; /* this should be compiled as a single instruction anyway */ if (!state->fit_for_inline) return; flags_is_zero = register_is_const(flags_reg) && flags_reg->var_off.value == 0; if (!state->initialized) { state->initialized = 1; state->fit_for_inline = flags_is_zero; state->callback_subprogno = subprogno; return; } state->fit_for_inline = flags_is_zero && state->callback_subprogno == subprogno; } // ... static int optimize_bpf_loop(struct bpf_verifier_env *env) { if (is_bpf_loop_call(insn) && inline_state->fit_for_inline) { ... } // vs if (is_bpf_loop_call(insn) && !inline_state->cannot_inline) { ... } } Thanks, Eduard