Skip to content

Commit cbb1d91

Browse files
committed
Adjust targets for G_POISON
1 parent 0d07595 commit cbb1d91

14 files changed

+37
-17
lines changed

llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3594,7 +3594,8 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
35943594
return selectIntrinsic(I, MRI);
35953595
case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS:
35963596
return selectIntrinsicWithSideEffects(I, MRI);
3597-
case TargetOpcode::G_IMPLICIT_DEF: {
3597+
case TargetOpcode::G_IMPLICIT_DEF:
3598+
case TargetOpcode::G_POISON: {
35983599
I.setDesc(TII.get(TargetOpcode::IMPLICIT_DEF));
35993600
const LLT DstTy = MRI.getType(I.getOperand(0).getReg());
36003601
const Register DstReg = I.getOperand(0).getReg();
@@ -5862,6 +5863,9 @@ bool AArch64InstructionSelector::tryOptBuildVecToSubregToReg(
58625863
return false;
58635864
if (any_of(drop_begin(I.operands(), 2), [&MRI](const MachineOperand &Op) {
58645865
return !getOpcodeDef(TargetOpcode::G_IMPLICIT_DEF, Op.getReg(), MRI);
5866+
}) &&
5867+
any_of(drop_begin(I.operands(), 2), [&MRI](const MachineOperand &Op) {
5868+
return !getOpcodeDef(TargetOpcode::G_POISON, Op.getReg(), MRI);
58655869
}))
58665870
return false;
58675871
unsigned SubReg;

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
9292
const bool HasSVE = ST.hasSVE();
9393

9494
getActionDefinitionsBuilder(
95-
{G_IMPLICIT_DEF, G_FREEZE, G_CONSTANT_FOLD_BARRIER})
95+
{G_IMPLICIT_DEF, G_POISON, G_FREEZE, G_CONSTANT_FOLD_BARRIER})
9696
.legalFor({p0, s8, s16, s32, s64})
9797
.legalFor({v2s8, v4s8, v8s8, v16s8, v2s16, v4s16, v8s16, v2s32, v4s32,
9898
v2s64, v2p0})

llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerLowering.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,10 @@ bool matchDupFromInsertVectorElt(int Lane, MachineInstr &MI,
266266
MI.getOperand(1).getReg(), MRI);
267267
if (!InsMI)
268268
return false;
269-
// Match the undef vector operand.
269+
// Match the undef/poison vector operand.
270270
if (!getOpcodeDef(TargetOpcode::G_IMPLICIT_DEF, InsMI->getOperand(1).getReg(),
271+
MRI) &&
272+
!getOpcodeDef(TargetOpcode::G_POISON, InsMI->getOperand(1).getReg(),
271273
MRI))
272274
return false;
273275

llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4047,6 +4047,7 @@ bool AMDGPUInstructionSelector::select(MachineInstr &I) {
40474047
case TargetOpcode::G_BUILD_VECTOR_TRUNC:
40484048
return selectG_BUILD_VECTOR(I);
40494049
case TargetOpcode::G_IMPLICIT_DEF:
4050+
case TargetOpcode::G_POISON:
40504051
return selectG_IMPLICIT_DEF(I);
40514052
case TargetOpcode::G_INSERT:
40524053
return selectG_INSERT(I);

llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,8 @@ AMDGPURegisterBankInfo::getInstrAlternativeMappings(
477477
InstructionMappings AltMappings;
478478
switch (MI.getOpcode()) {
479479
case TargetOpcode::G_CONSTANT:
480-
case TargetOpcode::G_IMPLICIT_DEF: {
480+
case TargetOpcode::G_IMPLICIT_DEF:
481+
case TargetOpcode::G_POISON: {
481482
unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, *TRI);
482483
if (Size == 1) {
483484
static const OpRegBankEntry<1> Table[3] = {

llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,7 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) {
812812
return true;
813813
}
814814
case TargetOpcode::G_IMPLICIT_DEF:
815+
case TargetOpcode::G_POISON:
815816
return selectImplicitDef(MI, MIB);
816817
case TargetOpcode::G_UNMERGE_VALUES:
817818
return selectUnmergeValues(MI, MIB);
@@ -1030,7 +1031,8 @@ bool RISCVInstructionSelector::selectCopy(MachineInstr &MI) const {
10301031

10311032
bool RISCVInstructionSelector::selectImplicitDef(MachineInstr &MI,
10321033
MachineIRBuilder &MIB) const {
1033-
assert(MI.getOpcode() == TargetOpcode::G_IMPLICIT_DEF);
1034+
assert(MI.getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
1035+
MI.getOpcode() == TargetOpcode::G_POISON);
10341036

10351037
const Register DstReg = MI.getOperand(0).getReg();
10361038
const TargetRegisterClass *DstRC = getRegClassForTypeOnBank(

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
255255
// TODO: transform illegal vector types into legal vector type
256256
// TODO: Merge with G_FREEZE?
257257
getActionDefinitionsBuilder(
258-
{G_IMPLICIT_DEF, G_CONSTANT_FOLD_BARRIER})
258+
{G_IMPLICIT_DEF, G_POISON, G_CONSTANT_FOLD_BARRIER})
259259
.legalFor({s32, sXLen, p0})
260260
.legalIf(typeIsLegalBoolVec(0, BoolVecTys, ST))
261261
.legalIf(typeIsLegalIntOrFPVec(0, IntOrFPVecTys, ST))
@@ -1172,7 +1172,8 @@ bool RISCVLegalizerInfo::legalizeInsertSubvector(MachineInstr &MI,
11721172
LLT LitTy = MRI.getType(LitVec);
11731173

11741174
if (Idx == 0 ||
1175-
MRI.getVRegDef(BigVec)->getOpcode() == TargetOpcode::G_IMPLICIT_DEF)
1175+
MRI.getVRegDef(BigVec)->getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
1176+
MRI.getVRegDef(BigVec)->getOpcode() == TargetOpcode::G_POISON)
11761177
return true;
11771178

11781179
// We don't have the ability to slide mask vectors up indexed by their i1

llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
288288
case TargetOpcode::G_ZEXTLOAD:
289289
return getInstructionMapping(DefaultMappingID, /*Cost=*/1, GPRValueMapping,
290290
NumOperands);
291-
case TargetOpcode::G_IMPLICIT_DEF: {
291+
case TargetOpcode::G_IMPLICIT_DEF:
292+
case TargetOpcode::G_POSION: {
292293
Register Dst = MI.getOperand(0).getReg();
293294
LLT DstTy = MRI.getType(Dst);
294295
unsigned DstMinSize = DstTy.getSizeInBits().getKnownMinValue();

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,8 @@ bool SPIRVInstructionSelector::select(MachineInstr &I) {
548548
Register ResVReg = HasDefs ? I.getOperand(0).getReg() : Register(0);
549549
SPIRVType *ResType = HasDefs ? GR.getSPIRVTypeForVReg(ResVReg) : nullptr;
550550
assert(!HasDefs || ResType || I.getOpcode() == TargetOpcode::G_GLOBAL_VALUE ||
551-
I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF);
551+
I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
552+
I.getOpcode() == TargetOpcode::G_POISON);
552553
if (spvSelect(ResVReg, ResType, I)) {
553554
if (HasDefs) // Make all vregs 64 bits (for SPIR-V IDs).
554555
for (unsigned i = 0; i < I.getNumDefs(); ++i)
@@ -598,6 +599,7 @@ bool SPIRVInstructionSelector::spvSelect(Register ResVReg,
598599
case TargetOpcode::G_GLOBAL_VALUE:
599600
return selectGlobalValue(ResVReg, I);
600601
case TargetOpcode::G_IMPLICIT_DEF:
602+
case TargetOpcode::G_POISON:
601603
return selectOpUndef(ResVReg, ResType, I);
602604
case TargetOpcode::G_FREEZE:
603605
return selectFreeze(ResVReg, ResType, I);
@@ -2326,7 +2328,8 @@ bool SPIRVInstructionSelector::selectFreeze(Register ResVReg,
23262328
case SPIRV::ASSIGN_TYPE:
23272329
if (MachineInstr *AssignToDef =
23282330
MRI->getVRegDef(Def->getOperand(1).getReg())) {
2329-
if (AssignToDef->getOpcode() == TargetOpcode::G_IMPLICIT_DEF)
2331+
if (AssignToDef->getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
2332+
AssignToDef->getOpcode() == TargetOpcode::G_POISON)
23302333
Reg = Def->getOperand(2).getReg();
23312334
}
23322335
break;

llvm/lib/Target/SPIRV/SPIRVLegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ SPIRVLegalizerInfo::SPIRVLegalizerInfo(const SPIRVSubtarget &ST) {
222222
all(typeInSet(0, allPtrsScalarsAndVectors),
223223
typeInSet(1, allPtrsScalarsAndVectors)));
224224

225-
getActionDefinitionsBuilder({G_IMPLICIT_DEF, G_FREEZE}).alwaysLegal();
225+
getActionDefinitionsBuilder({G_IMPLICIT_DEF, G_POISON, G_FREEZE}).alwaysLegal();
226226

227227
getActionDefinitionsBuilder({G_STACKSAVE, G_STACKRESTORE}).alwaysLegal();
228228

llvm/lib/Target/SPIRV/SPIRVPreLegalizer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ addConstantsToTrack(MachineFunction &MF, SPIRVGlobalRegistry *GR,
9393
if (SrcMI)
9494
GR->add(Const, SrcMI);
9595
if (SrcMI && (SrcMI->getOpcode() == TargetOpcode::G_CONSTANT ||
96-
SrcMI->getOpcode() == TargetOpcode::G_IMPLICIT_DEF))
96+
SrcMI->getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
97+
SrcMI->getOpcode() == TargetOpcode::G_POISON))
9798
TargetExtConstTypes[SrcMI] = Const->getType();
9899
if (Const->isNullValue()) {
99100
MachineBasicBlock &DepMBB = MF.front();

llvm/lib/Target/X86/GISel/X86InstructionSelector.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class X86InstructionSelector : public InstructionSelector {
113113
const TargetRegisterClass *SrcRC) const;
114114
bool materializeFP(MachineInstr &I, MachineRegisterInfo &MRI,
115115
MachineFunction &MF) const;
116-
bool selectImplicitDefOrPHI(MachineInstr &I, MachineRegisterInfo &MRI) const;
116+
bool selectImplicitDefOrPoisonOrPHI(MachineInstr &I, MachineRegisterInfo &MRI) const;
117117
bool selectMulDivRem(MachineInstr &I, MachineRegisterInfo &MRI,
118118
MachineFunction &MF) const;
119119
bool selectSelect(MachineInstr &I, MachineRegisterInfo &MRI,
@@ -428,8 +428,9 @@ bool X86InstructionSelector::select(MachineInstr &I) {
428428
case TargetOpcode::G_BRCOND:
429429
return selectCondBranch(I, MRI, MF);
430430
case TargetOpcode::G_IMPLICIT_DEF:
431+
case TargetOpcode::G_POISON:
431432
case TargetOpcode::G_PHI:
432-
return selectImplicitDefOrPHI(I, MRI);
433+
return selectImplicitDefOrPoisonOrPHI(I, MRI);
433434
case TargetOpcode::G_MUL:
434435
case TargetOpcode::G_SMULH:
435436
case TargetOpcode::G_UMULH:
@@ -1585,9 +1586,10 @@ bool X86InstructionSelector::materializeFP(MachineInstr &I,
15851586
return true;
15861587
}
15871588

1588-
bool X86InstructionSelector::selectImplicitDefOrPHI(
1589+
bool X86InstructionSelector::selectImplicitDefOrPoisonOrPHI(
15891590
MachineInstr &I, MachineRegisterInfo &MRI) const {
15901591
assert((I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
1592+
I.getOpcode() == TargetOpcode::G_POISON ||
15911593
I.getOpcode() == TargetOpcode::G_PHI) &&
15921594
"unexpected instruction");
15931595

@@ -1604,7 +1606,8 @@ bool X86InstructionSelector::selectImplicitDefOrPHI(
16041606
}
16051607
}
16061608

1607-
if (I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF)
1609+
if (I.getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
1610+
I.getOpcode() == TargetOpcode::G_POISON)
16081611
I.setDesc(TII.get(X86::IMPLICIT_DEF));
16091612
else
16101613
I.setDesc(TII.get(X86::PHI));

llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
8282
// todo: AVX512 bool vector predicate types
8383

8484
// implicit/constants
85-
getActionDefinitionsBuilder(G_IMPLICIT_DEF)
85+
getActionDefinitionsBuilder({G_IMPLICIT_DEF, G_POISON})
8686
.legalIf([=](const LegalityQuery &Query) -> bool {
8787
// 32/64-bits needs support for s64/s128 to handle cases:
8888
// s64 = EXTEND (G_IMPLICIT_DEF s32) -> s64 = G_IMPLICIT_DEF

llvm/lib/Target/X86/GISel/X86RegisterBankInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ X86RegisterBankInfo::getInstrAlternativeMappings(const MachineInstr &MI) const {
404404
switch (MI.getOpcode()) {
405405
case TargetOpcode::G_LOAD:
406406
case TargetOpcode::G_STORE:
407+
case TargetOpcode::G_POISON:
407408
case TargetOpcode::G_IMPLICIT_DEF: {
408409
// we going to try to map 32/64/80 bit to PMI_FP32/PMI_FP64/PMI_FP80
409410
unsigned Size = getSizeInBits(MI.getOperand(0).getReg(), MRI, TRI);

0 commit comments

Comments
 (0)