1、范围循环和索引循环的区别,
// 假设原始操作数: [A, A, A] (同一个值A被用了三次) // 范围for循环的问题: for (auto input : op.getDpsInputs()) { // 缓存了 [A, A, A] // 第一次迭代:input = A,替换为 A_conv → 操作数变为 [A_conv, A, A] // 第二次迭代:input = A (仍然是缓存的A),但实际上应该处理 A_conv // 这会导致逻辑错误! } // 索引循环的正确行为: for (size_t i = 0; i < op.getDpsInputs().size(); i++) { auto input = op.getDpsInputs()[i]; // 每次都重新获取 // 第一次迭代:input = A,替换为 A_conv → 操作数变为 [A_conv, A, A] // 第二次迭代:重新获取 op.getDpsInputs()[1] = A_conv (更新后的值) // 正确处理转换后的值! }
2、replaceAllUsesExcept 处理多输入的input时需要谨慎 (output不涉及)
需要显式列出所有要排除的操作,这要求我们知道所有不应该被修改的用户