说明:我们开发了一款新的DSP芯片,定义了一种新的指令集。现在使用llvm来将c代码编译成我们新定义的汇编指令集。本文是其中对c语言总if else语句的处理。
首先看一段c语言程序:
//c代码
void test_main()
{
int a = 5;
int b = 10;
if(a == 5)
b = 1;
else
b = 0;
}
要想编译这段语句,重点有两个,一个是条件语句的处理,第二个就是跳转。
我们首先看一下llvm把这段语句处理成的IR是什么形式:
//经llvm处理后的IR形式
%cmp = icmp eq i32 %0, 5
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
store i32 1, i32* %b, align 4
br label %if.end
if.else: ; preds = %entry
store i32 0, i32* %b, align 4
br label %if.end
if.end: ; preds = %if.else, %if.then
ret void
}
忽略次要矛盾,主要的语句就是两句:
//IR中的关键语句
%cmp = icmp eq i32 %0, 5
br i1 %cmp, label %if.then, label %if.else
一句是比