控制流分析之循环

2023-10-29

最近做科研碰到了如何识别程序热对象的问题,解决这个问题的一般思路是做静态分析,主要是分支概率和基本块频率的分析。目前,LLVM 里已经添加了这两种分析。然而,直接看相关的代码效率很低,主要原因是缺乏控制流分析方面的基础,导致代码中出现的许多术语无法理解。这些术语大多和 CFG 中的循环有关,因此这篇文章主要介绍这方面的基础知识,方便以后复习。

循环

众所周知,程序运行的大部分时间都花费在循环上了。因此,在做代码优化时,针对循环的优化收益可能相当高。一般来说,主要存在两种类型的循环优化方法:第一类,把循环不变式的计算移到循环外部;第二类,消除额外的归纳变量(induction variable),也就是与循环索引成线性关系的变量。当然,也有一些其他的常见循环优化,比如把某些乘法计算替换成等价的加法运算,从而减少计算代价。

下述例子展示了循环不变量代码外移的过程:

	FOR index := 1 TO 10000 DO	          t := y * z
	BEGIN				                  FOR index := 1 TO 10000 DO
		x := y * z ;		              BEGIN
		j := index * 3 ;          -->		  x := t
	END					                      j := index * 3
	.				                      END

在这个例子里,循环的每次迭代都会导致 y * z 的重新计算。如果检测后发现在循环中 y、z 和 x 的值都不改变,那么事先计算好 y 和 z 的乘积 t,并用 t 替换循环中的 y * z 计算,这样做会更有效率(x可以直接消除掉)。

要说明的是,上述示例也可以同时进行其他优化。例如,可以做乘法强度削减的优化,也可以做归纳变量消除的优化。

定义循环

