fix(mlir): 类型文本转换直通 MLIR 浮点标量 f16/f32/f64/f128

builders 经 TypePrint 输出的内嵌类型已是 MLIR 形态(见本文件 TypePrint 段说明),
但 _MlirTypeAppend 只对 '!' 前缀原样直通,浮点标量落到兜底 fail:实测
`%0 = alloca f64` 报 [MLIR-FAIL] 无法转换为 MLIR 类型文本(v1 未覆盖该形态):'f64'。

- 补 'f' + 全数字直通(与 LLVM 形态 half/float/double/fp128 分支不冲突)
- 订正函数头注释与 MlirTypeText docstring:中间文本两种形态都接受
  (MLIR 常态直通 / LLVM 形态转写)
This commit is contained in:
TermiNexus committed 2026-10-03 20:12:48 +08:00
1 parent 07033094b7
commit d37d8520c2
1 file changed
+14 -4
+14 -4
View File
@@ -683,12 +683,15 @@ def TypePrint(buf: str, size: sizet,
# ============================================================
# 类型文本 → MLIR 类型文本转换
#
# 中间指令文本里的类型是 LLVM 语法(i8*、[4 x i32]、{i32, i8*}、%"name"),
# 需要转换成 MLIR 语法(!llvm.ptr、!llvm.array<4 x i32>、
# !llvm.struct<(i32, !llvm.ptr)>、!llvm.struct<(…)>)后才能写进 op 行。
# 中间指令文本里的类型有两种来源,本函数**都接受**:
# ① MLIR 形态(常态):builders 内嵌类型经 _type_str → TypePrint 渲染,
# 已是 `i32` / `f64` / `!llvm.ptr` / `!llvm.array<N x T>` / `!llvm.struct<(…)>`
# —— 以 `!` 开头者与浮点标量 `f16/f32/f64/f128` 原样直通,`iN` 走整数分支;
# ② LLVM 形态(手工构造中间文本时可能出现):`i8*` / `[4 x i32]` / `{i32, i8*}`
# / `double` / `%"name"`,由下方各分支转写为对应 MLIR 语法。
# ============================================================
def MlirTypeText(dst: str, dstsz: sizet, src: str, pool: memhub.MemBuddy*):
"""把 LLVM 语法类型文本转换为 MLIR 类型文本(追加到 dst)"""
"""把中间文本类型(MLIR 或 LLVM 形态)规范化为 MLIR 类型文本(追加到 dst)"""
if dst is None or dstsz == 0 or src is None:
return
_MlirTypeAppend(dst, dstsz, src, pool, 0)
@@ -779,6 +782,13 @@ def _MlirTypeAppend(dst: str, dstsz: sizet, src: str, pool: memhub.MemBuddy*,
if p[0] == '!':
_MlirAppendN(dst, dstsz, p, lt)
return
# 浮点标量的 MLIR 形态 f16/f32/f64/f128:TypePrint 直接输出该形态(见本文件
# 顶部 TypePrint 渲染规则),必须原样直通;下方 half/float/double/fp128 分支
# 只兼容手工构造的 LLVM 形态中间文本。'f' + 全数字与上述 LLVM 名不冲突
# ("float" 次字符 'l'、"fp128" 次字符 'p' 均非数字)。
if p[0] == 'f' and _MlirAllDigits(p, lt, 1) != 0:
_MlirAppendN(dst, dstsz, p, lt)
return
if lt == 4 and string.strncmp(p, "none", 4) == 0:
_strappend(dst, dstsz, "none")
return