[llvm] AMDGPU/GlobalISel: AMDGPURegBankSelect (PR #112863)
Petar Avramovic via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 22 02:29:07 PST 2025
================
@@ -68,3 +72,37 @@ AMDGPU::getBaseWithConstantOffset(MachineRegisterInfo &MRI, Register Reg,
return std::pair(Reg, 0);
}
+
+IntrinsicLaneMaskAnalyzer::IntrinsicLaneMaskAnalyzer(MachineFunction &MF)
+ : MRI(MF.getRegInfo()) {
+ initLaneMaskIntrinsics(MF);
+}
+
+bool IntrinsicLaneMaskAnalyzer::isS32S64LaneMask(Register Reg) const {
+ return S32S64LaneMask.contains(Reg);
+}
+
+void IntrinsicLaneMaskAnalyzer::initLaneMaskIntrinsics(MachineFunction &MF) {
+ for (auto &MBB : MF) {
+ for (auto &MI : MBB) {
+ GIntrinsic *GI = dyn_cast<GIntrinsic>(&MI);
+ if (GI && GI->is(Intrinsic::amdgcn_if_break)) {
+ S32S64LaneMask.insert(MI.getOperand(3).getReg());
+ findLCSSAPhi(MI.getOperand(0).getReg());
+ }
+
+ if (MI.getOpcode() == AMDGPU::SI_IF ||
+ MI.getOpcode() == AMDGPU::SI_ELSE) {
+ findLCSSAPhi(MI.getOperand(0).getReg());
+ }
+ }
+ }
+}
+
+void IntrinsicLaneMaskAnalyzer::findLCSSAPhi(Register Reg) {
+ S32S64LaneMask.insert(Reg);
+ for (const MachineInstr &LCSSAPhi : MRI.use_instructions(Reg)) {
+ if (LCSSAPhi.isPHI())
+ S32S64LaneMask.insert(LCSSAPhi.getOperand(0).getReg());
+ }
+}
----------------
petar-avramovic wrote:
if.break is already forced uniform.
Here we special case lcssa-phi lane masks.
Phi is divergent because it uses value(uniform if.break in this case) outside cycle with the divergent exit, but that phi is lane mask so it needs to end up in sgpr.
https://github.com/llvm/llvm-project/pull/112863
More information about the llvm-commits
mailing list