由于不是所有循环都可以做优化,那么为了找出适合做优化的循环,需要先给出循环的定义。虽然控制流图里出现的环都可以称作循环(loop),但为了方便优化,还需要给循环加上第二条性质,即:循环必须有

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制流分析之循环 的相关文章

  • 【编译原理与技术】递归下降语法分析器(C++实现)

    目录 内容 示例 具体实现 C 代码 运行结果 内容 实现以下语法的递归下降分析 示例 对于以下代码给出其递归下降语法分析过程 i 2 while i lt 100 sum sum i i i 2 具体实现 首先对上下文无关文法进行检查 消
  • Flex&Bison 简单入门

    Flex Bison 简单入门 Ref flex与bison 中文版 1 Flex Bison安装 安装flex sudo apt install flex 安装bison sudo apt install bison 安装gcc 若缺少
  • LLVM里的寄存器分配 - 线性扫描算法(二)

    1 背景介绍 在上一篇博文 LLVM 里的寄存器分配 准备工作 一 里 我主要整理了 LLVM 在做寄存器分配前所做的准备工作 介绍了 LLVM 是在怎样的 MIR 上做的寄存器分配 接下来 就需要讲讲 LLVM 是如何做寄存器分配了 虽然
  • 编译原理 --- NFA(非确定有限自动机)和DFA(确定有限自动机)之间的转换以及DFA的化简

    第一部分 证明NFA能够转换为DFA 1 So是NFA的初态集合 F是NFA的终态集合 2 通过上面的第一个转换 我们就使得NFA具有了和DFA一样的唯一初态 3 通过上面的第二个转换 不断引入中间状态 直到将字拆分为字符 此时我们就成功的
  • 【编译原理】- 递归下降的语法分析器的实现

    目录 一 实验题目 二 分析与设计 三 源代码 一 实验题目 编写识别由下列文法G E 所定义的表达式的递归下降语法分析器 E E T E T T T T F T F F F E i 输入 含有十进制数或十六进制数的表达式 如 75 1ah
  • gcc常用选项及常见的文件格式,扩展名

    gcc常用选项 编译过程 预处理 编译 汇编 链接 gcc的选项 必须分开给出 x 语言名 指出后面文件的语言 c 编译 汇编源文件 生成目标文件 S 编译不汇编 生成汇编文件 E 预处理 输出送到标准输出 o 指定输出的文件名 pipe
  • 移入——归约技术

    归约 定义 我们可以将自底向上语法分析过程看成是建一个串w 归约 慰问发开始符号的过程 在归约中 一个与某产生式体相匹配的特定子串被替换为该产生式的头部的非终结符号 定义理解起来比较晦涩 我们来看个例子就知道了 已知有文法 E gt E T
  • LLVM IR / LLVM指令集入门

    本文基于LLVM 12官方文档的LLVM Language Reference Manual 以学习笔记为主 所以本文会摘录一些常见 常用的指令 对于一些更加深层次的指令属性 特性 待我对LLVM有更深的理解再单独写文章记录 1 LLVM
  • 编译原理基础知识+笔记(1)

    一 编译原理概述 1 翻译程序 把某一种语言程序 称为源语言程序 等价地转换成另一种语言程序 称为目标语言程序 的程序 2 编译程序 把某一种高级语言程序等价地转换成另一种低级语言程序 如汇编语言或机器语言程序 的程序 又分为 诊断编译程序
  • 递归和循环的区别

    针对需要重复地多次计算相同的问题 通常可以选择递归或者循环两种不同的方法 递归是在一个函数的内部调用这个函数本身 循环是通过设置计算的初始值及终止条件 在一个范围内重复计算 我们以计算1 2 3 n为例 我们可以采用递归和循环两种方式求出结
  • 解析目标文件

    最近在看 程序员的自我修养 颇有体会 故化繁为简 整理书中部分内容 作为学习笔记 PC平台上流行的可执行文件格式主要是windows下的PE Portable Executable 和Linux下的ELF Executable Linkab
  • 【Rust】003-基础语法:流程控制

    Rust 003 基础语法 流程控制 文章目录 Rust 003 基础语法 流程控制 一 概述 二 if 表达式 1 语法格式 2 多个 3 获取表达式的值 三 循环 1 loop 无限循环 可跳出 无限循环 跳出循环 返回值 2 whil
  • 编译原理实验二:Bison

    编译原理实验二 Bison 实验要求 1 了解Bision基础知识 如何将文法产生式转换为Bison语句 2 阅读 src common SyntaxTree c 对应头文件 include SyntaxTree h 理解分析树生成的过程
  • 编译原理绪论

    1 美图 5 编译过程一语法分析 任务 在词法分析的基础上 根据语言的语法规则把单词符号串分解成各类语法单位 语法范畴 依循的原则 语法规则 描述工具 上下文无关文法 6 编译过程一中间代码产生 任务 对各类不同语法范畴按语言的语义进行初步
  • 7-3 打印沙漏

    7 3 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状 例如给定17个 要求按下列格式打印 所谓 沙漏形状 是指每行输出奇数个符号 各行符号中心对齐 相邻两行符号数差2 符号数先从大到小顺序递减到1 再从小到大顺序递增 首尾符号数
  • 编译原理-总概

    语言执行过程 代码 解释器编译器 机器代码 cpu执行 编译型语言 在程序在执行之前需要一个专门的编译过程 通过编译器把程序编译成为可执行文件 再由机器运行这个文件 运行时不需要重新翻译 直接使用编译的结果就行了 解释型语言 是一边执行一边
  • 正规表达式与有限自动机

    1 美图 2 概念 3 正规式和正规集 正规集可以用正规表达式 简称正规式 表示 正规表达式是表示正规集一种方法 一个字集合是正规集当且仅当它能用正规式表示 3 1 正规式和正规集的递归定义 4 确定有限自动机 DFA
  • 语义分析- 符号表

    符号表 1 用来存储程序中的变量相关信息 类型 作用域 访问控制信息 2 必须非常高效 程序中的变量规模会很大 符号表的接口 ifndef TABLE H define TABLE H typedef Table t 数据结构 新建一个符号
  • Compiler- 自增运算

    我们来看一下C语言中的前自增 i 和后自增 i 这个经典案例 大家在学习C的时候肯定学过前自增是先自增 然后将结果用于计算 后自增是先参与计算 再增加 好 看一下这段代码的结果 include
  • 【编译原理】 CS143 斯坦福大学公开课 第一周:简介

    youtube 1 1 Introduction to Compilers and interpreters 1 1 Introduction to Compilers and interpreters 编译器解释器介绍 两种主要的实现编程

