GCC RISCV 后端 -- 控制流(Control Flow)的一些理解

C/C++源代码经过 GCC 解析(Parse)及转换后,通过 GIMPLE IR 予以表示(Representation)。其中,一个C/C++源文件,通过 宏处理后,形成一个 转译单元(Translation Unit),在 GCC 内部,通过下面结构予以表示:

Symbol Table

-- Global Variables

-- Call Graph

-- Functions

-- Control Flow Graph

-- Basic Blocks

-- instructions

-- defintions and uses

上述表达,可以清楚地看到程序的控制流走向。在最末端的指令层级(Instructions),GIMPLE IR 指令 或 RTL IR 指令,一般表达为三地址模式的操作(3 - Addresses operations),即

Op result, src0, src1

那么,对于不同的指令,抽象来看,都会有其 定义的值/变量(Definitions),以及有其 使用的值或变量(Uses),如上面的,result 为 其定义(defintion),src0, src1为其使用(use)。

在 GIMPLE IR 和 RTL IR 中,会通过 指令的编号来作为其使用(use)的引用。

那么,通过对指令的定义及使用的分析,逐步往上,扩展到 基础块(Basic Block),控制流图(Control Flow Graph)等,实现程序的数据流分析(Data-Flow Analysis)。

例如,将GIMPLE IR 转换成 SSA(Static Single Assignment)的模式,使得每个值对应唯一的变量,这样就简化了数据流的分析。然后,基于SSA,就可以实现 constant propagation 等优化。

又例如,Domination Tree 的构建,Live-variable 等。都是基于上述的框架,通过分析指令的定义与使用,得出数据流(Data-Flow / Value-Flow)的信息。

相关推荐
晴天的雨.99215 分钟前
【C++】继承篇
java·开发语言·c++
ö Constancy16 分钟前
一台电脑的硬件组成与作用:按功能分类详解(Windows 与 Linux 视角)
linux·windows·电脑
SomeOtherTime21 分钟前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
江湖有缘22 分钟前
基于Ubuntu部署SoduWork:企业级 AI 原生协同平台实战全流程
linux·人工智能·ubuntu·ai·soduwork
青少儿编程课堂24 分钟前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven25 分钟前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_4069810326 分钟前
c++ lamda(三)Lambda表达式
java·前端·c++
总要学点什么44 分钟前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
在所不辞兄1 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
无奈笑天下9 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器