摘要: 指令合并主要合并相邻的,use-def 链上 相邻的指令。 讲多条可以合并的指令合并成一条指令,去除多余指令。 1, 常量折叠和计算。 a = 100; b = 100; c = a + b; d = f * c; > d = f * 200; 2,去除无效move指令 a = b; c = a; 阅读全文
posted @ 2024-07-11 14:16 zzas12345 阅读(0) 评论(0) 推荐(0) 编辑
摘要: 静态单赋值形式 每个遍历仅仅被赋值一次。 变量仅在单bb块内被多次赋值。重命名 a = 1; b = a; a = 2; d = a; > a1 = 1; b = a1; a2 = 2; d = a2; 变量块跨bb块被多次赋值,插入phi节点,并重命名 B1 if (cond) B2 a = b; 阅读全文
posted @ 2024-07-10 18:01 zzas12345 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 从Function的entry-bb开始,遍历所有的后继bb块。如果无法访问的bb块,删除。 阅读全文
posted @ 2024-07-10 17:49 zzas12345 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 为什么需要自研编译后端。 从 dsl语言到 可执行文件,如果采用genc code和 llvm-IR 需要通过 gcc 和 llvm , 这两个编译太heavy了,很多优化pass并不需要。 从IR到二进制文件的经历的pass 流 1,去除不必要block。 rm dead code , rm de 阅读全文
posted @ 2024-07-10 17:46 zzas12345 阅读(3) 评论(0) 推荐(0) 编辑
摘要: https://godbolt.org/ 阅读全文
posted @ 2024-07-09 14:55 zzas12345 阅读(4) 评论(0) 推荐(0) 编辑
摘要: lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。 .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 declaration 阅读全文
posted @ 2024-02-18 11:20 zzas12345 阅读(50) 评论(0) 推荐(0) 编辑
摘要: push 和 pop 栈内的数据 pushx source 压栈 pushl %ecx # puts the 32-bit value of the ECX register on the stackpushw %cx # puts the 16-bit value of the CX regist 阅读全文
posted @ 2022-08-12 15:48 zzas12345 阅读(31) 评论(0) 推荐(0) 编辑
摘要: mov src , dst 只有确定的事物才能 从一个地方移动到另一个地方。通常mov子hi零可以 移动一个立即数单元到一个通用寄存器 移动一个立即数到内存 一个通用寄存器数据到另一个通用寄存器 一个段寄存器到一个通用寄存器 一个通用寄存器到控制流寄存器 一个控制流寄存器到一个通用寄存器 一个通用寄 阅读全文
posted @ 2022-08-12 14:42 zzas12345 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 原因,字符集不对。重新改字符集合,需要utf-8 字符集合 #cpuid.s Sample program to extract the processor Vendor ID.section .dataoutput:.ascii “The processor Vendor ID is ‘xxxxx 阅读全文
posted @ 2022-08-11 09:47 zzas12345 阅读(25) 评论(0) 推荐(0) 编辑
摘要: Barjan 算法和inline流程 图的一些基本概念: 关联(incident):点为边的端点; 邻接(adjacent):点与点关联同一条边,或边与边关联同一顶点; 子图:图G'的点和边都是图G的子集,则G'为G的子图; 道路:从点v到点u的路径; 简单道路:没有重复边的道路; 回路:起点与终点 阅读全文
posted @ 2022-04-22 16:43 zzas12345 阅读(27) 评论(0) 推荐(0) 编辑