LLVM 允许多条指令合而为一吗?

Does LLVM allow multiple instructions in one?

我习惯了 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 何时可以是子表达式是否有规则?

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