llvm IR常用指令二
内存访问和寻址操作
alloca指令
< result>=alloca < type> [,< ty> < NumElements>] [, align < alignment>];
分配sizeof(type)*NumElements字节的内存,分配的地址与alignment对齐
1 | %ptr = alloca i32 ;分配4字节的内存并返回i32类型的指针 |
store指令
store < ty> < value>,< ty>* < pointer>;向特定类型指针指向的内存存储相同类型的数据
1 | %ptr = alloca i32 |
load指令
< result> = load < ty>, < ty>* < pointer>;从特定类型的指针指向的内存中读取特定类型的数据
1 | %ptr = alloca i32 |
类型转换指令
trunc..to指令
< result> = trunc < ty> < value> to < ty2>;将ty类型变量截断为ty2类型的变量
1 | %X = trunc i32 257 to i8 ;i8:1 |
zext..to指令
< result> = zext < ty> < value> to < ty2>;将ty类型变量拓展为ty2类型的变量,强制转换
1 | %X = zext i32 257 to i64 ;i64:257 |
sext..to指令
< result>= sext < ty> < value> to < ty2>;将ty类型变量拓展为ty2类型的变量,复制符号位
1 | %X = sext i8 -1 to i64 ;i64:-1 |
其他操作
phi指令
由静态单赋值引起的SSA问题,引入phi函数解决
< result> = phi < ty> [ < val0>,< label0>], … ;如果前驱快为label0,则result=val0…
1 | Loop: ; Infinite loop that counts from 0 on up... |
select指令
三元运算符
< result> = select i1 < cond>,< ty> < vall>,< ty> < val2>; 如果条件cond成立
result=vall,否则 result=val2
1 | %X = select i1 true,i8 17,i8 42 ;i8:17 |
call指令
< result> = call < ty>|< fnty> < fnptrval>(< function args>); 调用函数,可以传递参数
1 | %retval = call i32 @test(i32 %argc) ;调用test函数,参数为i32类型,返回值为i32类型 |