`dxil-spirv`工具的开发者在图形编程中用于构建控制流结构,但他面临着一个重大的技术障碍:现有的结构化程序已变成一个难以维护的、拥有 9,000 行代码的“黑洞”。原始实现试图在处理现代游戏更新中产生的日益复杂且不可预测的着色器时,仍保持代码的可读性。这种“以人为中心”的方法最终达到了崩溃点,因为某个特定着色器规模如此之大,以至于 Graphviz 无法在有限时间内将其渲染。这促使开发者放弃可读性目标,转而追求绝对的正确性和性能。
为了解决这个问题,开发者采用了类似于 Mesa 图形驱动程序和 OpenCL 的理念。新系统不再试图智能地组织每一个分支,而是使用递归算法来堆叠“序列化级别”。这种方法通过使用虚拟变量来跟踪路径,并将复杂的 switch 块转换为一系列条件分支来处理前向控制流。一个重大的简化举措是放弃在重写过程中保留 PHI SSA(静态单赋值)节点的尝试。相反,该工具现在将这些节点降低为普通变量和存储,依靠生产编译器来处理内存到寄存器的优化,这显著降低了结构化程序的复杂度。

这张图片展示了开发者必须简化的特定控制流结构,以处理复杂的着色器逻辑。

该图像描绘了新递归算法旨在处理的复杂分支逻辑类型。
为了验证这种新的“正确性优先”逻辑,开发者采用了两步测试流程。首先,他们完全绕过结构化程序,将原始的、无结构的“面条代码”直接发送到驱动程序中,确认世界并没有“崩溃”,且在 RADV 驱动上的性能保持一致。其次,他们构建了一个模糊测试工具来生成随机的、可约化的控制流图(CFGs),并使用位精确反馈验证它们是否符合新算法。虽然新方法成功处理了旧系统无法处理的“怪胎”,但它牺牲了对生成代码人类可读性的高度关注,并且在 NVIDIA 专有硬件上的性能仍是一个未经验证的变量。

该图展示了一个新系统可以成功处理的特定控制流图实例。