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

电商网站开发文献综述莱芜最新钟点工招聘

电商网站开发文献综述,莱芜最新钟点工招聘,网站美工,html网站素材注#xff1a;该优化与全局子表达式消除刚好是相反的过程#xff0c;具体该不该做这个优化得看代价模型算出来的结果(有采样文件指导算得会更准确) 该优化过程将指令移动到后继基本块中#xff0c;以便它们不会在不需要其结果的路径上执行。 该优化过程并非旨在替代或完全…注该优化与全局子表达式消除刚好是相反的过程具体该不该做这个优化得看代价模型算出来的结果(有采样文件指导算得会更准确) 该优化过程将指令移动到后继基本块中以便它们不会在不需要其结果的路径上执行。 该优化过程并非旨在替代或完全替代 LLVM IR 级别的下沉优化。它仅设计用于下沉简单的结构这些结构在 lowering 和指令选择之前不会显现. 测试用例: grep machine-sink llvm/test/* -Rnw|grep X86|grep -v debug ./build4/bin/llvm-lit llvm/test/DebugInfo/MIR/X86/machinesink.mir -a ./build4/bin/llc -run-passdot-machine-cfg llvm/test/DebugInfo/MIR/X86/machinesink.mir dot .Process.dot -T svg -o Process.dot.svg dot .test2.dot -T svg -o test2.dot.svg dot .test3.dot -T svg -o test3.dot.svg./build4/bin/llc -mtriplex86_64-unknown-unknown -run-passmachine-sink -o - ./llvm/test/DebugInfo/MIR/X86/machinesink.mir dd ./build4/bin/llc -mtriplex86_64-unknown-unknown -run-passremoveredundantdebugvalues -o - ./llvm/test/DebugInfo/MIR/X86/machinesink.mir ddd效果: 几个重要的接口 bool MachineSinking::runOnMachineFunction(MachineFunction MF) {// 更新寄存器信息RegClassInfo.runOnMachineFunction(MF);// 遍历每个 BB, 寻找优化的场景for (auto MBB: MF)MadeChange | ProcessBlock(MBB);// 处理需要打破的临界边auto NewSucc Pair.first-SplitCriticalEdge(Pair.second, *this);void RegisterClassInfo::runOnMachineFunction(const MachineFunction mf) {// 1. 检查 CSR 数组的每个元素是否与之前分析的相同const MCPhysReg *CSR MRI.getCalleeSavedRegs();// 2. 如果有改变记录每一个 CSR 及它的别名for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); AI)CalleeSavedAliases[*AI] *I;// 3. 更新每个 CSRs 的分配优先级if (IgnoreCSRForAllocOrder.size() ! CSRHintsForAllocOrder.size() ||IgnoreCSRForAllocOrder ! CSRHintsForAllocOrder) {// 4. 获取寄存器的成本RegCosts TRI-getRegisterCosts(*MF);// 5. 更新保留寄存器const BitVector RR MF-getRegInfo().getReservedRegs();// 6. 更新寄存器压力unsigned NumPSets TRI-getNumRegPressureSets();// build4/lib/Target/X86/X86GenRegisterInfo.inc:11902// build4/lib/Target/AArch64/AArch64GenRegisterInfo.inc:103840 }bool MachineSinking::ProcessBlock(MachineBasicBlock MBB) {// 待优化BB需要有多个后继且不是死的基本块// 逆序遍历每条指令do {// 记录指令的 debug 信息// 执行琐碎的前向聚合, SRCDRC的拷贝指令的替换bool Joined PerformTrivialForwardCoalescing(MI, MBB);// 尝试下沉指令if (SinkInstruction(MI, SawStore, AllSuccessors))} while (!ProcessedBegin); }bool MachineSinking::SinkInstruction(MachineInstr MI, bool SawStore,AllSuccsCache AllSuccessors) {TII-shouldSink(MI); // X86 always trueMI.isSafeToMove(AA, SawStore); // MachineInstr.cpp:1259 !store !call !load !phi !inlineasm !positino ...MachineBasicBlock *SuccToSinkTo FindSuccToSinkTo(MI, ParentBlock, BreakPHIEdge, AllSuccessors);// 不要破坏隐式空指针检查。这是一种性能启发而非正确性所必需// 如果 MI 可能被隐式空指针检查优化用作内存操作则返回 trueSinkingPreventsImplicitNullCheck(...);// llvm/test/CodeGen/X86/implicit-null-check.ll// br i1 %c, label %is_null, label %not_null, !make.implicit !0// 这应该包括支持在当前块内下沉指令以缩短其寄存器活跃范围。我们经常将指令下沉到大块的顶部但最好在它们在块中第一次使用之前也将其下沉。但是此变换必须小心不要增加寄存器压力例如如果下沉 x y z但它杀死了 y 和 z那么会增加 y 和 z 的寄存器活跃范围而只会减小 x 的寄存器活跃范围MachineBasicBlock *SuccToSinkTo FindSuccToSinkTo(MI, ParentBlock, BreakPHIEdge, AllSuccessors);// 检查是否会引入僵尸寄存器if (SuccToSinkTo-isLiveIn(Reg))// 如果需要打破危险边界, // 或 会破坏 PHI 边界if (SuccToSinkTo-pred_size() 1) if (blockPrologueInterferes(SuccToSinkTo, InsertPos, MI, TRI, TII, MRI)) || if (BreakPHIEdge)// 延后打破危险边界就记录一下bool Status PostponeSplitCriticalEdge(MI, ParentBlock, SuccToSinkTo, BreakPHIEdge);// ToSplit.insert(std::make_pair(FromBB, ToBB));// 查找插入点, 跳过 phi和序幕指令SuccToSinkTo-SkipPHIsAndLabels(SuccToSinkTo-begin());// 收集需要一并下沉的debug指令DbgUsersToSink.push_back({DbgMI, SmallVectorunsigned, 2(1, MO.getReg())});// 下沉指令及其相关调试指令performSink(MI, *SuccToSinkTo, InsertPos, DbgUsersToSink);// 移动指令SuccToSinkTo.splice(InsertPos, ParentBlock, MI, MachineBasicBlock::iterator(MI));// 处理debug信息attemptDebugCopyProp(MI, *DbgMI, Reg)// 清除 kill 标记RegsToClearKillFlags.insert(MO.getReg()); }MachineBasicBlock * MachineSinking::FindSuccToSinkTo(MachineInstr MI, MachineBasicBlock *MBB,bool BreakPHIEdge,AllSuccsCache AllSuccessors) {// 检查要下沉的指令的每个操作数for (const MachineOperand MO : MI.operands()) {// 对于虚拟寄存器// 需要能安全移动if (!TII-isSafeToMoveRegClassDefs(MRI-getRegClass(Reg)))// llvm/lib/Target/X86/X86InstrInfo.cpp:7534// 否则我们应该查看所有的后继块并决定应该下沉到哪一个。如果我们有可靠的块频率信息frequency ! 0则将具有较小频率的后继块优先级更高否则优先考虑较小的循环深度for (MachineBasicBlock *SuccBlock :GetAllSortedSuccessors(MI, MBB, AllSuccessors)) {// 除了MBB的直接后继, 被 MBB 作为直接支配者的 DomTree 子节点也会被遍历/// AllUsesDominatedByBlock - 如果指定寄存器的所有使用都在指定块支配的块中发生则返回 true, 如果任何使用在定义块中则返回 false因为在使用之后移动定义是不合法的。if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB,BreakPHIEdge, LocalUse)) {}// 检查收益if (!isProfitableToSinkTo(Reg, MI, MBB, SuccToSinkTo, AllSuccessors))} }bool MachineSinking::isProfitableToSinkTo(Register Reg, MachineInstr MI,MachineBasicBlock *MBB,MachineBasicBlock *SuccToSinkTo,AllSuccsCache AllSuccessors) {// 1. 不 反向支配 Def BB!PDT-dominates(SuccToSinkTo, MBB)// 2. 循环嵌套更浅if (CI-getCycleDepth(MBB) CI-getCycleDepth(SuccToSinkTo))// 3. 寄存器压力不超限if (isRegisterPressureSetExceedLimit(MRI-getRegClass(Reg))) }遗留问题 与 llvm ir 中 sink 的区别split critical edge 具体是怎么做的 LLVM IR 中搜索到其他三个 Sink 相关的pass: # find llvm/lib/ -name *.cpp|grep sink -i llvm/lib/Transforms/Scalar/Sink.cpp llvm/lib/Transforms/Scalar/LoopSink.cpp llvm/lib/Transforms/Scalar/GVNSink.cpp llvm/lib/CodeGen/MachineSink.cpp
http://www.hkea.cn/news/14368449/

相关文章:

  • 2018建设工程管理招团支部网站佛山主题网站设计多少钱
  • 3d打印 东莞网站建设Wordpress development
  • 杭州自助建站模板项目名称
  • wordpress主题背景插件自动优化app
  • 做相亲网站的安全责任成都紧急通知
  • iapp网站怎么做软件wordpress 没关插件
  • 安卓网站客户端制作软件网络营销的特点是什么?
  • 在国内可以做国外的网站吗找公司的软件有哪些
  • 特效比漂亮的网站wordpress主题教程视频
  • 许昌企业网站建设公司长沙微信公众号
  • 淮安市建设局网站网站建设安全性
  • 建设网站多久到账青海省建设厅官方网站
  • 南宁有做校园门户网站的吗设计师培训感悟
  • 企业网站关键词应如何优化站长工具pr值查询
  • 官方网站怎么推广网站上面添加地图
  • 怎样设计网站建设灰色词seo排名
  • 数据共享网站建设房产信息网烟台
  • 网站定制重庆网站建设公司费用
  • 泉州市做网站云南省红河州蒙自建设局网站
  • 装修 设计 网站wordpress文章编辑代码
  • 建立网站要钱吗胖哥网站的建设目标
  • 无为县建设局网站手机之家
  • 响应式布局网站模板斗图在线制作生成器
  • 集团网站建设网络公司互利互通网站建设
  • 手机网站模板制作工具网站公司打电话来说做网站
  • 网站首页界面设计做外贸怎样上国外网站
  • 成都高端品牌网站建设全球设计网网址
  • 做网站公司需要帮客户承担广告法吗58同城最新招聘信息今天
  • 蒙阴县城乡建设局网站漯河北京网站建设
  • 做百度网站费用多少合适海盐县建设门户网站