LLVM是否允许一个指令中包含多条指令



我习惯了LLVM类似于汇编语言的想法,因为指令是按顺序写的,每行一条,也就是说,不像允许嵌套子表达式的高级语言,在一行中指定任意数量的计算。

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

printf("testn");

进入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何时可以是子表达式?

这是所谓的"常量表达式";这不是指令。可以在LLVM IR语言参考中找到更多信息:https://llvm.org/docs/LangRef.html#constant-表达式

最新更新