fix(llvmfunc): T2 窥孔槽 load 超过 64 记录上限时放弃转发,避免删 def 留悬空 use

This commit is contained in:
TermiNexus committed 2026-09-09 08:55:48 +08:00
1 parent 8e2d5b227c
commit 4a8d8f34c0
1 file changed
+14
+14
View File
@@ -891,6 +891,20 @@ def _peephole_opt(func: rowptr[Function], pool: rowptr[memhub.MemBuddy]):
load_cnt += 1
if blk_s == entry_blk and st_line_order < 0:
load_entry_order += 1
else:
# lname 分配失败:该 load 不会进 load_ltoks,但删除阶段
# 仍会按槽名删其 def 行,use 无法改写为 store 值 → 悬空。
# 保守放弃本 alloca 槽的 T2 转发。
unsafe = 1
else:
# 本 alloca 的 load 超过记录容量(load_ltoks=8*64,上限 64)
# 或行内无 '%' 无法解析 def 名:超出容量的 load 不会被记录,
# 但删除阶段按槽名删除全部 " = load " def 行 → 未记录 load 的
# use 未改写为 store 值,将悬空引用已删 def(llc:
# "use of undefined value",见 strcmp 短路链 >64 分支场景)。
# 只有 load 全集都被记录时才能安全删全量 def,故保守放弃
# 本 alloca 槽的整个 T2 转发(保留 alloca/store/load,IR 仍合法)。
unsafe = 1
else:
unsafe = 1
if sb is not None: