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)的信息。

相关推荐
充值修改昵称1 小时前
数据结构基础:B树磁盘IO优化的数据结构艺术
数据结构·b树·python·算法
2501_944424121 小时前
Flutter for OpenHarmony游戏集合App实战之连连看路径连线
android·开发语言·前端·javascript·flutter·游戏·php
一个平凡而乐于分享的小比特1 小时前
Linux内核中的container_of宏详解
linux·container_of
C系语言1 小时前
python用pip生成requirements.txt
开发语言·python·pip
燃于AC之乐1 小时前
深入解剖STL Vector:从底层原理到核心接口的灵活运用
开发语言·c++·迭代器·stl·vector·源码分析·底层原理
程序员-King.7 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
lcreek7 小时前
Linux信号机制详解:阻塞信号集与未决信号集
linux·操作系统·系统编程
优雅的潮叭7 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计8 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
shandianchengzi8 小时前
【记录】Tailscale|部署 Tailscale 到 linux 主机或 Docker 上
linux·运维·docker·tailscale