From 4a8d8f34c0b5cc4dcc3dee32ebe8677e4f6790a2 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 9 Sep 2026 08:55:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(llvmfunc):=20T2=20=E7=AA=A5=E5=AD=94?= =?UTF-8?q?=E6=A7=BD=20load=20=E8=B6=85=E8=BF=87=2064=20=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E6=97=B6=E6=94=BE=E5=BC=83=E8=BD=AC=E5=8F=91?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E5=88=A0=20def=20=E7=95=99=E6=82=AC?= =?UTF-8?q?=E7=A9=BA=20use?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/llvmlite/__function.vp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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: