================ @@ -188,6 +190,37 @@ void DivergenceLoweringHelper::constrainAsLaneMask(Incoming &In) { In.Reg = Copy.getReg(0); } +void replaceUsesOfRegInInstWith(Register Reg, MachineInstr *Inst, + Register NewReg) { + for (MachineOperand &Op : Inst->operands()) { + if (Op.isReg() && Op.getReg() == Reg) + Op.setReg(NewReg); + } +} + +bool DivergenceLoweringHelper::lowerTempDivergence() { + AMDGPU::IntrinsicLaneMaskAnalyzer ILMA(*MF); + + for (auto [Inst, UseInst, _] : MUI->getUsesOutsideCycleWithDivergentExit()) { + Register Reg = Inst->getOperand(0).getReg(); + if (MRI->getType(Reg) == LLT::scalar(1) || MUI->isDivergent(Reg) || + ILMA.isS32S64LaneMask(Reg)) + continue; + + MachineInstr *MI = const_cast<MachineInstr *>(Inst); ---------------- nhaehnle wrote:
These come out of the analysis. The analysis itself uses const pointers/references in its implementation, which I believe is a good idea for const correctness. I wouldn't change that. So a `const_cast` is needed at some point. The only question is where. I think here is as good a place as any, though perhaps grouping them together with a small explanation is in order. Something like: ```c++ // As an analysis, UniformityAnalysis treats instructions as const. We have the parent function // as non-const, so casting const away here is inelegant but justified. MachineInstr *MI = const_cast<MachineInstr *>(Inst); MachineInstr *UseMI = const_cast<MachineInstr *>(UseInst); ``` https://github.com/llvm/llvm-project/pull/124298 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits