Skip to content

Commit 432ff09

Browse files
committed
FPInfo: AMDGPU InstructionSelector
1 parent fb4bd70 commit 432ff09

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

llvm/include/llvm/CodeGen/GlobalISel/Utils.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,13 +241,19 @@ struct DefinitionAndSourceRegister {
241241
std::optional<DefinitionAndSourceRegister>
242242
getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI);
243243

244+
std::optional<DefinitionAndSourceRegister>
245+
getDefSrcRegIgnoringBitcasts(Register Reg, const MachineRegisterInfo &MRI);
246+
244247
/// Find the def instruction for \p Reg, folding away any trivial copies. May
245248
/// return nullptr if \p Reg is not a generic virtual register.
246249
///
247250
/// Also walks through hints such as G_ASSERT_ZEXT.
248251
MachineInstr *getDefIgnoringCopies(Register Reg,
249252
const MachineRegisterInfo &MRI);
250253

254+
MachineInstr *getDefIgnoringBitcasts(Register Reg,
255+
const MachineRegisterInfo &MRI);
256+
251257
/// Find the source register for \p Reg, folding away any trivial copies. It
252258
/// will be an output register of the instruction that getDefIgnoringCopies
253259
/// returns. May return an invalid register if \p Reg is not a generic virtual

llvm/lib/CodeGen/GlobalISel/Utils.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,33 @@ llvm::getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI) {
483483
return DefinitionAndSourceRegister{DefMI, DefSrcReg};
484484
}
485485

486+
std::optional<DefinitionAndSourceRegister>
487+
llvm::getDefSrcRegIgnoringBitcasts(Register Reg, const MachineRegisterInfo &MRI) {
488+
Register DefSrcReg = Reg;
489+
auto *DefMI = MRI.getVRegDef(Reg);
490+
auto DstTy = MRI.getType(DefMI->getOperand(0).getReg());
491+
if (!DstTy.isValid())
492+
return std::nullopt;
493+
unsigned Opc = DefMI->getOpcode();
494+
while (Opc == TargetOpcode::G_BITCAST || isPreISelGenericOptimizationHint(Opc)) {
495+
Register SrcReg = DefMI->getOperand(1).getReg();
496+
auto SrcTy = MRI.getType(SrcReg);
497+
if (!SrcTy.isValid())
498+
break;
499+
DefMI = MRI.getVRegDef(SrcReg);
500+
DefSrcReg = SrcReg;
501+
Opc = DefMI->getOpcode();
502+
}
503+
return DefinitionAndSourceRegister{DefMI, DefSrcReg};
504+
}
505+
506+
MachineInstr *llvm::getDefIgnoringBitcasts(Register Reg,
507+
const MachineRegisterInfo &MRI) {
508+
std::optional<DefinitionAndSourceRegister> DefSrcReg =
509+
getDefSrcRegIgnoringBitcasts(Reg, MRI);
510+
return DefSrcReg ? DefSrcReg->MI : nullptr;
511+
}
512+
486513
MachineInstr *llvm::getDefIgnoringCopies(Register Reg,
487514
const MachineRegisterInfo &MRI) {
488515
std::optional<DefinitionAndSourceRegister> DefSrcReg =

llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4282,12 +4282,12 @@ std::pair<Register, unsigned>
42824282
AMDGPUInstructionSelector::selectVOP3PModsImpl(
42834283
Register Src, const MachineRegisterInfo &MRI, bool IsDOT) const {
42844284
unsigned Mods = 0;
4285-
MachineInstr *MI = MRI.getVRegDef(Src);
4285+
MachineInstr *MI = getDefIgnoringBitcasts(Src, MRI);
42864286

42874287
if (MI->getOpcode() == AMDGPU::G_FNEG &&
42884288
// It's possible to see an f32 fneg here, but unlikely.
42894289
// TODO: Treat f32 fneg as only high bit.
4290-
MRI.getType(Src).isFixedVector(2, 16)) {
4290+
MRI.getType(MI->getOperand(0).getReg()) == LLT::fixed_vector(2, LLT::float16())) {
42914291
Mods ^= (SISrcMods::NEG | SISrcMods::NEG_HI);
42924292
Src = MI->getOperand(1).getReg();
42934293
MI = MRI.getVRegDef(Src);

0 commit comments

Comments
 (0)