Straw's B1og.

llvm IR常用指令二

字数统计: 722阅读时长: 3 min
2024/02/29

llvm IR常用指令二

内存访问和寻址操作

alloca指令

< result>=alloca < type> [,< ty> < NumElements>] [, align < alignment>];

分配sizeof(type)*NumElements字节的内存,分配的地址与alignment对齐

1
2
3
4
%ptr = alloca i32                  ;分配4字节的内存并返回i32类型的指针
%ptr = alloca i32,i32 4 ;分配4*4字节的内存并返回i32类型的指针
%ptr = alloca i32,i32 4,align 1024 ;分配4*4字节的内存并返回i32类型的指针,分配地址与1024对齐
%ptr = alloca i32,align 1024 ;分配4字节的内存并返回i32类型的指针,分配地址与1024对齐

store指令

store < ty> < value>,< ty>* < pointer>;向特定类型指针指向的内存存储相同类型的数据

1
2
%ptr = alloca i32
store i32 3, i32* %ptr

load指令

< result> = load < ty>, < ty>* < pointer>;从特定类型的指针指向的内存中读取特定类型的数据

1
2
3
%ptr = alloca i32
store i32 3, i32* %ptr
%value = load i32,i32* %ptr

类型转换指令

trunc..to指令

< result> = trunc < ty> < value> to < ty2>;将ty类型变量截断为ty2类型的变量

1
2
3
4
%X = trunc i32 257 to i8                      ;i8:1
%Y = trunc i32 123 to i1 ;i1:true
%Z = trunc i32 122 to i1 ;i1:false
%W = trunc <2 x i16> <i16 8,i16 7>to<2 x i8> ;<i8 8,i8 7>

zext..to指令

< result> = zext < ty> < value> to < ty2>;将ty类型变量拓展为ty2类型的变量,强制转换

1
2
3
%X = zext i32 257 to i64                       ;i64:257
%Y = zext i1 true to i32 ;i32:1
%Z = zext <2 x i16> <i16 8,i16 7> to <2 x i32> ;<i32 8,i32 7>

sext..to指令

< result>= sext < ty> < value> to < ty2>;将ty类型变量拓展为ty2类型的变量,复制符号位

1
2
3
%X = sext i8 -1 to i64                         ;i64:-1
%Y = sext i1 true to i32 ;i32:-1
%Z = sext <2 x i16> <i16 8,i16 7> to <2 x i32> ;<i32 8,i32 7>

其他操作

phi指令

由静态单赋值引起的SSA问题,引入phi函数解决

llvm2

< result> = phi < ty> [ < val0>,< label0>], … ;如果前驱快为label0,则result=val0…

1
2
3
4
Loop:     ; Infinite loop that counts from 0 on up...
%indvar = phi i32[ 0, %LoopHeader ],[ %nextindvar, %Loop ]
%nextindvar = add i32 %indvar,1
br label %Loop ;phi指令实现for循环

select指令

三元运算符

< result> = select i1 < cond>,< ty> < vall>,< ty> < val2>; 如果条件cond成立

result=vall,否则 result=val2

1
2
%X = select i1 true,i8 17,i8 42    ;i8:17
%X = select i1 flase,i8 17,i8 42 ;i8:42

call指令

< result> = call < ty>|< fnty> < fnptrval>(< function args>); 调用函数,可以传递参数

1
2
%retval = call i32 @test(i32 %argc)                  ;调用test函数,参数为i32类型,返回值为i32类型
call i32 (i8*, ...)* @printf(i8* %msg, i32 12,i8 42) ;调用printf函数,参数可变
CATALOG
  1. 1. llvm IR常用指令二
    1. 1.0.1. 内存访问和寻址操作
      1. 1.0.1.1. alloca指令
      2. 1.0.1.2. store指令
      3. 1.0.1.3. load指令
    2. 1.0.2. 类型转换指令
      1. 1.0.2.1. trunc..to指令
      2. 1.0.2.2. zext..to指令
      3. 1.0.2.3. sext..to指令
    3. 1.0.3. 其他操作
      1. 1.0.3.1. phi指令
      2. 1.0.3.2. select指令
      3. 1.0.3.3. call指令