编译优化、IR 与代码生成(LLVM/GCC/寄存器分配)

共 72 题
#

1. RTL(Register Transfer Language)单指令与 insn 的 register allocator 语义?

A RTL 只描述控制流
B RTL 与寄存器分配无关
C RTL 的 insn 描述操作与约束,寄存器分配器据此映射虚拟寄存器到物理寄存器 ✓ 正确答案
D 寄存器分配在 RTL 之前完成
#

2. GCC 15 C23 标准的 stdc_bit_width 等 builtin 支持?

A C23 位操作函数不可移植
B GCC 15 提供 stdc_bit_width 等 C23 位操作内建函数(GCC 14 仅支持 _BitInt、stdckdint.h 等) ✓ 正确答案
C GCC 14 不支持 C23
D stdc_bit_width 只能手动实现
#

3. LLVM 18 的 PassBuilder 自定义 pipeline 注册接口?

A PassBuilder 只能构建默认管线
B PassBuilder 允许注册自定义 pass 并插入优化管线 ✓ 正确答案
C 自定义 pass 无法注入
D PassBuilder 与优化无关
#

4. AutoFDO 在 Linux kernel 5.x+ 通过 perf LBR 反馈的"自动"PGO 工程价值?

A AutoFDO 必须插桩编译
B AutoFDO 用 perf LBR 采样生成 profile,无需源码插桩 ✓ 正确答案
C AutoFDO 与硬件采样无关
D AutoFDO 只能用于用户态
#

5. PGO + ThinLTO 在 large codebase 的"C compile - train - C rebuild"流水线?

A PGO 不需要运行程序
B PGO 只需一次编译
C ThinLTO 与 PGO 无法结合
D PGO 分插桩编译、运行训练、读取 profile 重建三阶段 ✓ 正确答案
#

6. LTO 在编译时跨编译单元的函数内联与 dead code elimination 的工程价值?

A LTO 跨编译单元内联并做全局死代码消除 ✓ 正确答案
B LTO 只能优化单个文件
C LTO 无法删除死代码
D LTO 与内联无关
#

7. ThinLTO 相对 monolithic LTO 在并行化与 link time 优化的工程取舍?

A ThinLTO 通过并行模块优化换取更低链接开销,牺牲部分全局优化 ✓ 正确答案
B ThinLTO 合并全部 IR 全局优化
C monolithic LTO 更省内存
D ThinLTO 无法并行
#

8. LTO 在 debug symbols 与 DSO 的协同边界?

A LTO 需保留调试信息映射,且不跨 DSO 破坏 ABI ✓ 正确答案
B LTO 会丢弃所有调试信息
C LTO 可随意跨 DSO 内联
D LTO 与符号可见性无关
#

9. mold 链接器在 Chromium、Linux kernel 镜像的 5x-10x faster than ld.lld 的工程价值?

A mold 只支持小项目
B mold 比 ld.lld 更慢
C mold 通过并行与局部性优化,比 ld.lld 快 5-10 倍 ✓ 正确答案
D mold 与链接速度无关
#

10. lld(LLVM linker)相比 GNU ld.bfd 在 MSVC 链接的兼容性?

A lld 无法链接 Windows 程序
B lld 只支持 ELF
C GNU ld.bfd 支持 MSVC
D lld 的 COFF 后端兼容 MSVC 链接,支持 clang-cl 在 Windows 使用 ✓ 正确答案
#

11. mold in distributed linking(distributed thin LTO)的工程价值?

A mold 与分布式无关
B mold 只能单机链接
C 分布式链接会降低构建效率
D mold 支持分布式 ThinLTO,把各模块优化并行到多机 ✓ 正确答案
#

12. PIE(Position Independent Executable)相对 PIC 在 Linux ELF executable 的工程价值?

A PIE 让可执行文件支持 ASLR,随机化代码基址提升安全 ✓ 正确答案
B PIE 与 ASLR 无关
C PIE 只用于共享库
D PIE 会固定程序地址
#

