================
@@ -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
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to