Early if-conversion - 优化阅读笔记

Early if-conversion 用于对于没有很多可预测指令的乱序CPU。目标是消除可能误预测的条件分支。

来自分支两侧的指令都会被推测性地执行,并使用 cmov 指令选择结果。

// SSAIfConv 类在确定可能的情况下,对SSA形式的机器码执行if-conversion。该类不包含任何启发式方法;
// 外部代码应该用于确定何时进行 if-conversion 是个好主意。
//
// SSAIfConv 可以转换三角形和菱形:
//
//   三角形:    Head              菱形:    Head
//              | \                       /  \_
//              |  \                     /    |
//              |  [TF]BB              FBB    TBB
//              |  /                     \    /
//              | /                       \  /
//             Tail                       Tail
//
// 条件块TBB和/或FBB中的指令被插入到Head块中,Tail块中的phi指令被转换为select指令。

按支配树的后序遍历访问块。后序遍历允许在单次遍历中进行嵌套的if转换。tryConvertIf() 函数可能会擦除块,但仅擦除由头块支配的块。这使得在后序遍历迭代器仍然活动时更新支配树是安全的。

./BiShengKernel/build3/bin/llc -debugify-and-strip-all-safe < ./BiShengKernel/llvm/test/CodeGen/AArch64/arm64-early-ifcvt.ll -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 -stop-before=early-ifcvt -o 1.mir
./BiShengKernel/build3/bin/llc -debugify-and-strip-all-safe < ./BiShengKernel/llvm/test/CodeGen/AArch64/arm64-early-ifcvt.ll -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 -stop-after=early-ifcvt -o 2.mir./build3/bin/llc -run-pass=dot-machine-cfg 1.mir
dot .mm2.dot -T svg -o 1.mm2.dot.svg
./build3/bin/llc -run-pass=dot-machine-cfg 2.mir
dot .mm2.dot -T svg -o 2.mm2.dot.svg

在这里插入图片描述

; Function Attrs: nounwind ssp memory(read) uwtable
define i32 @mm2(ptr nocapture %p, i32 %n) #0 {
entry:br label %do.bodydo.body:                          ; preds = %do.cond, %entry...br i1 %cmp, label %do.cond, label %if.elseif.else:                          ; preds = %do.body...br label %do.conddo.cond:                          ; preds = %if.else, %do.body...br i1 %tobool, label %do.end, label %do.bodydo.end:                           ; preds = %do.cond%sub = sub nsw i32 %max.1, %min.1ret i32 %sub
}

最终效果:
在这里插入图片描述

类似C语言:

int32_t mm2(int32_t *p, int32_t n) {for(max=0,min=0; n != 0; n--) {p = p + 1;int32_t p0 = *p;if (p0 > max) {max = p0;} else {min = (p0 < min) ? p0 : min;}}return max - min;
}
// 转换为: 
int32_t mm2(int32_t *p, int32_t n) {for(max=0,min=0; n != 0; n--) {p = p + 1;int32_t p0 = *p;int32_t tmp = p0 < min ? p0 : min;max = p0 > max ? p0 : max;min = p0 > max ? min : tmp;}return max - min;
}

在 MIR 的表示:
在这里插入图片描述

几个重要的接口:

