# 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 线性扫描按起始排序活跃区间,寄存器不足时溢出最晚结束的区间 ✓ 正确答案
# 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 与路径无关
# 71. 指令选择与窥孔优化,代码生成的质量如何考量? A 窥孔优化不能提升代码 B 窥孔优化在指令选择前 C 指令选择与质量无关 D 指令选择选最优指令模式,窥孔优化做局部精修提升质量 ✓ 正确答案