From: kernel test robot <lkp@intel.com>
To: Eduard Zingerman <eddyz87@gmail.com>,
bpf@vger.kernel.org, ast@kernel.org
Cc: oe-kbuild-all@lists.linux.dev, andrii@kernel.org,
daniel@iogearbox.net, kernel-team@fb.com,
yonghong.song@linux.dev, Eduard Zingerman <eddyz87@gmail.com>
Subject: Re: [PATCH bpf-next v3 34/51] bpf: use SCEV to widen bounded loops
Date: Sat, 10 Oct 2026 09:25:58 +0800 [thread overview]
Message-ID: <202610100928.qjEH6jQv-lkp@intel.com> (raw)
In-Reply-To: <20261009-scev-minimal-rebase-v3-34-bcba9bc53ac9@gmail.com>
Hi Eduard,
kernel test robot noticed the following build errors:
[auto build test ERROR on e1d84a37cba984388988d2f1ddc84561413f0db2]
url: https://github.com/intel-lab-lkp/linux/commits/Eduard-Zingerman/bpf-represent-stack-access-effects-with-arg_access_info/20261009-034719
base: e1d84a37cba984388988d2f1ddc84561413f0db2
patch link: https://lore.kernel.org/r/20261009-scev-minimal-rebase-v3-34-bcba9bc53ac9%40gmail.com
patch subject: [PATCH bpf-next v3 34/51] bpf: use SCEV to widen bounded loops
config: i386-buildonly-randconfig-1002-20261010 (https://download.01.org/0day-ci/archive/20261010/202610100928.qjEH6jQv-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261010/202610100928.qjEH6jQv-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202610100928.qjEH6jQv-lkp@intel.com/
All errors (new ones prefixed by >>):
ld: kernel/bpf/scev.o: in function `compute_max_iters':
>> kernel/bpf/scev.c:2062:(.text+0x1193): undefined reference to `__udivdi3'
>> ld: kernel/bpf/scev.c:2067:(.text+0x11b7): undefined reference to `__udivdi3'
ld: kernel/bpf/scev.c:2074:(.text+0x11e3): undefined reference to `__udivdi3'
ld: kernel/bpf/scev.c:2075:(.text+0x1207): undefined reference to `__udivdi3'
ld: kernel/bpf/scev.c:2081:(.text+0x123e): undefined reference to `__udivdi3'
ld: kernel/bpf/scev.o:kernel/bpf/scev.c:2089: more undefined references to `__udivdi3' follow
ld: kernel/bpf/scev.o: in function `compute_max_iters':
kernel/bpf/scev.c:2141:(.text+0x1464): undefined reference to `__udivmoddi4'
vim +2062 kernel/bpf/scev.c
1980
1981 /*
1982 * Loop with post-condition:
1983 *
1984 * r0 = 0
1985 * l: ... r0 ∈ [0,1,2] header executed 3 times
1986 * r0 += 1 r0 ∈ [0,1,2]
1987 * ... r0 ∈ [1,2,3]
1988 * if r0 != 3 goto l r0 ∈ [1,2,3] backedge taken 2 times
1989 * ... r0 ∈ [3]
1990 *
1991 * SCEV at header: r0 = k
1992 * SCEV at latch: r0 = 1 + k
1993 *
1994 * Loop with pre-condition:
1995 *
1996 * r0 = 0
1997 * l: ... r0 ∈ [0,1,2,3] header executed 4 times
1998 * if r0 == 3 goto e r0 ∈ [0,1,2,3] backedge taken 3 times
1999 * r0 += 1 r0 ∈ [0,1,2]
2000 * ... r0 ∈ [1,2,3]
2001 * goto l r0 ∈ [1,2,3]
2002 * e: ... r0 ∈ [3]
2003 *
2004 * SCEV at header: r0 = k
2005 * SCEV at latch: r0 = k
2006 */
2007 static bool compute_max_iters(struct bpf_verifier_env *env,
2008 struct bpf_func_state *st,
2009 struct linear_latch *latch,
2010 struct bpf_loop_iters *iters)
2011 {
2012 struct bpf_insn_aux_data *aux = env->insn_aux_data;
2013 struct bpf_loop *loop = aux[bpf_loop_at_index(env, latch->insn_idx)].loop;
2014 struct scev *scev = env->scev;
2015 struct scev_value initial_val, step_val, bound_val;
2016 u64 step, diff, bound, initial, backedge_taken_count;
2017 u8 op = latch->op;
2018 bool up, down;
2019
2020 if (!eval_expr(env, scev, st, latch->base_expr, &initial_val) ||
2021 !eval_expr(env, scev, st, latch->step_expr, &step_val) ||
2022 !eval_expr(env, scev, st, latch->bound_expr, &bound_val))
2023 return false;
2024
2025 if (step_val.ptr_reg >= 0) {
2026 if (env->log.level & BPF_LOG_LEVEL2) {
2027 bpf_log(&env->log, "scev: latch step is a pointer ");
2028 log_scev_value(env, st, &step_val);
2029 bpf_log(&env->log, "\n");
2030 }
2031 return false;
2032 }
2033 if (!scev_value_compatible(env, st, &initial_val, &bound_val))
2034 return false;
2035
2036 initial = initial_val.value;
2037 step = step_val.value;
2038 bound = bound_val.value;
2039
2040 if (step == 0)
2041 return false;
2042 down = (s64)step < 0;
2043 up = (s64)step > 0;
2044 diff = bound - initial;
2045 switch (op) {
2046 case BPF_JLT:
2047 /*
2048 * E.g.: 3 + 2*i < 7 ⇔ 2*i < 4 ⇔ i ∈ [0,1].
2049 * Here the inequality describes a set of values `i` might take
2050 * while the latch condition remains true (the backedge is taken).
2051 * The backedge_taken_count is the size of this set.
2052 */
2053 if (/*
2054 * If the condition is initially true, decreasing values won't
2055 * change that without underflow. If the condition is initially false,
2056 * the main pass would do a single iteration anyway.
2057 */
2058 down ||
2059 /* Is the latch condition false on the first iteration? */
2060 initial >= bound ||
2061 /* Count iterations satisfying the strict inequality, including i=0. */
> 2062 check_add_overflow((diff - 1) / step, 1, &backedge_taken_count) ||
2063 /*
2064 * Check if the last iteration overflows the counter:
2065 * initial + backedge_taken_count * step > U64_MAX
2066 */
> 2067 backedge_taken_count > (U64_MAX - initial) / step)
2068 return false;
2069 break;
2070 case BPF_JLE:
2071 /* E.g.: 3 + 2*i ≤ 7 ⇔ 2*i ≤ 4 ⇔ i ∈ [0,1,2]. */
2072 if (down || initial > bound ||
2073 /* Count iterations satisfying the non-strict inequality. */
2074 check_add_overflow(diff / step, 1, &backedge_taken_count) ||
2075 backedge_taken_count > (U64_MAX - initial) / step)
2076 return false;
2077 break;
2078 case BPF_JGT:
2079 /* E.g.: 7 - 2*i > 3 ⇔ 2*i < 4 ⇔ i ∈ [0,1]. */
2080 if (up || initial <= bound ||
2081 check_add_overflow((-diff - 1) / -step, 1, &backedge_taken_count) ||
2082 /*
2083 * The last iteration underflows the counter if:
2084 * initial + backedge_taken_count * step < 0 ⇔
2085 * backedge_taken_count * step < -initial ⇔
2086 * backedge_taken_count > initial / -step
2087 * (direction flips because step < 0)
2088 */
2089 backedge_taken_count > initial / -step)
2090 return false;
2091 break;
2092 case BPF_JGE:
2093 /* E.g.: 7 - 2*i ≥ 3 ⇔ 2*i ≤ 4 ⇔ i ∈ [0,1,2]. */
2094 if (up || initial < bound ||
2095 check_add_overflow(-diff / -step, 1, &backedge_taken_count) ||
2096 backedge_taken_count > initial / -step)
2097 return false;
2098 break;
2099 case BPF_JSLT:
2100 if (down || (s64)initial >= (s64)bound ||
2101 check_add_overflow((diff - 1) / step, 1, &backedge_taken_count) ||
2102 /*
2103 * Check if the last iteration overflows the signed counter:
2104 * (s64)initial + backedge_taken_count * step > S64_MAX
2105 */
2106 backedge_taken_count > ((u64)S64_MAX - initial) / step)
2107 return false;
2108 break;
2109 case BPF_JSLE:
2110 if (down || (s64)initial > (s64)bound ||
2111 check_add_overflow(diff / step, 1, &backedge_taken_count) ||
2112 backedge_taken_count > ((u64)S64_MAX - initial) / step)
2113 return false;
2114 break;
2115 case BPF_JSGT:
2116 if (up || (s64)initial <= (s64)bound ||
2117 check_add_overflow((-diff - 1) / -step, 1, &backedge_taken_count) ||
2118 /*
2119 * The last iteration underflows the signed counter if:
2120 * (s64)initial + backedge_taken_count * step < S64_MIN ⇔
2121 * backedge_taken_count * step < S64_MIN - (s64)initial ⇔
2122 * backedge_taken_count > initial - (u64)S64_MIN / -step
2123 * (direction flips because step < 0)
2124 */
2125 backedge_taken_count > (initial - (u64)S64_MIN) / -step)
2126 return false;
2127 break;
2128 case BPF_JSGE:
2129 if (up || (s64)initial < (s64)bound ||
2130 check_add_overflow(-diff / -step, 1, &backedge_taken_count) ||
2131 backedge_taken_count > (initial - (u64)S64_MIN) / -step)
2132 return false;
2133 break;
2134 case BPF_JNE:
2135 /*
2136 * For a decreasing counter flip the diff and step:
2137 * 7 - 2*i ≠ 3 ⇔ 2*i ≠ 7 - 3.
2138 */
2139 diff = down ? -diff : diff;
2140 step = down ? -step : step;
2141 if (diff == 0 || diff % step)
2142 return false;
2143 backedge_taken_count = diff / step;
2144 break;
2145 default:
2146 return false;
2147 }
2148
2149 /*
2150 * max_header_count is u32 and U32_MAX means "infinite",
2151 * check to avoid overflow below.
2152 */
2153 if (backedge_taken_count >= U32_MAX - 1)
2154 return false;
2155
2156 /* The header executes once on entry and once for each taken backedge, hence +1. */
2157 iters->max_header_count = backedge_taken_count + 1;
2158 /*
2159 * The latch is a conditional jump with one jump target exiting the loop.
2160 * Linear latch is matched only if the loop has a single backedge.
2161 * The loop still, however can have multiple exits.
2162 * In such case, conservatively assume that non-latch exit can happen
2163 * at any iteration, thus setting minimal number of iterations as 0.
2164 */
2165 iters->min_header_count = loop->exits_cnt == 1 ? iters->max_header_count : 0;
2166 return true;
2167 }
2168
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2026-10-10 1:26 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 10:47 [PATCH bpf-next v3 00/51] bpf: use scalar evolution to widen bounded loops Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 01/51] bpf: represent stack access effects with arg_access_info Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 02/51] bpf: describe helper stack accesses " Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 03/51] bpf: describe kfunc " Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 04/51] bpf: track may_write flags in liveness Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 05/51] bpf: summarize may write stack slots in insn_aux_data Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 06/51] bpf: summarize live " Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 07/51] bpf: summarize regs that may hold a frame pointer " Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 08/51] bpf: record write effects for atomic operations in liveness.c Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 09/51] bpf: fix arg_track_xfer() for atomic stack spills and fills Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 10/51] bpf: derive global subprog stack liveness from BTF signatures Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 18:49 ` Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 11/51] bpf: compute parameters liveness in bpf_compute_live_registers() Eduard Zingerman
2026-10-09 11:26 ` sashiko-bot
2026-10-09 18:46 ` Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 12/51] bpf: add tnum_alignment() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 13/51] bpf: add cnum{32,64}_union() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 14/51] bpf: add cnum64_intersect_linear() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 15/51] bpf: expose bpf_rev_opcode() and bpf_flip_opcode() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 16/51] bpf: expose bpf_grow_stack_state() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 17/51] bpf: expose bpf_verbose_snum() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 18/51] bpf: allow subrange relations for PTR_TO_STACK in regsafe() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 19/51] bpf: representation for intervals with steps Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 18:55 ` Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 20/51] bpf: varying offset access support for PTR_TO_BTF_ID pointers Eduard Zingerman
2026-10-09 11:41 ` sashiko-bot
2026-10-09 19:43 ` Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 21/51] bpf: save DFS postorder numbers for program instructions Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 22/51] bpf: move the live-register and SCC printout to a standalone function Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 23/51] bpf: compute immediate dominators Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 24/51] bpf: compute loop hierarchy Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 10:47 ` [PATCH bpf-next v3 25/51] bpf: add bpf_set_reg_range() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 26/51] bpf: add bpf_mark_reg_known_scalar() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 27/51] bpf: add bpf_reg_union() and bpf_reg_union_compatible() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 28/51] bpf: add bpf_split_cur_state() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 29/51] bpf: add bpf_same_memory_origin() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 30/51] bpf: add bpf_spill_size() Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 31/51] bpf: record basic-block ends in insn_aux_data Eduard Zingerman
2026-10-09 11:45 ` bot+bpf-ci
2026-10-09 10:47 ` [PATCH bpf-next v3 32/51] bpf: allow precision backtracking between overlapping checkpoints Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 33/51] bpf: compute scalar evolution expressions for loops Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 10:47 ` [PATCH bpf-next v3 34/51] bpf: use SCEV to widen bounded loops Eduard Zingerman
2026-10-09 12:08 ` bot+bpf-ci
2026-10-10 1:25 ` kernel test robot [this message]
2026-10-10 14:55 ` Alexei Starovoitov
2026-10-10 20:02 ` Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 35/51] bpf: avoid widening registers that hinder exact stack-slot tracking Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 12:08 ` sashiko-bot
2026-10-09 10:47 ` [PATCH bpf-next v3 36/51] bpf: bpf_func_state size optimization Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 10:47 ` [PATCH bpf-next v3 37/51] selftests/bpf: __msg_next tag for matching messages on consecutive lines Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 38/51] selftests/bpf: bound UNIX socket path loops by sun_path size Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 39/51] selftests/bpf: test for stack-pointer subrange pruning Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 40/51] selftests/bpf: tests for may_write stack-liveness tracking Eduard Zingerman
2026-10-09 10:47 ` [PATCH bpf-next v3 41/51] selftests/bpf: tests for may_def marks of atomic RMW operations Eduard Zingerman
2026-10-09 10:48 ` [PATCH bpf-next v3 42/51] selftests/bpf: tests for stack pointer spills/fills through atomics Eduard Zingerman
2026-10-09 10:48 ` [PATCH bpf-next v3 43/51] selftests/bpf: tests for map special cases in bpf_helper_stack_access_bytes() Eduard Zingerman
2026-10-09 10:48 ` [PATCH bpf-next v3 44/51] selftests/bpf: tests for BTF-based global subprog stack liveness Eduard Zingerman
2026-10-09 11:45 ` bot+bpf-ci
2026-10-09 10:48 ` [PATCH bpf-next v3 45/51] selftests/bpf: test for register liveness of subprogram arguments Eduard Zingerman
2026-10-09 10:48 ` [PATCH bpf-next v3 46/51] selftests/bpf: tests for register base/step arithmetic Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 10:48 ` [PATCH bpf-next v3 47/51] selftests/bpf: tests for register base/step state pruning Eduard Zingerman
2026-10-09 12:22 ` sashiko-bot
2026-10-09 10:48 ` [PATCH bpf-next v3 48/51] selftests/bpf: tests for varying offset access to PTR_TO_BTF_ID Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 10:48 ` [PATCH bpf-next v3 49/51] selftests/bpf: tests for loop hierarchy computation Eduard Zingerman
2026-10-09 10:48 ` [PATCH bpf-next v3 50/51] selftests/bpf: tests for immediate dominator computation Eduard Zingerman
2026-10-09 10:48 ` [PATCH bpf-next v3 51/51] selftests/bpf: tests for SCEV analysis and loop widening Eduard Zingerman
2026-10-09 12:07 ` bot+bpf-ci
2026-10-09 20:40 ` [PATCH bpf-next v3 00/51] bpf: use scalar evolution to widen bounded loops patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202610100928.qjEH6jQv-lkp@intel.com \
--to=lkp@intel.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=kernel-team@fb.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox