如何在LLVM中添加无else分支的条件分支指令?
能否生成不带显式else块的LLVM IR分支结构?
你想要的逻辑完全可以实现,但你给出的代码片段存在LLVM IR语法错误——条件分支指令br i1 %cond必须同时指定true和false两个目标基本块,不能只写一个目标。
要实现“条件成立时跳转到if.then.block,否则执行call @abc()和ret”的逻辑,正确的写法是把false路径的指令放在一个延续基本块里,而非省略分支目标:
entry: %2 = call i32 @func() %3 = icmp ne i32 %2, 0, !dbg br i1 %3, label %if.then.block, label %entry.cont entry.cont: call void @abc() ret void if.then.block: ; Insert instructions for the "if.then.block" ; ... ret void
如果你之前生成的代码带有额外的else块,大概率是用了默认生成完整分支结构的工具(比如Clang)。但如果你直接用LLVM API编写代码生成器,可以完全控制基本块的命名和结构:
- 创建
entry块,生成call、icmp指令 - 创建
entry.cont块,放入call @abc和ret指令 - 创建
if.then.block块,添加你的目标指令 - 最后生成条件分支指令,将true目标指向
if.then.block,false目标指向entry.cont
这种写法既符合LLVM IR的规范,又避免了冗余的else块命名,完全匹配你想要的逻辑效果。
内容的提问来源于stack exchange,提问作者vishals1991
相关产品推荐
相关产品推荐