SSAIfConv::canConvertIf(..) {// ...TII->analyzeBranch(*Head, TBB, FBB, Cond); // llvm/lib/Target/AArch64/AArch64InstrInfo.cpp:266// ...if (!TII->canInsertSelect(*Head, Cond, PI.PHI->getOperand(0).getReg(),PI.TReg, PI.FReg, PI.CondCycles, PI.TCycles,PI.FCycles)) {}// canPredicateInstrs - 如果 MBB 中的所有指令都可以安全地作为谓词,则返回true。不考虑终结指令。/// 如果指令使用了在头基本块中定义的任何值,则将定义这些值的指令添加到InsertAfter中。//// 任何被破坏的寄存器单元都将添加到 ClobberedRegUnits 中。SSAIfConv::canPredicateInstrs(MachineBasicBlock *MBB);// canSpeculateInstrs - 如果MBB中的所有指令都可以安全地进行推测,则返回true。不考虑终结指令。// 如果指令使用了在头基本块中定义的任何值,则将定义这些值的指令添加到InsertAfter中。//// 任何被破坏的寄存器单元都将添加到 ClobberedRegUnits 中。SSAIfConv::canSpeculateInstrs(MachineBasicBlock *MBB);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘建筑类中级职称申报:是否能越过初级直接评审?

揭秘建筑类中级职称申报&#xff1a;是否能越过初级直接评审&#xff1f; 很多人想知道越过初级直接评审建筑类中级职称可以不&#xff1f; 关于越过初级职称/助理工程师直接申报建筑类中级职称&#xff0c;原则上是不行的&#xff0c;实际上分情况而定。如果你有二级建造师也…

前端页面兼容pc和手机端设置,等比例缩小

html页面 <meta name"viewport" content"widthdevice-width, initial-scale0, user-scalableyes,shrink-to-fitno">vue 在public里面的index.html里面设置 <meta name"viewport" content"widthdevice-width,initial-scale1.0,use…

【数据结构和算法】-贪心算法

贪心算法&#xff08;又称贪婪算法&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤为有效&#xff0c;它通过将问题分解为一系列…

使用SpringBoot实现定时任务

在Spring Boot中实现定时任务非常简单&#xff0c;主要通过使用Scheduled注解。Spring Boot的Scheduled注解提供了一种简单的、声明式的方式来定义定时任务。这些任务可以按照指定的时间间隔执行&#xff0c;无需手动管理线程或定时器。下面是如何使用Spring Boot来实现定时任务…

linux ,Windows部署

Linux部署 准备好虚拟机 连接好查看版本&#xff1a;java -version安装jdk 解压命令&#xff1a;tar -zxvf 加jdk的压缩文件名cd /etc 在编辑vim profile文件 在最底下写入&#xff1a; export JAVA_HOME/root/soft/jdk1.8.0_151&#xff08;跟自己的jdk保持一致&#xff0…

python 之pymongo的CURD

文章目录 pymongo的基本操作前言新增1、新增一条记录2、新增多条记录3、自定义_id 的新增 更新1、更新一条记录2、更新多条记录 删除删除一条记录删除多条记录 查询条件查询根据运算符查询根据范围查找根据正则表达式查询投影排序分页查询 管道聚合 pymongo的基本操作 前言 前…

SpringSecurity 快速入门

文章目录 1. 认证授权概述1.1 认证授权概念1.1.1 认证1.1.2 授权 1.2 权限数据模型1.3 RBAC权限模型1.3.1 介绍1.3.2 基于角色访问控制1.3.3 基于资源访问控制 1.4 常见认证方式1.4.1 Cookie-Session1.4.2 jwt令牌无状态认证 1.5 技术实现 2. SpringSecurity入门2.1 介绍2.2 入…

突破编程_C++_设计模式(迭代模式)

1 迭代模式的基本概念 在 C 中&#xff0c;迭代模式是一种常见的设计模式&#xff0c;它用于遍历或处理集合中的元素。迭代模式允许程序员在不了解集合内部表示的情况下&#xff0c;以一种统一和一致的方式来访问集合中的元素。这种模式的核心是迭代器对象&#xff0c;它封装了…

「CISP题库精讲」CISP题库习题解析精讲20道

前言 本篇主要对CISP教材第九章《计算环境安全》的一些习题进行讲解&#xff0c;包括20道题&#xff0c;这里只是部分习题&#xff0c;针对第九章可能会多写几章的内容&#xff0c;如果我发布的这些习题里面没有你想找的那道题&#xff0c;你也可以直接私信我&#xff0c;我加…

「连载」边缘计算(二十九)03-11:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; EdgeCore之matamanager 前面对EdgeCore组件的edged、devicetwin、edgehub、eventbus功能模块进行了分析&#xff0c;本节对EdgeCore组件的另一个功能模块metamanager进行剖析。metamanager作为EdgeCore中的edged模块与edgehub模块进行交互的桥…

求根节点到叶节点数字之和

题目链接 求根节点到叶节点数字之和 题目描述 注意点 树中节点的数目在范围 [1, 1000] 内0 < Node.val < 9树的深度不超过10 解答思路 深度优先遍历计算从根节点到叶子节点组成的所有数字&#xff08;每向下一层乘以10&#xff09;&#xff0c;再计算所有的数字之和…

中小型生产企业工业数据采集分析平台 规划生产流程

工业数据采集分析平台是一款优秀的工控自动化软件&#xff0c;可以用于数据采集、实时监测和过程控制、数据传输、系统联动、远程监控等多种应用&#xff0c;数据采集平台通过对设备运行状态及相关参数监视实现保证每个环节都能按照既定方案进行&#xff0c;同时缩短非正常停机…

shiro整合thymeleaf(接上一篇抛出的问题)

在上一篇末尾&#xff0c;讲到如何实现不同身份的用户&#xff0c;有不同的权限&#xff0c;从而看到不同的页面&#xff0c;下面我们就来实现下这个功能 1.导入依赖 <!--shiro整合thymeleaf--><dependency><groupId>com.github.theborakompanioni</group…

python(ogr)处理geojson为本地shp文件

前言 本次所利用的geojson数据来自https://geo.datav.aliyun.com/areas_v3/bound/410000_full.json &#xff0c;如果觉得下方代码看起来不方便&#xff0c;可以来GitHub上来看&#xff0c;在这上面还有一些辅助内容便于理解 GISpjd/GIS-union-Python (github.com)https://gi…

14.WEB渗透测试--Kali Linux(二)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;13.WEB渗透测试--Kali Linux&#xff08;一&#xff09;-CSDN博客 netcat简介内容:13.WE…

精品基于Springboot的体育用品租赁租用管理系统的设计与实现

《[含文档PPT源码等]精品基于Springboot的体育用品管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&…

c# DbHelper的封装

c# DbHelper的封装 基于ADO.NET框架&#xff0c;封装了适用于多个关系型数据库的DbHelper。通过简洁明了的代码&#xff0c;实现了对各种数据库的高效操作。 public class DbHelper{private readonly DataBase _dataBase;public DbHelper(DataBase dataBase){_dataBase data…

SpringCloud-实现基于RabbitMQ的消息队列

消息队列是现代分布式系统中常用的通信机制&#xff0c;用于在不同的服务之间传递消息。在Spring Cloud框架中&#xff0c;我们可以利用RabbitMQ实现强大而可靠的消息队列系统。本篇博客将详细介绍如何在Spring Cloud项目中集成RabbitMQ&#xff0c;并创建一个简单的消息队列。…

【Kotlin】类和对象

1 前言 Kotlin 是面向对象编程语言&#xff0c;与 Java 语言类似&#xff0c;都有类、对象、属性、构造函数、成员函数&#xff0c;都有封装、继承、多态三大特性&#xff0c;不同点如下。 Java 有静态&#xff08;static&#xff09;代码块&#xff0c;Kotlin 没有&#xff1…

Spring AOP常见面试题

目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API&#xff0c;通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…