Golang编译优化——消除Copy指令
一、优化概述
以下是Go编译器对某个代码段编译生成的SSA IR摘选,对于Golang SSA IR的介绍我写了文章,但是在犹豫要不要发。
b1:-...
Plain → b2 (5)b2: ← b1 b4-v9 (5) = Phi <int> v8 v16 (i[int])v22 (8) = Phi <int> v7 v14 (r[int])v10 (5) = Copy <int> v6 (n[int])v11 (+5) = Leq64 <bool> v9 v10
If v11 → b3 b5 (likely) (5)b3: ← b2-v12 (6) = Copy <int> v22 (r[int])v13 (6) = Copy <int> v9 (i[int])v14 (+6) = Add64 <int> v12 v13 (r[int])
Plain → b4 (6)
编译器在中间代码生成和优化阶段,不可避免的会生成一些非必要的指令,如上面b3块中的copy v22 to v12,copy v9 to v13。消除Copy指令的操作会遍历所有IR,迭代找到Copy指令的最终引用,将其替换到合适的位置。
下列v14 = Add64 v12 v13,引用参数v12和v13会分别替换为其指令的参数v22和v9。而v12和v13这两条指令如果在其他地方都没有引用,它将变成死代码,会在后续的死代码删除优化(以后会写文章来讲解)中将其消除。
v12 (6) = Copy <int> v22 (r[int])
v13 (6) = Copy <int> v9 (i[int])
v14 (+6) = Add64 <int> v12 v13 (r[int])Copy 指令消除后 ==>v12 (6) = Copy <int> v22 (r[int])
v13 (6) = Copy <int> v9 (i[int])
v14 (+6) = Add64 <int> v22 v9 (r[int])
二、具体实现
消除Copy指令的实现逻辑在src/cmd/compile/internal/ssa copyelim.go中,由三个函数来完成。
copySource(v *Value)函数,从Copy指令的参数迭代查找,直至找到第一个非Copy的操作,并将其返回。形如:
for w.Op == OpCopy {w = w.Args[0]
}
对于下列代码块,copySource(v2)返回v0。
v0 = Def...
v1 = Copy v0
v2 = Copy v1
v3 = Add64 v2 v0
Copy的引用链路可能会形成一个环,比如在一些特殊的情况下,会出现以下情况。这在迭代时就要考虑如何处理这种情况的发生,copySource函数采用了快慢指针来判断是否存在环。如果有环存在,说明这一系列操作是存在歧义的,copySource会将快慢指针的交汇点修改成Unknown,其也将会变成死代码。
v0 = Copy v2 // copy v1也是一个环
v1 = Copy v0
v2 = Copy v1
v3 = Add64 v2 v0
迭代一旦完成,copySource(v *Value)的参数v的指令参数将会被设置成Copy链的第一个非Copy指令值。如下列代码v2的引用参数v1变成了v0,剩下的v1如果在其它地方没有引用,将会变成死代码。
v0 = Def...
v1 = Copy v0
v2 = Copy v1 => v2 = Copy v0
v3 = Add64 v2 v0
copyelimValue(v *Value) 函数,这个函数确保指令v的所有参数都不是Copy指令。它遍历一个指令的所有参数,如果参数a是Copy,则调用copySource(a)找到Copy链第一个非Copy指令,并用其替换参数a。
v0 = Def...
v1 = Copy v0
v2 = Copy v1
v3 = Add64 v2 v0调用copyelimValue(v3)后 =>v0 = Def...
v1 = Copy v0
v2 = Copy v0
v3 = Add64 v0 v0
copyelim(f *Func)函数,它遍历函数中的每个基本块,然后遍历每个基本块中的每个值,并调用copyelimValue函数,该函数确保每个值的参数都不是Copy的结果。
相关文章:
Golang编译优化——消除Copy指令
一、优化概述 以下是Go编译器对某个代码段编译生成的SSA IR摘选,对于Golang SSA IR的介绍我写了文章,但是在犹豫要不要发。 b1:-... Plain → b2 (5)b2: ← b1 b4-v9 (5) Phi <int> v8 v16 (i[int])v22 (8) Phi <int> v7 v14 (r[int])v1…...
Java IO流对象流实操
ATM的io对象流: package com.jsu.atm; import com.jsu.atm.Serializable; public class Account implements Serializable{//私有数据成员private String UserName; // 用户名称private String PassWord; // 用户密码private double RemainMoney; // 用户余额…...
Mapbox教程:一个简单Demo
近期工作中准备把Mapbox用起来,准备发几个教程,把Mapbox再熟悉熟悉。工作中也用过不少的Web GIS组件,在这里说一下我对这些WebGIS组件的印象。 Leaflet 代码简洁,插件丰富,相比于其大小,功能也挺强大&#…...
看AI赋能数智化 | Gooxi AI服务器闪耀CITE 2024
4月9日“中国电子信息博览会暨2024 AI算力产业大会”在深圳如期开展,Gooxi携最新产品、行业应用全栈解决方案出席盛会,全面展示Gooxi回应数智新时代下机遇与挑战的丰富AI创新实践成果。 All in AI,奔赴新质生产力 作为中国领先的服务器解决…...
大话设计模式——21.中介者模式(Mediator Pattern)
简介 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互 UML图 应用场景 大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的…...
Linux 计算机网络
目录 一、网络协议 1、 "协议" 是一种约定 2、协议分层 二、网络模型 1、OSI七层模型 2、TCP/IP五层(或四层)模型 三、网络传输基本流程 四、数据包封装和分用 五、网络中的地址管理 六、网络编程套接字 1、理解源IP地址和目的IP地址 2、端口号 理解 &q…...
bash脚本中‘-b -u -p’‘$# -eq’‘#!/bin/bash’‘sed -i “s/\r//“ $1’的用法说明
#!/bin/bash#!/bin/bash: 这是 Bash 脚本的开头,指定了要使用的解释器,即 Bash。 if [ $# -eq 0 ]; thenif [ $# -eq 0 ]; then: 检查脚本是否被调用时提供了参数。$# 表示参数的数量,-eq 0 表示等于 0,即无参数。 echo "p…...
【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧
大家好,我是全栈小5,欢迎阅读小5的系列文章。 这是《人工智能》系列文章,每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…...
Ceph学习 -8.认证管理-用户基础
文章目录 1.用户基础1.1 基础知识1.2 简单实践1.3 小结 1.用户基础 学习目标:这一节,我们从基础知识、简单实践、小结三个方面来学习。 1.1 基础知识 简介 Ceph集群管理员能够直接在Ceph集群中创建、更新和删除用户 注意:创建用户时&#x…...
大创项目推荐 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别
文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数:2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…...
Python小工具提升工作效率【附完整版,可下载word】
1、多个ppt汇总成一个ppt的python代码实现: import win32com.client as win32 import os import re def find(s): pat = re.compile(r"\d+") result = pat.match(s) return int(result.group(0)) def join_ppt(path:str): """ :param path: ppt所…...
k8s-Pod
文章目录 k8s-Podpod 配置文件详解pod 生命周期pod 探针StartupProbeLivenessProbeReadinessProbe探针使用建议 初始化容器钩子函数 k8s-Pod pod 是k8s 中可以调度的最小单位 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的…...
智能网络新纪元:机器学习赋能未来计算机网络高速发展
🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…...
大数据之kafka应用
大数据之kafka应用 2024启kafkakafka常见命令生产上重放信息jmxjmx的配置和开启jmx的使用jmx例子一 jmx例子二jmx例子三jmx例子四(special) 2024启kafka kafka常见命令 指定jmx端口启动kafka lsof -i :9999 JMX_PORT9999 /opt/kafka_2.12-3.1.0/bin/kaf…...
嵌入式操作教程_数字信号处理_音频编解码:3-6 AAC音频解码实验
一、实验目的 了解AAC音频格式,掌握AAC音频解码的原理,并实现将AAC格式的音频解码为PCM 二、实验原理 音频编解码的主要对象是音乐和语音,音频的编解码格式可分为无压缩的格式、无损压缩格式、有损音乐压缩格式、有损语音压缩格式和合成算…...
【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!
🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 文章目录 冯诺依曼体系结构操作系统如何理解管理操作系统概念设计操作系统目的系统调用和库函数概念 进程基本概念描…...
word转pdf(前后端最全保姆级别)
word转pdf vue2java 文章目录 word转pdf vue2java一、前端 vue-pdf1、下载依赖2、封装的组件 二、java使用aspose(付费)1.引入库2.封装的工具类3、付费密钥文件 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、前端 vue…...
深度学习简介
深度学习简介 一、引言:深度学习的兴起 简短介绍深度学习的历史背景 深度学习,作为人工智能领域的一颗冉冉升起的新星,其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为,是最早期的尝试之一。然而&#x…...
深入探索:使用C++构建顶级性能的网络服务器
在数字化浪潮的推动下,网络服务器作为信息交互的核心枢纽,其性能与稳定性直接决定了互联网应用的服务质量和用户体验。C++,作为一种兼具高效性与灵活性的编程语言,已然成为构建高性能网络服务器的首选工具。本文旨在深入剖析C++在构建顶级性能网络服务器中的关键技术、最佳…...
SpringBoot学习笔记四
SpringBoot学习笔记四-监听机制 1. SpringBoot监听器1.1 无需配置1.1.1 CommandLineRunner使用1.1.2 ApplicationRunner的使用1.1.3 CommandLineRunner与ApplicationRunner的区别 1.2 需要创建META-INF文件,并在其中创建spring.factories,配置相关的信息…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
