Early if-conversion - 优化阅读笔记

news/2024/11/14 15:41:59/

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.ppmy.cn/news/1381983.html

相关文章

【Vue3 组合式 API - setup 选项详解】

文章目录 前言一、什么是 setup 选项&#xff1f;二、使用步骤1. 引入 Vue 和 setup 函数2. 编写逻辑3. 在模板中使用 三、与 Options API 对比 前言 setup 选项是 Vue 3 中最重要的部分之一&#xff0c;允许在组件中使用逻辑复用和组合&#xff0c;取代了 Vue 2.x 中的 Optio…

每日一题——LeetCode1678.设计Goal解析器

方法一 splice 将字符串转为数组&#xff0c;对数组进行遍历&#xff0c;碰到G保持不变&#xff0c;继续循环&#xff0c;碰到 ( 看他后一位&#xff0c;是 ) 则删除两个元素&#xff0c;添加一个 o &#xff0c;不是则删除四个元素&#xff0c;添加元素 al &#xff0c;最后将…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户&#xff0c;我们通常会选择CICD工具来减少人力投入产生的成本&#xff0c;开源的工具比如有成熟的Jenkins&#xff0c;但是本文讲的是阿里云提高的解决方案云效平台&#xff0c;通过配置流水线的形式实现项目的快速部署到服务器…

数据结构:红黑树的模拟实现

目录 1、什么是红黑树&#xff1f; 2、红黑树的相关操作与实现 1、节点定义 2、查找操作 3、插入操作 1、cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;cur存在且为红 2、cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u不存在/u存在且为黑 4、判断…

带你摸透C语言相关内存函数

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

vue,pinia中store赋值,推荐使用computed,能做到响应,直接解构赋值做不到,备忘

官网解读 https://pinia.vuejs.org/zh/core-concepts/ 在这段Vue3 <script setup> 语法的代码中&#xff0c;有两个关于如何从 useCounterStore 返回的store对象中获取状态属性的方式进行了对比。 <script setup> import { useCounterStore } from /stores/count…

力扣-[700. 二叉搜索树中的搜索]

递归法 确定递归函数的参数和返回值 递归函数的参数传入的就是根节点和要搜索的数值&#xff0c;返回的就是以这个搜索数值所在的节点。 代码如下&#xff1a; public TreeNode searchBST(TreeNode root, int val) 确定终止条件 如果root为空&#xff0c;返回null&#xff0c…

xss.pwnfunction.com靶机 Warmups

通关要求弹出警告框alert(1337) 没有用户交互 不能使用外链接 在chrome中测试 Ma Spaghet! 通过分析代码我们可以看到它直接用innerHTML将接收的内容赋值 但是我们不能使用<script>标签因为&#xff1a;HTML 5 中指定不执行由 innerHTML 插入的 <script> 标签。 所…