================
@@ -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);
----------------
ssahasra wrote:
I lean on the other side. If you look at LoopInfoBase or LoopBase, their
functions take const pointers as arguments but return non-const pointers when
asked. Sure, an analysis should treat its inputs as const, but when it returns
something to the client, that client owns it anyway, so forcing that to be
const is just an inconvenience. I would rather have the analysis do the
const_cast before returning a list of pointers to something I already own.
This seems to be the first time that uniformity analysis is returning
something. Until now, the public interface has simply been a bunch of
predicates like "isUniform" that take a const pointer as arguments.
https://github.com/llvm/llvm-project/pull/124298
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits