[llvm] AMDGPU/GlobalISel: Fix inst-selection of ballot (PR #109986)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 30 05:07:49 PDT 2024
================
@@ -1429,34 +1429,129 @@ bool AMDGPUInstructionSelector::selectBallot(MachineInstr &I) const {
std::optional<ValueAndVReg> Arg =
getIConstantVRegValWithLookThrough(I.getOperand(2).getReg(), *MRI);
- const auto BuildCopy = [&](Register SrcReg) {
- if (Size == STI.getWavefrontSize()) {
- BuildMI(*BB, &I, DL, TII.get(AMDGPU::COPY), DstReg)
- .addReg(SrcReg);
- return;
+ const auto getCmpInput = [&]() -> MachineInstr * {
+ MachineInstr *SrcMI = getDefIgnoringCopies(I.getOperand(2).getReg(), *MRI);
+ // Try to fold sgpr compare.
+ if (SrcMI->getOpcode() == AMDGPU::G_TRUNC)
+ SrcMI = MRI->getVRegDef(SrcMI->getOperand(1).getReg());
+
+ if (SrcMI->getOpcode() == AMDGPU::G_ICMP ||
+ SrcMI->getOpcode() == AMDGPU::G_FCMP)
+ return SrcMI;
+ return nullptr;
+ };
+
+ const auto FoldCmp = [&](Register Dst, MachineInstr *CmpMI) -> bool {
+ // Fold ballot of a compare. Active lanes when the ballot is executed need
----------------
arsenm wrote:
Can you check that the block parents are the same? It's only broken in the mid block exec mask change, which we should move away from having
https://github.com/llvm/llvm-project/pull/109986
More information about the llvm-commits
mailing list