c++ 如何使用Polygeist(cgeist)将C代码转换成MLIR格式?

sqxo8psd  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(394)

我正在尝试使用Polygeist将C代码转换为MLIR格式。我在Windows 10上尝试了以下命令行(路径中已经添加了cgeist.exe)。输出文件只包含属性。
化学元素aes. c-S -o aes.scf.毫微度
输出文件:

module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.endianness", "little">, #dlti.dl_entry<i64, dense<64> : vector<2xi32>>, #dlti.dl_entry<f80, dense<128> : vector<2xi32>>, #dlti.dl_entry<i1, dense<8> : vector<2xi32>>, #dlti.dl_entry<i8, dense<8> : vector<2xi32>>, #dlti.dl_entry<i16, dense<16> : vector<2xi32>>, #dlti.dl_entry<i32, dense<32> : vector<2xi32>>, #dlti.dl_entry<f16, dense<16> : vector<2xi32>>, #dlti.dl_entry<f64, dense<64> : vector<2xi32>>, #dlti.dl_entry<f128, dense<128> : vector<2xi32>>>, llvm.data_layout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-pc-windows-msvc19.34.31933", "polygeist.target-cpu" = "x86-64", "polygeist.target-features" = "+cx8,+fxsr,+mmx,+sse,+sse2,+x87", "polygeist.tune-cpu" = "generic"} {
}

有什么我应该改变使它工作?也许有其他的C/C++前端支持MLIR可以利用?非常感谢您的任何答案提前:D

cqoc49vn

cqoc49vn1#

Polygeist要求您指定要使用--function=<string>降低的C函数。如果未指定,MLIR模块将使用空主体生成。
要降低输入代码中每个函数的值,请使用--function=*

$ cgeist aes.c --function=* -S -o aes.scf.mlir

此时,您已经使用定制打印机转储了一个MLIR代码。您可以通过将上面的输出传递给polygeist-opt来获得通用的MLIR格式:

cgeist aes.c --function=* -S -o aes.scf.mlir | polygeist-opt --mlir-print-op-generic

示例

假设我们有输入文件sum.c

int sum(int a, int b) {
    return a + b;
}

运行cgeist sum.c --function=sum -S,我们得到:

module attributes {llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu"}  {
  func @sum(%arg0: i32, %arg1: i32) -> i32 attributes {llvm.linkage = #llvm.linkage<external>} {
    %0 = arith.addi %arg0, %arg1 : i32
    return %0 : i32
  }
}

运行cgeist sum.c --function=sum -S | polygeist-opt --mlir-print-op-generic,我们得到:

"builtin.module"() ( {
  "builtin.func"() ( {
  ^bb0(%arg0: i32, %arg1: i32):  // no predecessors
    %0 = "arith.addi"(%arg0, %arg1) : (i32, i32) -> i32
    "std.return"(%0) : (i32) -> ()
  }) {llvm.linkage = #llvm.linkage<external>, sym_name = "sum", type = (i32, i32) -> i32} : () -> ()
}) {llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu"} : () -> ()

相关问题