diff --git a/includes/llvmlite/__function.vp b/includes/llvmlite/__function.vp index 5013689..1bc22e0 100644 --- a/includes/llvmlite/__function.vp +++ b/includes/llvmlite/__function.vp @@ -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: