当前位置: 首页 > news >正文

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

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

  • 死代码删除(DCE,Dead Code Elimination)
    • DCE简介
    • DCE基本算法
  • 激进的死代码删除(ADCE,Aggressive DCE)
    • ADCE简介
    • ADCE基本算法
  • 信息维护

介绍一下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,l>加入到worklist中
  • 重复上述两个步骤,直到worklist为空
  • 删除未标识的指令和已经为空的基本块

激进的死代码删除(ADCE,Aggressive DCE)

ADCE简介

ADCE激进的死代码删除,相较于DCE,ADCE会删除冗余的控制流结构(Control Flow Structure)。

ADCE基本算法

  • 标记必要指令语句为有效语句。比如输入/输出、存储至存储器等有副作用(side effect)语句
  • 使用数据流信息(du链)信息标记那些对有效语句有贡献的语句为有效语句
  • 对于条件分支语句,其他有效语句控制依赖于该条件分支语句也标记为有效语句
  • 最后删除无效语句

相较于DCE,ADCE对于条件分支语句需要根据控制依赖关系决定其是否有效。

信息维护

DCE和ADCE后,需要对du链、phi函数、CFG等信息进行维护。

参考

  • 高级编译器设计与实现
  • 现代编译原理C语言描述

相关文章:

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

死代码删除&#xff08;DCE&#xff0c;Dead Code Elimination&#xff09;和激进的死代码删除&#xff08;ADCE&#xff0c;Aggressive DCE&#xff09;死代码删除&#xff08;DCE&#xff0c;Dead Code Elimination&#xff09;DCE简介DCE基本算法激进的死代码删除&#xff0…...

询问new bing关于android开发的15个问题(前景、未来、发展方向)

前言&#xff1a;new bing是基于chat-gpt的新搜索工具&#xff0c;可以采用对话方式进行问题搜索&#xff0c;经过排队等候终于可以使用new bing&#xff0c;询问了目前我最关心的关于android开发几个问题 文章目录1.如何学好android开发&#xff1f;2.android开发能做什么?3.…...

【C++】初识类和对象

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、面向过程和面向对象初步认识二…...

EPICS S7nodave手册

第一章&#xff1a;介绍 本手册分为6章(不算次介绍部分)。第一章介绍s7nodave用于EPICS的设备支持的概念和特新。第二章描述启动一个使用s7nodave的IOC项目所需要的几步。第三章描述s7nodave支持的IOC shell命令。之后&#xff0c;第四章解释s7nodave支持的各种记录类型。最后…...

2023最新版本RabbitMQ的持久化和简单使用

上节讲了 RabbitMQ下载安装教程 &#xff0c; 本节主要介绍RabbitMQ的持久化和简单使用。 一、RabbitMQ消息持久化 当处理一个比较耗时得任务的时候&#xff0c;也许想知道消费者&#xff08;consumers&#xff09;是否运行到一半就挂掉。在当前的代码中&#xff0c;当RabbitM…...

函数式编程

函数式编程&#xff08;一&#xff09; 文章目录函数式编程&#xff08;一&#xff09;1. 前言1.1 概念2. Lambda 表达式2.1 概述2.2 基本的格式2.3 触发条件2.4 Lambda表达式2.4.1 无参无返回值2.4.2 有参无返回值2.4.3 无参数有返回值2.4.4 有参有返回值【重点】2.4.4.1 比较…...

【Java 类】001-访问修饰符、命名规范

【Java 类】001-访问修饰符、命名规范 文章目录【Java 类】001-访问修饰符、命名规范一、访问修饰符概述1、是什么2、作用作用问题3、访问修饰符有哪些4、作用对象二、访问修饰符使用演示1、类访问修饰符演示第一步&#xff1a;创建 Dog 类&#xff1a;public第二步&#xff1a…...

【C++】命名空间

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、命名空间产生的背景二、命名空…...

【AutoSAR】【MCAL】Dio

一、结构 二、功能介绍 DIO&#xff08;数字输入输出&#xff09;驱动模块主要是对端口&#xff08;Port&#xff09;&#xff0c;通道&#xff08;Channel&#xff09;和通道组&#xff08;ChannelGroup&#xff09;进行读写操作。 通道&#xff08;Channel&#xff09;&…...

瑞吉外卖——day2

目录 一、新增员工 二、查询分页数据 三、启用、禁用员工账户、编辑员工信息 一、新增员工 点击左上角新增员工 页面如下&#xff1a; 我们随便填数据 &#xff0c;点击保存&#xff0c;请求的地址如下 返回前端可以看到请求方式为Post 在employeeController中编写对应的代…...

了解java

#常见编程语言介绍 C语言 C语言 java语言 javaScript语言 PHP语言 python语言Object-C和Swift语言 C# &#xff08;c sharp&#xff09;语言 Kotlin语言 Go语言 Basic语言 #JAVA的发展 起源于1991年SUN公司GREEN项目&#xff0c;1996年JDK1.0正式发布 后被Oracle公司收购&…...

【编程实践】代码之中有创意:“我一直认为工程师世界上最具创造性的工作之一”

代码之中有创意 “我一直认为工程师世界上最具创造性的工作之一”。 文章目录 代码之中有创意一、代码可以赋予创造力1.1 代码的创造力1.2 如何发挥代码的创造力二、有创意的代码可以提高工作效率2.1 代码创意可以提高工作效率2.2 如何利用代码创意来提高工作效率三、代码创意可…...

【MySQL】表连接

一、为什么要学习 因为不合理的使用连接会导致慢查询 二、什么是连接 参与连接的表叫做 连接表&#xff0c; 连接就是把 各个连接表 进行的组合 &#xff08;笛卡儿积&#xff09;加入结果集并返回 三、连接查询 如何只是对表进行大量的连接&#xff0c;笛卡儿积作用得到的…...

2023湖南省“楚怡杯”职业技能大赛“网络安全” 项目比赛任务书

2023湖南省“楚怡杯”职业技能大赛“网络安全” 项目比赛任务书2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#xff1a;Ngi…...

Android应用启动优化笔记整理

应用启动相关流程与优化 应用启动主要涉及SystemServer进程 和 app进程。 SystemServer进程负责app进程创建和管理、窗口的创建和管理&#xff08;StartingWindow 和 AppWindow&#xff09;、应用的启动流程调度等。 App进程被创建后&#xff0c;进行一系列进程初始化、组件初…...

图像bytes字节串二进制转十六进制及bytes转为图像

目录前言正文二进制与十六进制的bytes互转读取bytes为图像法1:直接写入f.read的结果法2: 转换为PIL或Numpy前言 参考&#xff1a; 8. python基础之基础数据类型–bytes - CSDN python 16进制与图片互转 - CSDN 正文 二进制与十六进制的bytes互转 bytes保存的是原始的字节(二…...

信息安全与数学基础-笔记-②同余

知识目录同余完全剩余系剩余类完全剩余系❀简化剩余系❀欧拉函数逆元&#xff01;欧拉定理 &#xff01;同余 a,b 两个数字&#xff0c;都模m&#xff0c;当两个数字模m后余的数一样即为同余。 例子&#xff1a; a bq r (mod m)&#xff0c;这里的a 和 r 就是同余 &#xff…...

网络安全法

目录正文第一章第二章第三章第四章第五章第六章 法律责任第七章 附则正文 学习网络安全应该知道网络安全法 第一章 总则 第一条: 为了保障网络安全&#xff0c;维护网络空间主权和国家安全、社会公共利益&#xff0c;保护公民、法人和其他组织的合法权益&#xff0c;促进经济…...

django框架开发部署项目

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…...

Unity记录1.3-入门-第一阶段总结

文章首发及后续更新&#xff1a;https://mwhls.top/4447.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 汇总&#xff1a;Unity 记录 摘要&#xff1a;第一阶段的总…...

多智能体工程实践升级版:基于 Spring AI Alibaba 构建可扩展、高并发、生产级方案策划系统

多智能体工程实践升级版:基于 Spring AI Alibaba 构建可扩展、高并发、生产级方案策划系统 1. 引言 当业务问题从“问答”升级到“方案生成、任务拆解、跨角色协同、执行闭环”时,单一智能体往往很快碰到能力边界。 原因并不复杂: 单 Agent 擅长基于统一上下文做推理,但…...

08_Neo4j知识体系之企业级特性与高可用架构

08_Neo4j知识体系之企业级特性与高可用架构 体系 企业特性层&#xff1a;集群与高可用、安全与合规、备份恢复、监控运维、Neo4j Ops Manager关联能力&#xff1a;与关键业务系统、金融级稳定性、多环境治理、权限审计、灾备体系密切相关适用对象&#xff1a;企业架构师、DBA、…...

Android 13多屏适配避坑指南:从LocalDisplayAdapter到LogicalDisplayMapper的屏幕识别与映射实战

Android 13多屏适配实战&#xff1a;从硬件识别到逻辑映射的完整解决方案 折叠屏设备的普及和外接显示器的广泛应用&#xff0c;让Android开发者面临前所未有的多屏适配挑战。在Android 13中&#xff0c;系统对多屏幕的支持达到了新的高度&#xff0c;但同时也带来了更复杂的适…...

图像分类,图像识别,经典的基于深度学习模型vgg,resnet,Googlenet,alexnet等分类模型,实现图像的精准分类哦绘制roc曲线,混淆矩阵,精确度precision ,召回率reca

图像分类&#xff0c;图像识别&#xff0c;经典的基于深度学习模型vgg&#xff0c;resnet&#xff0c;Googlenet&#xff0c;alexnet等分类模型&#xff0c;实现图像的精准分类哦 绘制roc曲线&#xff0c;混淆矩阵&#xff0c;精确度precision &#xff0c;召回率recall&#x…...

RePKG:5个高效技巧助你掌握Wallpaper Engine资源处理与格式转换

RePKG&#xff1a;5个高效技巧助你掌握Wallpaper Engine资源处理与格式转换 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专注于Wallpaper Engine资源处理的开源工具&…...

告别B站资源无法保存的烦恼:BiliTools跨平台工具箱完整使用指南

告别B站资源无法保存的烦恼&#xff1a;BiliTools跨平台工具箱完整使用指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliToo…...

SecureCRT vs Putty:串口调试工具对比及实战操作指南

SecureCRT与PuTTY终极对决&#xff1a;嵌入式开发者的串口调试工具选型指南 在嵌入式开发领域&#xff0c;串口调试如同工程师的"听诊器"&#xff0c;而选择一款得心应手的终端工具往往能事半功倍。作为从业十年的嵌入式开发者&#xff0c;我几乎用过市面上所有主流串…...

工程师快速解决TVA检测系统常见故障的实操技巧

TVA系统在汽车零部件焊接点检测中需长期连续运行&#xff0c;适配高节拍生产场景&#xff0c;作为负责系统运维的工程师&#xff0c;快速排查与解决常见故障&#xff0c;是保障系统稳定运行的核心职责。在实际运维过程中&#xff0c;不少工程师因对故障原因判断不准确、排查方法…...

10类Visdron2019遥感小目标检测数据集该数据集为原始数据集,未经任何图像预处理操作数据集共计8629张图片,分别有对应的标签数据集已划分为训练集、验证集和测试集数据集包括txt格式、

10类Visdron2019遥感小目标检测数据集 该数据集为原始数据集&#xff0c;未经任何图像预处理操作 数据集共计8629张图片&#xff0c;分别有对应的标签 数据集已划分为训练集、验证集和测试集 数据集包括txt格式、xml格式、json格式 相关YOLOv5~YOLOv9模型可直接使用 相关Faster…...

费城“敬畏部”:AI 与艺术融合的新奇沉浸式体验

【导语&#xff1a;费城全新沉浸式艺术体验项目“敬畏部”&#xff0c;由多位艺术家打造&#xff0c;融合了 AI 技术。它以独特的方式让游客与艺术互动&#xff0c;探讨了个人数据存储等主题&#xff0c;为 AI 在艺术领域的应用提供了新视角。】“敬畏部”&#xff1a;费城的新…...