13. LLVM-CFI(Control-Flow Integrity)通过 llvm.module_flag !cfi 在 call/jump 的 hash 检查?

A CFI 与类型无关
B CFI 不检查间接调用
C CFI 会增加任意跳转
D LLVM-CFI 通过类型 hash 校验间接调用目标,拦截控制流劫持 ✓ 正确答案
#

14. 图着色寄存器分配如何由活跃变量构造冲突图,溢出(spill)启发式如何选择代价最低的寄存器?

A 活跃区间相交的变量间连冲突边,溢出时优先选择冲突多、引用少的变量 ✓ 正确答案
B 冲突图与活跃区间无关
C 溢出选择任意变量
D 图着色不需要溢出
#

15. 控制流图(CFG)中支配关系与支配树如何计算,它为何是 SSA 构造与优化的基础?

A φ 函数不需要支配信息
B 支配关系与 SSA 无关
C 支配树只用于循环
D 支配树派生的支配边界决定 φ 函数放置,是 SSA 构造的基础 ✓ 正确答案
#

16. 全局寄存器分配相比局部分配为何能减少访存,调用约定中被调用者保存寄存器如何影响分配策略?

A 全局分配只在本块内工作
B 局部分配已能减少访存
C callee-saved 寄存器调用后自动保存
D 全局分配减少跨块访存,跨调用存活的变量优先用 callee-saved 寄存器 ✓ 正确答案
#

17. 线性扫描(linear scan)寄存器分配为何适合 JIT,live interval 与活动区间列表如何排序,相对图着色有多少精度损失?

A 线性扫描复杂度高
B 线性扫描比图着色更优
C 线性扫描只用于静态编译
D 线性扫描速度快、适合 JIT,但优化质量略低于图着色 ✓ 正确答案
#

18. LLVM TBAA(Type-Based Alias Analysis)通过 TBAA metadata 表达 access tag 与"may not alias"的工程价值?

A TBAA 需要完整指针分析
B TBAA 用类型标签判定访问不别名,解锁重排序优化 ✓ 正确答案
C TBAA 与类型无关
D TBAA 无法证明不别名
#

19. Andersen(基于约束、流不敏感)与 Steensgaard(基于等价、近线性)别名分析在精度与开销上有何权衡?它们如何影响后续优化的合法性?

A Steensgaard 复杂度更高
B Steensgaard 精度高于 Andersen
C 别名精度不影响优化
D Andersen 精度高但开销大,Steensgaard 快但保守 ✓ 正确答案
#

20. LLVM AA 在 restrict pointer(C99)的工程边界?

A LLVM 信任 restrict 的 noalias 承诺做优化,违反承诺是未定义行为 ✓ 正确答案
B restrict 与别名分析无关
C restrict 会阻止优化
D restrict 保证别名
#

21. GIMPLE 三地址码(tup)与 GENERIC AST 的 SSA 转换?

A GENERIC 是 AST,GIMPLE 是三地址码,GIMPLE 上做 SSA 转换 ✓ 正确答案
B GIMPLE 保留复杂表达式
C GENERIC 是三地址码
D SSA 转换在 GENERIC 上做
#

22. LLVM BasicAA 通过 alias() / mustalias / partialalias / noalias 的工程语义?

A BasicAA 与优化无关
B alias() 只返回是否别名
C MustAlias 表示不别名
D alias() 返回 NoAlias/MayAlias/PartialAlias/MustAlias,供优化决策 ✓ 正确答案
#

23. Steensgaard 的 union-find unified pointer analysis 在 LLVM AA 的工程价值?

A Steensgaard 精度最高
B Steensgaard 用 union-find 近线性开销做大规模别名分析 ✓ 正确答案
C Steensgaard 复杂度高
D union-find 与别名无关
#

24. 逃逸分析如何判断对象是否逃出方法/线程,从而支持栈上分配、标量替换与锁消除?

