了解LLVM IR中的位广播

时间:2018-08-28 19:08:16

标签: llvm llvm-ir

我试图了解从C ++程序生成的LLVM IR

int add(int *x);
int func()
{
        int T;
        T=25;
        return add(&T);    
}

生成的IR为:

define i32 @_Z4funcv() local_unnamed_addr #0 {
entry:
  %T = alloca i32, align 4
  %0 = bitcast i32* %T to i8*
  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %0) #3
  store i32 25, i32* %T, align 4, !tbaa !2
  %call = call i32 @_Z3addPi(i32* nonnull %T)
  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %0) #3
  ret i32 %call
}

我不明白此行%0 = bitcast i32* %T to i8*。将%Ti32转换为i8的目的是什么?

1 个答案:

答案 0 :(得分:0)

假设您了解内在函数

  

llvm.lifetime.start / llvm.lifetime.end

及其用作内存的标记用于MemoryDe​​pendenceAnalysis。

关于选择i8指针(变量地址)是为了使其更通用为字节可寻址内存区域,第一个参数的字节数与malloc中使用的字节数相同。

因此要生成内部调用,我们需要一个内存字节地址和为sizeof(T)的字节数。这就是为什么我们需要将i32 *转换为i8 *。

示例中使用的生命周期内在函数时的签名方式

  

声明void @ llvm.lifetime.start(i64,i8 * nocapture)

     

声明void @ llvm.lifetime.end(i64,i8 * nocapture)

浏览Lang ref以获得更多信息。