[llvm] [AMDGPU] Fold away S_AND of a lane mask with EXEC (PR #227729)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 1 05:48:26 PDT 2026
================
@@ -1947,6 +1949,58 @@ bool SIFoldOperandsImpl::tryFoldRedundantAND(MachineInstr &ChildMI) const {
return true;
}
+/// Remove S_AND of a lane mask with EXEC, when the lane mask is already known
+/// to have 0 in the bits of all inactive lanes.
+///
+/// Instruction selection inserts these unconditionally because it has not
+/// analysed what produced the lane mask.
+bool SIFoldOperandsImpl::tryFoldAndExec(MachineInstr &MI) const {
+ const AMDGPU::LaneMaskConstants &LMC = AMDGPU::LaneMaskConstants::get(*ST);
+ if (MI.getOpcode() != LMC.AndOpc)
+ return false;
+
+ // The AND is going to be removed, so nothing may use the SCC it defines.
+ if (!MI.allImplicitDefsAreDead())
+ return false;
+
+ // Find the EXEC operand, and the lane mask it is being ANDed with.
+ unsigned ExecIdx = 0;
+ for (unsigned I : {1u, 2u}) {
+ const MachineOperand &MO = MI.getOperand(I);
+ if (MO.isReg() && MO.getReg() == LMC.ExecReg)
+ ExecIdx = I;
+ }
+ if (!ExecIdx)
+ return false;
+ MachineOperand &Src = MI.getOperand(3 - ExecIdx);
+ if (!Src.isReg() || !Src.getReg().isVirtual() || Src.getSubReg())
+ return false;
+
+ Register SrcReg = Src.getReg();
+ if (!TII->isMaskedByExec(SrcReg, MI, *MRI))
----------------
arsenm wrote:
This should be illegal. We should add a verifier check that only terminators can write exec
https://github.com/llvm/llvm-project/pull/227729
More information about the llvm-commits
mailing list