← 完整学习路线

UNIT 70 / 78 · W11-2

先找反例,再讨论优化合法性

本单元预计 4 核心小时。可以分成多个学习时段,按完整小节推进;停下来时留下输入、命令、结果和下一步。

时间包含阅读、编码与检查,是学习预算而非期限。打开此页只保存阅读位置,不代表通过验收。

01 / READ

先知道自己在观察什么

优化首先要合法:别名、溢出与浮点重排 →

分别追踪别名、无符号回绕和浮点重排的前提,先问变换是否保持语义。

优化首先要合法:别名、溢出与浮点重排 →

查LLVM对操作与溢出标记的合同,不把C++直觉直接添加为IR承诺。

先备不清楚时,沿章节入口补读;不要依赖翻过页数判断进度。

02 / PREDICT & RUN

先留下自己的预测或独立尝试

先令两个指针指向同一整数,手算original=7与cached=4,再运行;两条路径不含故意UB。

别名使第二次读取改变 →
源码下载与编译入口

下载到自己的练习目录。按本节给出的完整命令编译;多文件与driver要求见原任务。需要时查阅文件保存与编译操作 →

46-a.cpp

先保存预测,再核对正文标明的预期或诊断。完整构建、多文件与设备实验按原任务命令执行。

把优化推演接到真实工具

先完成IR-45的实际IR读法,再执行Clang / LLVM IR 实验:保存自己的输入预测、命令、实际输出和链接失败解释。这属于本单元编码时间。

03 / CHANGE ONE THING

通过一个变动看清原因

在副本把初值改3、写入值改8,更新两个实现的预期并保留别名输入。

修改后应观察到什么

original=11、cached=6,缓存旧load仍是错误优化。

04 / DO IT YOURSELF

换一组条件,独立解决

为x+1>x写两个有界整数/无符号案例:普通小值与uint32_t最大值;再用自己的小函数IR说明哪些类型前提决定合法变换。

用这些条件检查自己的实现

  • 无符号普通值为真,最大值回绕后为假;不执行有符号溢出。
  • 记录别名相同/不同两种输入;‘某几个输入一样’不等于全域等价。
05 / EXPLAIN & CHECK

用证据决定是否进入下一单元

  1. 为什么不能无条件把第二次load换成第一次结果?
  2. nsw一类标记为什么是语义承诺而不是随意性能开关?

本单元的验收依据

至少两个独立反例与各自前提清楚;变换结论限定类型、别名及数值域。

留下自己的代码或推演、测试输入、真实输出和仍不确定的问题。未达到要求时,下一次继续本单元。