【问题标题】:Does LLVM allow multiple instructions in one?LLVM 是否允许多条指令合二为一?
【发布时间】:2021-12-26 00:11:56
【问题描述】:

我习惯于认为 LLVM 类似于汇编语言,因为指令是按顺序写出的,每行一个,即不像高级语言那样允许嵌套子表达式,在单个指令中指定任意数量的计算行。

然后我注意到Clang编译了这行C

printf("test\n");

进入这行 LLVM 程序集

%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"??_C@_05FPMBMOMC@test?6?$AA@", i64 0, i64 0))

让我感到困惑的是getelementptr 被写为call子表达式。我本来希望它是前一行的单独指令。

我在这些说明中的任何一个的文档中都找不到任何内容,或者一般来说,提到这是允许的。

这里的规则是什么?一般允许子表达式吗?还是getelementptr 是个例外? getelementptr 何时可以是子表达式是否有规定?

【问题讨论】:

  • 既有 GEP 常量表达式(接受常量参数)和指令(也可以接受变量)。你看到的是一个常数。
  • @arnt 啊,酷。其他运算符也可以用作常量表达式(如果只给出常量参数),还是 GEP 在这方面是独一无二的?
  • 我发现了一个讨论,它揭示了常量表达式背后的推理:lists.llvm.org/pipermail/llvm-dev/2017-March/111247.html
  • 可以做很多其他事情,参见 ConstantExpr 类。

标签: clang llvm


【解决方案1】:

这是一个所谓的“常量表达式”的例子,它不是一个指令。更多信息可以在 LLVM IR 语言参考中找到:https://llvm.org/docs/LangRef.html#constant-expressions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多