A 逃逸分析只用于锁
B 不逃逸的对象可栈上分配/标量替换,不跨线程可锁消除 ✓ 正确答案
C 逃逸对象可栈上分配
D 逃逸分析与优化无关
#

25. LTO 把多个翻译单元的 IR 合并做跨模块内联与去虚化,whole-program 编译相比单文件编译能解锁哪些优化?

A LTO 无法去虚化
B 单文件编译也能跨模块内联
C LTO 跨模块内联、去虚化与全局死代码消除 ✓ 正确答案
D LTO 只做局部优化
#

26. PGO 如何采集运行时 profile 并反馈给编译器?它在分支布局与内联决策上的典型收益来自哪里?

A PGO 与内联无关
B PGO 不采集运行数据
C PGO 只做布局
D PGO 用运行时 profile 指导分支布局与内联决策 ✓ 正确答案
#

27. ThinLTO 如何在跨模块优化能力与并行/增量编译开销之间取得平衡?

A ThinLTO 合并全部 IR 无法并行
B ThinLTO 用薄概要 + 按需导入 + 模块并行,兼顾跨模块优化与并行构建 ✓ 正确答案
C ThinLTO 不支持增量编译
D ThinLTO 牺牲所有跨模块优化
#

28. LLVM 18 新增 vector predication 的 fpieee 与 fmulla 指令 pass?

A LLVM 18 无新指令
B LLVM 18 不支持向量化
C 谓词向量只支持固定长度
D LLVM 18 增强向量谓词与 fma 融合等指令 pass ✓ 正确答案
#

29. MLIR 的 dialect 抽象,Tensor、MemRef、Linalg、Vector 等高层 dialect 如何组织?

A Tensor/MemRef/Linalg/Vector 是不同抽象层级的 dialect,通过 lowering 连接 ✓ 正确答案
B MLIR 只有单一 dialect
C Linalg 表示标量运算
D dialect 不可扩展
#

30. MLIR 在多面 IR 抽象的"逐步 lowering"工程价值?

A 逐步 lowering 在各级 IR 上分别做优化再降级,保留语义信息 ✓ 正确答案
B 逐步 lowering 一次跳到底层
C 高层优化没有意义
D MLIR 不支持多级 IR
#

31. GCC 14 GIMPLE 与 RTL 两层 IR 中间表示的工程边界?

A RTL 是机器无关的
B GIMPLE 做机器无关优化,RTL 做机器相关优化,expand 是转换边界 ✓ 正确答案
C GIMPLE 用于寄存器分配
D 两层的功能相同
#

32. UndefinedBehaviorSanitizer(UBSAN)的 signed overflow、null deref、shift overflow 检测工程价值?

A UBSAN 运行时检测 signed overflow、null deref、shift overflow 等 UB ✓ 正确答案
B UBSAN 只检测内存越界
C UB 不影响优化
D UBSAN 用于加密
#

33. Sanitizers 的 runtime crash 报告(__sanitizer_print_stack_trace)的工程价值?

A sanitizer 报告提供出错位置、栈回溯与错误模式,便于定位 ✓ 正确答案
B sanitizer 报告无栈信息
C 崩溃报告不能定位行号
D sanitizer 只打印一条错误码
#

34. Sanitizer fuzzer(libFuzzer)的 AFL 集成?

A AFL 不依赖覆盖率
B libFuzzer 与 AFL 不能集成
C libFuzzer 与 AFL 通过覆盖率反馈协同,提升模糊测试效率 ✓ 正确答案
D 集成只用于性能测试
#

35. GNU ld.bfd 在 stable ABI 路径(/usr/bin/ld)的 POSIX 强制遵循?

A /usr/bin/ld 作为稳定 ABI 路径,ld.bfd 遵循 POSIX 保证构建兼容 ✓ 正确答案
B ld.bfd 是最新最快的链接器
C /usr/bin/ld 不需要稳定
D ld.bfd 不遵循 POSIX
#

