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:
1 parent
07033094b7
commit
d37d8520c2
1 file changed
+14
-4
+14
-4
@@ -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
|
||||
|
||||
Reference in new issue
Block a user