gpt4 book ai didi

c# - 具体来说,编译器如何积极优化生成的字节码?

转载 作者:太空狗 更新时间:2023-10-30 00:43:27 25 4
gpt4 key购买 nike

我一直在阅读各种编译器的功能,并且遇到了据报道许多编译器执行的术语“积极优化”。例如,LLVM 引用了以下编译时优化功能:

  • 特定于内存/指针
  • 循环变换
  • 数据流
  • 算术
  • 消除死代码
  • 内联

具体是什么意思?假设您有以下代码片段,您如何优化生成的字节代码以比编译器生成的代码运行得更快?我特别感兴趣的是优化 JIT 支持的运行时的字节码,例如 C#、Java 和 Flash。这很棘手,因为 JIT 只支持处理器通常执行的操作码的一个子集,这限制了您可以进行的优化量。尽管如此,我还是很想知道什么是可能的,以及究竟哪些转换可以突破 VM 的极限。

虚构的代码块:

for (i = 0; i < 100; i++){
in = dataIn[i];
if ((in % 5) == 0){
out = ((in / 2) >> 16) - 10;
}else{
out = ((in << 5) / 2) * 50 + 10;
}
dataOut[i] = out;
}

编译器生成的近似伪代码,用于Flash Player等基于堆栈的JIT VM:(请原谅我的错误,这完全是手写的!)

// i = 0
label: "forInit"
push 0
writeTo "i"

// while i < 100
label: "forStart"
push "i"
push 100
jumpIfMoreThan "forEnd"

// in = dataIn[i];
push "i"
push "dataIn"
readProp
saveTo "in"

// if ((in % 5) == 0)
push "in"
push 5
mod
push 0
jumpIfNotEquals "ifPart2"
label: ifPart1

// out = ((in / 2) >> 16) - 10;
push "in"
push 2
divide
push 16
rightshift
push 10
minus
writeTo "out"
goto "ifEnd"

// else
label: ifPart2

// out = ((in << 5) / 2) * 50 + 10;
push "in"
push 5
leftshift
push 2
divide
push 50
multiply
push 10
add
writeTo "out"

// dataOut[i] = out;
label: ifEnd
push "out"
push "i"
push "dataOut"
writeProp

// i++
push "i"
increment
writeTo "i"

// while i < 100
goto "forStart"
label: "forEnd"

最佳答案

我也一直在研究这个 transformations that LLVM performs 的完整列表, 在标题下组织:

  • 删除死代码
    • 积极的死代码消除
    • 消除死代码
    • 消除死角
    • 消除死类型
    • 消除死指令
    • 消除死店
    • 全局死亡消除
    • 删除死循环
  • 删除不需要的数据
    • 从模块中删除所有符号
    • 去除未使用符号的调试信息
    • 剥离未使用的函数原型(prototype)
    • 剥离所有 llvm.dbg.declare 内在函数
    • 从模块中去除除 dbg 符号之外的所有符号
    • 合并重复的全局常量
    • 删除未使用的异常处理信息
  • 内联函数
    • 合并函数
    • 部分内联
    • 函数集成/内联
  • 循环优化
    • 闭环 SSA 表单通过
    • 循环不变代码运动
    • 将循环提取到新函数中
    • 将最多一个循环提取到一个新函数中
    • 循环强度降低
    • 旋转循环
    • 规范化自然循环
    • 展开循环
    • 取消循环
  • 杂项
    • 将“通过引用”参数提升为标量
    • 组合指令以在基本 block 内形成向量指令
    • 配置文件引导的基本 block 放置
    • 在 CFG 中打断关键边
    • 优化代码生成
    • 简单的常量传播
    • 推导函数属性
    • 全局变量优化器
    • 全局值编号
    • 规范归纳变量
    • 插入用于边缘分析的仪器
    • 为边缘分析插入最佳仪器
    • 合并冗余指令
    • 内部化全局符号
    • 过程间常量传播
    • 过程间稀疏条件常数传播
    • 跳线程
    • 将原子内在函数降低为非原子形式
    • 较低的调用和展开,用于无展开代码生成器
    • 将 SwitchInst 下到分支机构
    • 促进内存内存
    • MemCpy 优化
    • 统一函数导出节点
    • 重新关联表达式
    • 将所有值降级到栈槽
    • 聚合的标量替换 (DT)
    • 稀疏条件常数传播
    • 简化知名库调用
    • 简化CFG
    • 代码下沉
    • 将 sret 参数提升为多个 ret 值
    • 尾调用消除
    • 尾部重复

关于c# - 具体来说,编译器如何积极优化生成的字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com