36. Clang Flow-Sensitive Constraint Analysis(FCA)在 null deref 与 leak 检测的工程价值?

A FCA 用路径敏感约束求解检测 null deref 与 leak ✓ 正确答案
B FCA 是路径不敏感的
C FCA 只能用于优化
D FCA 与静态分析无关
#

37. PIC(Position Independent Code)在 shared library GOT/PLT 的工程价值?

A PLT 用于直接寻址
B PIC 要求固定加载地址
C PIC 通过 GOT/PLT 实现地址无关加载与共享库共享 ✓ 正确答案
D PIC 无法被共享
#

38. ASLR(Address Space Layout Randomization)PIE 位置 + stack + heap + library 随机熵?

A ASLR 只随机化栈
B ASLR 随机化 PIE、栈、堆、库的基址,抑制固定地址攻击 ✓ 正确答案
C ASLR 使地址可预测
D ASLR 与 PIE 无关
#

39. BIND_NOW(-z now)在 shell 与 systemd 的工程应用?

A BIND_NOW 降低安全性
B -z now 启用延迟绑定
C -z now 关闭延迟绑定,使 GOT 只读,防 GOT 劫持 ✓ 正确答案
D BIND_NOW 与 RELRO 无关
#

40. CFI shadow stack(-fsanitize=cfi)在 Rust、Chrome 的工程价值?

A CFI 不校验调用目标
B CFI 校验间接调用目标合法性,防控制流劫持 ✓ 正确答案
C Rust 不需要 CFI
D CFI 只用于优化
#

41. PGO(Profile-Guided Optimization)在 gcc -fprofile-generate / -fprofile-use 的 two-pass 工程价值?

A profile 与优化无关
B PGO 只需一次编译
C -fprofile-generate 插桩采集,-fprofile-use 读取 profile 优化 ✓ 正确答案
D PGO 不运行程序
#

42. BOLT(Binary Optimization and Layout Tool)由 Facebook/Google 在 binary 级别 reorder(hot path)的工程价值?

A BOLT 只做布局不做优化
B BOLT 需要源码重新编译
C BOLT 在二进制级重排热路径,无需重新编译源码 ✓ 正确答案
D BOLT 与缓存无关
#

43. PGO 在 JIT 引擎(V8 TurboFan、SpiderMonkey)的应用?

A JIT 用运行时 profile 识别热点并做优化编译,实现自适应优化 ✓ 正确答案
B JIT 不做 profile 收集
C JIT 只解释执行
D JIT 优化与类型无关
#

44. Cross-module inlining(ThinLTO importing)的 build system 协同?

A ThinLTO 只能串行
B ThinLTO 无法增量编译
C 构建系统与 ThinLTO 无关
D build system 调度 ThinLTO 的模块并行优化与增量编译 ✓ 正确答案
#

45. Cross-DSO CFI 在动态库的 llvm.type.test 与 type metadata 工程价值?

A 动态库无需类型校验
B Cross-DSO CFI 只在本库内校验
C Cross-DSO CFI 用 type metadata 校验动态库间间接调用目标 ✓ 正确答案
D Cross-DSO CFI 与 CFI 无关
#

46. LLVM-CFI 的"fallthrough"指令较少的 indirect call 优化空间?

A 可利用类型集合紧凑化 CFI 检查、去虚拟化,降低开销 ✓ 正确答案
B CFI 检查无优化空间
C CFI 只能增加开销
D CFI 与间接调用无关
#

47. 数据流分析中到达定义(reaching definitions)、活跃变量(live variables)与可用表达式的方程如何建立不动点迭代?

A 数据流方程通过不动点迭代求解各块的数据流集合 ✓ 正确答案
B 数据流分析只需一次计算
C 活跃变量是前向分析
D 可用表达式取并集
#

48. 循环不变量外提(loop-invariant code motion)与归纳变量强度削减的适用条件与安全性约束是什么?

