Skip to content

Commit d9321dd

Browse files
committed
Delete redundant s_or_b32
Signed-off-by: John Lu <[email protected]>
1 parent 7ed2f1b commit d9321dd

File tree

11 files changed

+1058
-1205
lines changed

11 files changed

+1058
-1205
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10160,7 +10160,7 @@ static bool followSubRegDef(MachineInstr &MI,
1016010160
}
1016110161

1016210162
MachineInstr *llvm::getVRegSubRegDef(const TargetInstrInfo::RegSubRegPair &P,
10163-
MachineRegisterInfo &MRI) {
10163+
const MachineRegisterInfo &MRI) {
1016410164
assert(MRI.isSSA());
1016510165
if (!P.Reg.isVirtual())
1016610166
return nullptr;
@@ -10689,6 +10689,25 @@ bool SIInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
1068910689
if (!optimizeSCC(Def, &CmpInstr, RI))
1069010690
return false;
1069110691

10692+
// If s_or_32 result is unused (i.e. it is effectively a 64-bit s_cmp_lg of
10693+
// a register pair) and the input is a 64-bit foldableSelect then transform:
10694+
//
10695+
// (s_or_b32 (S_CSELECT_B64 (non-zero imm), 0), 0 => (S_CSELECT_B64
10696+
// (non-zero
10697+
// imm), 0)
10698+
if (Def->getOpcode() == AMDGPU::S_OR_B32 &&
10699+
MRI->use_nodbg_empty(Def->getOperand(0).getReg())) {
10700+
MachineOperand OrOpnd1 = Def->getOperand(1);
10701+
MachineOperand OrOpnd2 = Def->getOperand(2);
10702+
10703+
if (OrOpnd1.isReg() && OrOpnd2.isReg() &&
10704+
OrOpnd1.getReg() != OrOpnd2.getReg()) {
10705+
auto *Def1 = getVRegSubRegDef(getRegSubRegPair(OrOpnd1), *MRI);
10706+
auto *Def2 = getVRegSubRegDef(getRegSubRegPair(OrOpnd2), *MRI);
10707+
if (Def1 == Def2 && foldableSelect(Def1))
10708+
optimizeSCC(Def1, Def);
10709+
}
10710+
}
1069210711
return true;
1069310712
};
1069410713

llvm/lib/Target/AMDGPU/SIInstrInfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1687,7 +1687,7 @@ TargetInstrInfo::RegSubRegPair getRegSequenceSubReg(MachineInstr &MI,
16871687
/// skipping copy like instructions and subreg-manipulation pseudos.
16881688
/// Following another subreg of a reg:subreg isn't supported.
16891689
MachineInstr *getVRegSubRegDef(const TargetInstrInfo::RegSubRegPair &P,
1690-
MachineRegisterInfo &MRI);
1690+
const MachineRegisterInfo &MRI);
16911691

16921692
/// \brief Return false if EXEC is not changed between the def of \p VReg at \p
16931693
/// DefMI and the use at \p UseMI. Should be run on SSA. Currently does not

0 commit comments

Comments
 (0)