随机推荐

  • UWP和WPF比较

    UWP Universal Windows Platform 开发流程通常包括以下步骤 准备开发环境 安装Visual Studio 使用最新版本的Visual Studio来进行UWP开发 安装Windows 10 确保你的开发机器上安装
  • 面试题创作0008,请说明当系统中的主CPU的MMU单元,与设备中的MMU单元共用内存时,两个CPU地址总线与内存的链接方式。

    请说明当系统中的主CPU的MMU单元 与设备中的MMU单元共用内存时 两个CPU地址总线与内存的链接方式 这对软件编程的影响是什么呢 比如如何做到互知内存的分配情况 避免两个CPU打架的机制
  • 解决“keil无法找到相应文件的错误”方法

    今天来分享一下之前遇到的一个关于Keil使用过程中的一个BUG 不知道大家有没有听说过keil工程中的文件包含路劲是不能太深的 如果没有听说过 使用过程中可能会遇到这个错误 其错误提示为 xx x error A1023E File Lib
  • 使用C++开发游戏的技巧

    引言 C 是一种广泛使用的编程语言 因其高效性能和灵活性而受到许多游戏开发者的青睐 本文将探讨使用C 开发游戏的一些技巧 帮助您更有效地实现游戏设计的目标 一 选择适合的游戏引擎 选择一个合适的游戏引擎是开发游戏的关键 目前市场上有许多优秀
  • Python数据分析与应用_从数据获取到可视化题库及答案

    第1章习题 填空题 的目的在于将隐藏在一大批看似杂乱无章的数据信息集中提炼出来有用的数据 中包含了conda Python在内的超过180个科学包及其依赖项 Jupyter Notebook是一个支持 代码 数学方程 可视化和Markdow
  • Unity的C#编程教程_43_遍历数组

    1 Print Out All Elements Using For Loop 如何将数组和循环搭配起来 打印数组中的所有元素 我们可以使用 for 循环 using System Collections using System Coll
  • Endnote导入新的Styles[以Chinese Std GBT7714 (numeric)为例]

    1 进入Endnote官网 找到下载Style的地址 地址如下 Output Styles EndNote 需要下载的style包如图所示 2 下载我们需要的style包 把style包放到Endnote的安装路径下的指定文件夹位置即可 如
  • bss段,data段、text段、堆heap和栈stack

    bss段 data段 text段 堆heap和栈stack bss段 data段 text段 堆 heap 栈 stack 例子 在C的学习中 你总避免不了对各类数据的存储区域学习归纳总结 简单的总结 bss存全局和静态变量 data存全局
  • 全连接神经网络

    注 本文是关于北京邮电大学鲁鹏老师计算机视觉与深度学习课程全连接神经网络部分内容的笔记与一些个人理解 课程视频链接 全连接神经网络 全连接神经网络模型 两层全连接神经网络模型如下 f W 2 m
  • CLion 2020.3 亮点解析:具有root权限的运行和调试能力

    CLion是一款专为开发C及C 所设计的跨平台IDE 它是以IntelliJ为基础设计的 包含了许多智能功能来提高开发人员的生产力 这种强大的IDE帮助开发人员在Linux OS X和Windows上来开发C C 同时它还使用智能编辑器来提
  • 【VMware Workstation Pro 16】安装【Deepin-15.11】

    我的电脑配置 VMware Workstation Pro 16的安装 VMware官网 下载完成后进行安装 目前我不太了解WIN10的Hyper V 勾选了安装WHP 默认勾选添加到系统变量 以防打不开 虚拟机的安装 Deepin官网下载
  • muduo net库学习笔记1——TCP网络编程的本质、 EchoServer类、EventLoop类的简化封装

    TCP网络编程最本质是处理三个半事件 1 连接建立 服务器accept接收连接 客户端发起连接 2 连接断开 主动断开 close shutdown 被动断开 read返回0 3 消息到达 文件描述符可读 4 消息发送完毕 这算半个 对于低
  • nvm,参数存储

    目录 NVM 简介 API说明 实现流程 table类型参数的写入和读取 示例 常见问题 相关资料以及购买链接 资料附上API链接 demo链接 NVM 简介 nvm 非易失性存储器 英语 non volatile memory 缩写为NV
  • 如何使用Java以编程方式在 Excel 中创建图表

    图表和图形用于汇总和直观地表示数据 它们提供了可进一步用于做出决策的洞察力 图表被认为是 Excel 电子表格的一个组成部分 广泛用于各种应用程序 在本文中 将学习如何根据 Excel 工作表中提供的数据以编程方式生成图表 特别是 本文介绍
  • 百度智能云,沈抖拿到第二个KPI

    作为最近几年帮助百度这所大船加速转向并有亮眼战绩的关键人物 沈抖的加入 不论对百度智能云 还是中国云计算市场 都是一个足够值得期待的变量 作者 葡萄 子雨 编辑 皮爷 出品 产业家 5月的第一个工作日 沈抖领到了他进入百度的第二个KPI 执
  • Uncaught DOMException: Failed to execute 'drawImage' on 'CanvasRenderingContext2D':

    问题 Uncaught DOMException Failed to execute drawImage on CanvasRenderingContext2D The HTMLImageElement provided is in the
  • Html表单--form标签

    表单用于收集用户的输入信息 HTML 表单表示文档中的一个区域 此区域包含交互控件 将用户收集到的信息发送到 Web 服务器 1 form标签 form标签用来定义一个表单
  • HTTP基础知识

    http属于TCP IP协议族的一个子集 http的作用 用来生成针对Wed服务器的HTTP请求报文 URI 标识互联网上的资源 URL 标识互联网资源的地址 URL URI 网址 的格式 http 登录信息 域名 端口号文件路径 查询字符
  • socket聊天

    CocoaAsyncSocket 系统提供的实现socket的库是
  • 控制流分析之循环

    最近做科研碰到了如何识别程序热对象的问题 解决这个问题的一般思路是做静态分析 主要是分支概率和基本块频率的分析 目前 LLVM 里已经添加了这两种分析 然而 直接看相关的代码效率很低 主要原因是缺乏控制流分析方面的基础 导致代码中出现的许多