LLVM AliasAnalysis别名分析 TBAA TypeBasedAliasAnalysis

一、什么是别名分析

Alias Analysis (又名 Pointer Analysis)是用于确定两个指针是否指向内存中的同一对象,这里有很多不同的别名分析算法,分为几种类型:流敏感vs流非敏感、上下文敏感vs上下文非敏感、域敏感vs域非敏感、基于一致性的vs基于子集的。传统的别名分析用于回答must、may、no的问题,也即两个指针总是指向同一对象,可能指向同一对象以及绝不会指向同一对象。(SSA—静态单一赋值,将同一变量名用多个名表示,被赋值的变量名不会重复,便于寻找变量的产生与使用点)。 

二、别名分析有什么用

有这样一个例子:

int foo (int __attribute__((address_space(0)))* a,
         int __attribute__((address_space(1)))* b) {
    *a = 42;
    *b = 20;
    return *a;
}

__attribute__ 指示符指定 a 是一个i32*的地址,b 是一个i32 addrspace(1)*的地址,生成ir如下:

define i32 @foo(i32* nocapture %0, i32 addrspace(1)* nocapture %1) local_unnamed_addr #0 {
  store i32 42, i32* %0, align 4, !tbaa !10
  store i32 20, i32 addrspace(1)* %1, align 4, !tbaa !10
  %3 = load i32, i32* %0, align 4, !tbaa !10
  ret i32 %3
}

我们先忽略指令后边的!tbaa这个metadata信息,这个之后会讲到。这个是clang在O2的场景下生成的IR。现在需要对于函数foo进行进一步的优化,去掉不必要的load:

define i32 @foo(i32* nocapture %0, i32 addrspace(1)* nocapture %1) local_unnamed_addr #0 {
  store i32 42, i32* %0, align 4, !tbaa !10
  store i32 20, i32 addrspace(1)* %1, align 4, !tbaa !10
  ret i32 42
}

但是这个优化有一个前提,就是a和b不能别名,不然可能会有错误:

int i = 0;
int result = foo(&i, &i);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值