On Fri, Jun 10, 2022 at 3:49 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > [...] > > > > 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; In this case, we need to initialize fit_for_inline to true, no? Thanks, Song > > 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 >