fix(llvmfunc): T2 窥孔槽 load 超过 64 记录上限时放弃转发,避免删 def 留悬空 use
This commit is contained in:
1 parent
8e2d5b227c
commit
4a8d8f34c0
1 file changed
+14
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user