A LICM 可随意移动有副作用的代码
B LICM 把循环不变值外移,需保证无副作用与语义等价 ✓ 正确答案
C 强度削减会增加乘法
D 循环优化无需安全性约束
#

49. 常数折叠、复写传播与代数化简在局部优化中如何组合,哪些变换可能因浮点语义而不安全?

A 浮点 `x*1` 恒等于 x
B 浮点运算不满足结合律,化简需保守以免改变结果 ✓ 正确答案
C 复写传播与浮点无关
D 常数折叠对浮点总安全
#

50. 活跃变量分析为何采用后向数据流方程,它的格(lattice)与转移函数如何定义?

A 活跃变量是前向分析
B 活跃变量分析是后向 may 分析,转移函数 use∪(x-def),汇合取并集 ✓ 正确答案
C 活跃变量分析取交集
D 活跃变量与寄存器分配无关
#

51. 基本块内的 DAG 表示如何用于公共子表达式消除与死代码删除,值编号(value numbering)的原理是什么?

A 值编号无法识别公共子表达式
B 值编号用值号标识表达式,识别公共子表达式并消除冗余 ✓ 正确答案
C DAG 只用于死代码删除
D 值编号与优化无关
#

52. 窥孔优化(peephole optimization)在指令选择后做哪些局部替换,如何避免无限重写循环?

A 窥孔优化不能合并指令
B 窥孔优化可能无限循环
C 窥孔优化只做全局优化
D 窥孔优化做局部指令替换,通过每步更优与有限遍数保证终止 ✓ 正确答案
#

53. 寄存器分配的线性扫描算法,活跃区间与溢出如何处理?

A 线性扫描复杂度高
B 线性扫描溢出最先结束的区间
C 线性扫描不需要活跃区间
D 线性扫描按起始排序活跃区间,寄存器不足时溢出最晚结束的区间 ✓ 正确答案
#

54. 栈帧布局与调用约定,参数传递与栈对齐如何设计?

A 调用约定规定参数传递与栈对齐,保证 ABI 兼容 ✓ 正确答案
B 栈对齐无关紧要
C 参数只用寄存器传递
D 调用约定与返回值无关
#

55. 指令调度与寄存器分配的顺序,为什么先调度后分配会增大寄存器压力,现代编译器如何交替处理?

A 先调度后分配会增大寄存器压力,现代编译器交替处理平衡两者 ✓ 正确答案
B 调度与分配无关
C 先分配后调度无限制
D 调度不影响寄存器压力
#

56. 尾调用优化(tail call optimization)对栈帧与寄存器分配的影响,为什么尾位置调用可以直接复用调用者栈帧?

A TCO 与栈帧无关
B 尾调用总是新建栈帧
C TCO 无法用于递归
D 尾调用复用调用者栈帧,避免栈增长与调用开销 ✓ 正确答案
#

57. GCC 14 LTO 在 WHOPR(whole program)模式的 streaming bitcode 工程价值?

A WHOPR 与并行无关
B WHOPR 只能串行
C WHOPR 不使用 bitcode
D WHOPR 通过分阶段并行与 bitcode 流式传输实现可扩展 LTO ✓ 正确答案
#

58. GCC 14 改进了哪些 specific optimization(-fthreadsafe-statics, -fno-trapping-math)?

A 浮点选项不影响优化
B -fthreadsafe-statics 只用于调试
C -fno-trapping-math 放宽浮点异常语义,允许更激进优化 ✓ 正确答案
D -fthreadsafe-statics 关闭后更安全
#

59. 新 Pass Manager 相对 legacy Pass Manager 的"分析可保留"(analysis preservation)工程价值?

A legacy Pass Manager 更完善
B 新 Pass Manager 每次重算所有分析
C 新 Pass Manager 与 analysis 无关
D 新 Pass Manager 显式管理分析依赖与失效,复用分析结果 ✓ 正确答案
#

