You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ML-IR转LLVM IR生成错误IR,LLVM14下lli编译失败

MLIR转LLVM IR后lli报错(ptr类型兼容问题)

我按照MLIR hello示例项目的步骤,将MLIR转换为LLVM IR并尝试编译,项目本身能完成编译,但生成的LLVM IR(print.ll文件)和示例内容不一致——我的文件里用ptr替代了示例中的i8*,比如declare ptr @malloc(i64)。这导致Ubuntu系统上的LLVM 14.0.0版本的lli无法运行,报错如下:

错误信息:

lli: lli: ./print2.ll:9:9: error: expected type declare ptr @malloc(i64)

生成的print.ll内容:

; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@nl = internal constant [2 x i8] c"\0A\00"
@frmt_spec = internal constant [4 x i8] c"%f \00"

declare ptr @malloc(i64)

declare void @free(ptr)

declare i32 @printf(ptr, ...)

define void @main() {
  %1 = call ptr @malloc(i64 ptrtoint (ptr getelementptr (double, ptr null, i64 6) to i64))
  %2 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } undef, ptr %1, 0
  %3 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %2, ptr %1, 1
  %4 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %3, i64 0, 2
  %5 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %4, i64 2, 3, 0
  %6 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %5, i64 3, 3, 1
  %7 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %6, i64 3, 4, 0
  %8 = insertvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %7, i64 1, 4, 1
  %9 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %10 = getelementptr double, ptr %9, i64 0
  store double 1.000000e+00, ptr %10, align 8
  %11 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %12 = getelementptr double, ptr %11, i64 1
  store double 2.000000e+00, ptr %12, align 8
  %13 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %14 = getelementptr double, ptr %13, i64 2
  store double 3.000000e+00, ptr %14, align 8
  %15 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %16 = getelementptr double, ptr %15, i64 3
  store double 4.000000e+00, ptr %16, align 8
  %17 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %18 = getelementptr double, ptr %17, i64 4
  store double 5.000000e+00, ptr %18, align 8
  %19 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %20 = getelementptr double, ptr %19, i64 5
  store double 6.000000e+00, ptr %20, align 8
  br label %21

21:                                               ; preds = %36, %0
  %22 = phi i64 [ 0, %0 ], [ %38, %36 ]
  %23 = icmp slt i64 %22, 2
  br i1 %23, label %24, label %39

24:                                               ; preds = %21
  br label %25

25:                                               ; preds = %28, %24
  %26 = phi i64 [ 0, %24 ], [ %35, %28 ]
  %27 = icmp slt i64 %26, 3
  br i1 %27, label %28, label %36

28:                                               ; preds = %25
  %29 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 1
  %30 = mul i64 %22, 3
  %31 = add i64 %30, %26
  %32 = getelementptr double, ptr %29, i64 %31
  %33 = load double, ptr %32, align 8
  %34 = call i32 (ptr, ...) @printf(ptr @frmt_spec, double %33)
  %35 = add i64 %26, 1
  br label %25

36:                                               ; preds = %25
  %37 = call i32 (ptr, ...) @printf(ptr @nl)
  %38 = add i64 %22, 1
  br label %21

39:                                               ; preds = %21
  %40 = extractvalue { ptr, ptr, i64, [2 x i64], [2 x i64] } %8, 0
  call void @free(ptr %40)
  ret void
}

!llvm.module.flags = !{!0}

!0 = !{i32 2, !"Debug Info Version", i32 3}

解决办法

原因

LLVM 15及后续版本引入了统一指针类型ptr,替代了旧版的i8*等指针写法,但LLVM 14不支持这个新语法,所以lli无法解析生成的IR文件。

方案1:升级LLVM版本

将LLVM升级到15或更高版本,原生支持ptr类型,直接用lli运行生成的print.ll即可。

方案2:批量替换IR中的ptr为i8*

如果不想升级LLVM,用sed命令批量修改IR文件,适配LLVM 14的语法:

sed -i 's/ptr/i8*/g' print.ll

修改完成后再用lli运行修改后的文件即可。

内容的提问来源于stack exchange,提问作者Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:05:41