[llvm] [AMDGPU] Remove redundant s_cmp_lg_* sX, 0 (PR #162352)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 10 00:19:29 PDT 2025
================
@@ -10577,6 +10577,67 @@ bool SIInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
if (SrcReg2 && !getFoldableImm(SrcReg2, *MRI, CmpValue))
return false;
+ const auto optimizeCmpSelect = [&CmpInstr, SrcReg, CmpValue, MRI,
+ this]() -> bool {
+ if (CmpValue != 0)
+ return false;
+
+ MachineInstr *Def = MRI->getUniqueVRegDef(SrcReg);
+ if (!Def || Def->getParent() != CmpInstr.getParent())
+ return false;
+
+ bool CanOptimize = false;
+ MachineOperand *SccDef =
+ Def->findRegisterDefOperand(AMDGPU::SCC, /*TRI=*/nullptr);
+
+ // For S_OP that set SCC = DST!=0, do the transformation
+ //
+ // s_cmp_lg_* (S_OP ...), 0 => (S_OP ...)
+ if (SccDef && Def->getOpcode() != AMDGPU::S_ADD_I32 &&
+ Def->getOpcode() != AMDGPU::S_ADD_U32 &&
+ Def->getOpcode() != AMDGPU::S_ADDC_U32 &&
+ Def->getOpcode() != AMDGPU::S_SUB_I32 &&
+ Def->getOpcode() != AMDGPU::S_SUB_U32 &&
+ Def->getOpcode() != AMDGPU::S_SUBB_U32 &&
+ Def->getOpcode() != AMDGPU::S_MIN_I32 &&
+ Def->getOpcode() != AMDGPU::S_MIN_U32 &&
+ Def->getOpcode() != AMDGPU::S_MAX_I32 &&
+ Def->getOpcode() != AMDGPU::S_MAX_U32 &&
+ Def->getOpcode() != AMDGPU::S_ADDK_I32)
+ CanOptimize = true;
+
+ // s_cmp_lg_* is redundant because the SCC input value for S_CSELECT* has
+ // the same value that will be calculated by s_cmp_lg_*
+ //
+ // s_cmp_lg_* (S_CSELECT* (non-zero imm), 0), 0 => (S_CSELECT* (non-zero
+ // imm), 0)
+ if (Def->getOpcode() == AMDGPU::S_CSELECT_B32 ||
+ Def->getOpcode() == AMDGPU::S_CSELECT_B64) {
+ bool Op1IsNonZeroImm =
+ Def->getOperand(1).isImm() && Def->getOperand(1).getImm() != 0;
+ bool Op2IsZeroImm =
+ Def->getOperand(2).isImm() && Def->getOperand(2).getImm() == 0;
+ if (Op1IsNonZeroImm && Op2IsZeroImm)
+ CanOptimize = true;
+ }
+
+ if (!CanOptimize)
+ return false;
+
+ for (auto I = std::next(Def->getIterator()), E = CmpInstr.getIterator();
+ I != E; ++I) {
----------------
arsenm wrote:
Use make_range
https://github.com/llvm/llvm-project/pull/162352
More information about the llvm-commits
mailing list