60. ThinLTO 的"thin link + cross-module importing" 阶段工程价值?

A ThinLTO 无法并行
B thin link 合并全部 IR
C importing 不需要概要
D thin link 收集全局概要,importing 按需导入跨模块 IR 做优化 ✓ 正确答案
#

61. Linalg dialect 在 GEMM 卷积的 matmul tile + scatter fusion 工程价值?

A Linalg 不支持融合
B Linalg 的 tiling 提升缓存局部性,fusion 减少中间结果读写 ✓ 正确答案
C tiling 会降低优化
D Linalg 与 GEMM 无关
#

62. MLIR 在 polyhedral(ISL)与 compiler codegen 的 +pattern rewriting 工程价值?

A MLIR 不支持循环优化
B polyhedral 只用于前端
C pattern rewriting 无法自定义
D polyhedral 优化循环,pattern rewriting 声明式重写 IR 模式 ✓ 正确答案
#

63. MemorySanitizer(MSAN)检测未初始化内存读取的 taint propagation 工程价值?

A MSAN 用 taint 传播检测未初始化内存值的读取与使用 ✓ 正确答案
B MSAN 只检测越界
C MSAN 不追踪传播
D MSAN 用于加密
#

64. ThreadSanitizer(TSan)data race detection 在 happens-before 关系的工程价值?

A TSan 检测性能问题
B TSan 用固定间隔检测
C TSan 不处理同步
D TSan 基于 happens-before 关系检测无同步保护的并发访问 ✓ 正确答案
#

65. GWP-ASan 通过 sampling 减少开销的 production 工程价值?

A GWP-ASan 与 ASan 开销相同
B GWP-ASan 通过采样降低开销,使内存检测可在生产环境运行 ✓ 正确答案
C GWP-ASan 检测所有分配
D GWP-ASan 不能上生产
#

66. HWASan(Hardware ASan)利用 ARM MTE 硬件 tag 减少 shadow memory 开销的工程价值?

A HWASan 比 ASan 更慢
B HWASan 需要大块 shadow memory
C HWASan 与硬件无关
D HWASan 用 ARM MTE 硬件 tag 校验访问,降低 shadow memory 开销 ✓ 正确答案
#

67. Clang Control Flow Graph(CFG)在 -Wunreachable-code 与 static analyzer 的工程价值?

A 不可达代码无法检测
B CFG 只用于优化
C Clang CFG 支撑 -Wunreachable-code 与路径敏感静态分析 ✓ 正确答案
D static analyzer 不使用 CFG
#

68. Clang path-sensitive solver 在 C++ destructor、reference init 的工程价值?

A path-sensitive solver 不处理析构
B path-sensitive solver 沿路径模拟对象生命周期,检测析构/引用缺陷 ✓ 正确答案
C 引用初始化无缺陷
D path-sensitive 与路径无关
#

69. 寄存器分配中图着色算法的简化与线性扫描如何取舍?

A 两者相同
B 线性扫描质量更高
C 图着色速度更快
D 图着色质量高但慢,线性扫描快但精度略低 ✓ 正确答案
#

70. 代码生成的指令选择与调度,如何最小化寄存器压力?

A 指令选择与压力敏感调度协同,控制瞬时存活变量减少溢出 ✓ 正确答案
B 寄存器压力与选择无关
C 调度不考虑压力
D 溢出不影响性能
#

71. 指令选择与窥孔优化,代码生成的质量如何考量?

A 窥孔优化不能提升代码
B 窥孔优化在指令选择前
C 指令选择与质量无关
D 指令选择选最优指令模式,窥孔优化做局部精修提升质量 ✓ 正确答案
#

72. 代码生成的优化,指令选择、调度与窥孔如何配合?

A 指令选择、调度、窥孔分别负责选指令、排顺序、局部精修 ✓ 正确答案
B 调度负责选指令
C 窥孔负责全局优化
D 三者功能相同