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

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 v12copy v9 to v13。消除Copy指令的操作会遍历所有IR,迭代找到Copy指令的最终引用,将其替换到合适的位置。

下列v14 = Add64 v12 v13,引用参数v12v13会分别替换为其指令的参数v22v9。而v12v13这两条指令如果在其他地方都没有引用,它将变成死代码,会在后续的死代码删除优化(以后会写文章来讲解)中将其消除。

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摘选&#xff0c;对于Golang SSA IR的介绍我写了文章&#xff0c;但是在犹豫要不要发。 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对象流&#xff1a; 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用起来&#xff0c;准备发几个教程&#xff0c;把Mapbox再熟悉熟悉。工作中也用过不少的Web GIS组件&#xff0c;在这里说一下我对这些WebGIS组件的印象。 Leaflet 代码简洁&#xff0c;插件丰富&#xff0c;相比于其大小&#xff0c;功能也挺强大&#…...

看AI赋能数智化 | Gooxi AI服务器闪耀CITE 2024

4月9日“中国电子信息博览会暨2024 AI算力产业大会”在深圳如期开展&#xff0c;Gooxi携最新产品、行业应用全栈解决方案出席盛会&#xff0c;全面展示Gooxi回应数智新时代下机遇与挑战的丰富AI创新实践成果。 All in AI&#xff0c;奔赴新质生产力 作为中国领先的服务器解决…...

大话设计模式——21.中介者模式(Mediator Pattern)

简介 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互 UML图 应用场景 大量的连接使得一个对象不可能在没有其他对象的支持下工作&#xff0c;系统表现为一个不可分割的…...

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 脚本的开头&#xff0c;指定了要使用的解释器&#xff0c;即 Bash。 if [ $# -eq 0 ]; thenif [ $# -eq 0 ]; then: 检查脚本是否被调用时提供了参数。$# 表示参数的数量&#xff0c;-eq 0 表示等于 0&#xff0c;即无参数。 echo "p…...

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…...

Ceph学习 -8.认证管理-用户基础

文章目录 1.用户基础1.1 基础知识1.2 简单实践1.3 小结 1.用户基础 学习目标&#xff1a;这一节&#xff0c;我们从基础知识、简单实践、小结三个方面来学习。 1.1 基础知识 简介 Ceph集群管理员能够直接在Ceph集群中创建、更新和删除用户 注意&#xff1a;创建用户时&#x…...

大创项目推荐 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;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中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的…...

智能网络新纪元:机器学习赋能未来计算机网络高速发展

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…...

大数据之kafka应用

大数据之kafka应用 2024启kafkakafka常见命令生产上重放信息jmxjmx的配置和开启jmx的使用jmx例子一 jmx例子二jmx例子三jmx例子四&#xff08;special&#xff09; 2024启kafka kafka常见命令 指定jmx端口启动kafka lsof -i :9999 JMX_PORT9999 /opt/kafka_2.12-3.1.0/bin/kaf…...

嵌入式操作教程_数字信号处理_音频编解码:3-6 AAC音频解码实验

一、实验目的 了解AAC音频格式&#xff0c;掌握AAC音频解码的原理&#xff0c;并实现将AAC格式的音频解码为PCM 二、实验原理 音频编解码的主要对象是音乐和语音&#xff0c;音频的编解码格式可分为无压缩的格式、无损压缩格式、有损音乐压缩格式、有损语音压缩格式和合成算…...

【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 冯诺依曼体系结构操作系统如何理解管理操作系统概念设计操作系统目的系统调用和库函数概念 进程基本概念描…...

word转pdf(前后端最全保姆级别)

word转pdf vue2java 文章目录 word转pdf vue2java一、前端 vue-pdf1、下载依赖2、封装的组件 二、java使用aspose&#xff08;付费&#xff09;1.引入库2.封装的工具类3、付费密钥文件 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、前端 vue…...

深度学习简介

深度学习简介 一、引言&#xff1a;深度学习的兴起 简短介绍深度学习的历史背景 深度学习&#xff0c;作为人工智能领域的一颗冉冉升起的新星&#xff0c;其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为&#xff0c;是最早期的尝试之一。然而&#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文件&#xff0c;并在其中创建spring.factories&#xff0c;配置相关的信息…...

基于圣女司幼幽-造相Z-Turbo的Java面试题智能生成与解析实战

基于圣女司幼幽-造相Z-Turbo的Java面试题智能生成与解析实战 最近在帮团队招聘Java工程师&#xff0c;一个很深的感触是&#xff1a;准备面试题太费劲了。不同岗位&#xff08;比如后端开发和大数据开发&#xff09;需要的技术栈侧重点完全不同&#xff0c;网上找的题目要么太…...

数据集成工具深度评测:SeaTunnel 与 DataX、Sqoop、Flume、Flink CDC 在实时场景下的性能较量

1. 实时数据集成工具选型的关键指标 在数据驱动的时代&#xff0c;企业每天需要处理海量实时数据流。选择合适的数据集成工具直接影响业务系统的响应速度和决策效率。我经历过多次数据同步工具选型的痛苦过程&#xff0c;总结出实时场景下最关键的5个评估维度&#xff1a; 首先…...

CLIP-GmP-ViT-L-14图文匹配工具部署教程:Ubuntu 22.04 + Python 3.10 完整环境配置

CLIP-GmP-ViT-L-14图文匹配工具部署教程&#xff1a;Ubuntu 22.04 Python 3.10 完整环境配置 你是不是经常好奇&#xff0c;一张图片到底和哪段文字描述最匹配&#xff1f;比如&#xff0c;你拍了一张自家宠物的照片&#xff0c;想知道AI会觉得它更像“一只可爱的猫”还是“一…...

dll修复工具绿色版免安装,2026年最新版实测与风险提示

正急着用电脑&#xff0c;突然弹窗“缺少dll文件”&#xff0c;游戏或软件打不开。第一反应就是赶紧找个工具修好它&#xff0c;但又不想在电脑上装一堆乱七八糟的软件&#xff0c;就想找个绿色版、免安装的&#xff0c;用完就能删&#xff0c;不留痕迹。但网上这种小工具满天飞…...

如何实现百度网盘下载加速?KinhDown让大文件传输效率倍增

如何实现百度网盘下载加速&#xff1f;KinhDown让大文件传输效率倍增 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在忍受百度网盘的龟速下载吗&#xff1f;当你急需工作文件却被限制在几十KB/s的速度时&#xff0c;当重…...

FRCRN开源模型部署指南:国产昇腾Ascend 910B适配与性能实测

FRCRN开源模型部署指南&#xff1a;国产昇腾Ascend 910B适配与性能实测 1. 项目概述与背景 FRCRN&#xff08;Frequency-Recurrent Convolutional Recurrent Network&#xff09;是阿里巴巴达摩院在ModelScope社区开源的单通道语音降噪模型&#xff0c;专门针对16kHz采样率的…...

手把手教你配置Davinci NvM Block:从Fee关联到Dataset索引的保姆级避坑指南

手把手教你配置Davinci NvM Block&#xff1a;从Fee关联到Dataset索引的保姆级避坑指南 在汽车电子软件开发中&#xff0c;非易失性存储管理&#xff08;NvM&#xff09;是确保关键数据持久化的核心模块。Davinci配置工具作为AUTOSAR开发环境的重要组成部分&#xff0c;其NvM B…...

MusePublic部署案例:离线环境无网络部署与本地模型缓存策略

MusePublic部署案例&#xff1a;离线环境无网络部署与本地模型缓存策略 1. 项目概述 MusePublic是一款专为艺术感时尚人像创作设计的轻量化文本生成图像系统。这个项目基于专属大模型构建&#xff0c;采用安全高效的safetensors格式封装&#xff0c;特别针对艺术人像的优雅姿…...

Pi0 Web演示服务监控:Prometheus+Grafana指标采集与告警配置

Pi0 Web演示服务监控&#xff1a;PrometheusGrafana指标采集与告警配置 1. 项目概述与监控需求 Pi0作为一个先进的视觉-语言-动作流机器人控制模型&#xff0c;其Web演示服务的稳定运行对于用户体验和开发测试至关重要。在生产环境中&#xff0c;我们需要实时掌握服务的运行状…...

AI赋能无障碍:CYBER-VISION在智能导盲场景中的落地实践

AI赋能无障碍&#xff1a;CYBER-VISION在智能导盲场景中的落地实践 1. 引言&#xff1a;当科技照亮黑暗 想象一下&#xff0c;当你闭上眼睛走在繁忙的街道上&#xff0c;周围是川流不息的人群和车辆。对于全球2.85亿视障人士来说&#xff0c;这不仅是想象&#xff0c;而是每天…...