死代码删除(DCE,Dead Code Elimination)和激进的死代码删除(ADCE,Aggressive DCE)

死代码删除(DCE,Dead Code Elimination)和激进的死代码删除(ADCE,Aggressive DCE)


介绍一下DCE和ADCE基本算法。

死代码删除(DCE,Dead Code Elimination)

DCE简介

DCE用于删除对程序结果没有任何影响的代码。Dead code主要包括:

  • 一个变量从其定值的代码位置开始直到出口的任何路径都不会被使用
  • 一条指令它仅计算那种从该指令开始的任何路径都不会被使用的值
  • 将一个死变量赋值给一个局部变量,如果通向程序出口的任何路径都不会使用这个局部变量,则这个局部变量及其赋值的指令都是Dead

Dead Code的来源:

  • 源代码中本来就存在的
  • 其他优化pass产生的(例如强度削弱)

DCE基本算法

一种乐观的方法(来源于《高级编译器设计与实现》):

  • 首先,标识所有计算必要值的指令。比如在过程中要返回或输出的值,或者它可能会对从过程外访问的存储单元有影响
  • 然后,以迭代的方式逐步标记对这种对计算必要值有贡献的指令
  • 当以上迭代过程稳定不变时,所有未标记的指令都可以认为是Dead Code,可以删除

具体实现上,可以借助工作表(worklist)和du/ud链来实现:

  • 用必要指令的基本块索引偶对的集合初始化worklist。mark[i][j] = true,并加入到worklist中(这里的<i,j>为基本块索引和指令位置的偶对)
  • 从worklist中删除一个偶对,对于这条指令中使用的每个变量v,标识它ud链上的每条指令,并将这些指令的基本块索引偶对加入到worklist中
  • 如果指令是一个赋值(比如v<–exp),则对它du链中每条指令位置<k,l>,如果指令<k,l>是一个if,则标识它,并将<k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值