@@ -455,7 +455,8 @@ bool CombinerHelper::matchCombineShuffleConcat(
455455 return false ;
456456 }
457457 if (!isLegalOrBeforeLegalizer (
458- {TargetOpcode::G_IMPLICIT_DEF, {ConcatSrcTy}}))
458+ {TargetOpcode::G_IMPLICIT_DEF, {ConcatSrcTy}}) ||
459+ !isLegalOrBeforeLegalizer ({TargetOpcode::G_POISON, {ConcatSrcTy}}))
459460 return false ;
460461 Ops.push_back (0 );
461462 } else if (Mask[i] % ConcatSrcNumElt == 0 ) {
@@ -2733,7 +2734,8 @@ void CombinerHelper::applyCombineTruncOfShift(
27332734bool CombinerHelper::matchAnyExplicitUseIsUndef (MachineInstr &MI) const {
27342735 return any_of (MI.explicit_uses (), [this ](const MachineOperand &MO) {
27352736 return MO.isReg () &&
2736- getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MO.getReg (), MRI);
2737+ (getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MO.getReg (), MRI) ||
2738+ getOpcodeDef (TargetOpcode::G_POISON, MO.getReg (), MRI));
27372739 });
27382740}
27392741
@@ -2746,7 +2748,8 @@ bool CombinerHelper::matchAnyExplicitUseIsPoison(MachineInstr &MI) const {
27462748bool CombinerHelper::matchAllExplicitUsesAreUndef (MachineInstr &MI) const {
27472749 return all_of (MI.explicit_uses (), [this ](const MachineOperand &MO) {
27482750 return !MO.isReg () ||
2749- getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MO.getReg (), MRI);
2751+ getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MO.getReg (), MRI) ||
2752+ getOpcodeDef (TargetOpcode::G_POISON, MO.getReg (), MRI);
27502753 });
27512754}
27522755
@@ -2766,6 +2769,8 @@ bool CombinerHelper::matchUndefShuffleVectorMask(MachineInstr &MI) const {
27662769bool CombinerHelper::matchUndefStore (MachineInstr &MI) const {
27672770 assert (MI.getOpcode () == TargetOpcode::G_STORE);
27682771 return getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MI.getOperand (0 ).getReg (),
2772+ MRI) ||
2773+ getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MI.getOperand (0 ).getReg (),
27692774 MRI);
27702775}
27712776
@@ -2777,6 +2782,8 @@ bool CombinerHelper::matchPoisonStore(MachineInstr &MI) const {
27772782bool CombinerHelper::matchUndefSelectCmp (MachineInstr &MI) const {
27782783 assert (MI.getOpcode () == TargetOpcode::G_SELECT);
27792784 return getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MI.getOperand (1 ).getReg (),
2785+ MRI) ||
2786+ getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MI.getOperand (1 ).getReg (),
27802787 MRI);
27812788}
27822789
@@ -3010,7 +3017,8 @@ bool CombinerHelper::matchOperandIsUndef(MachineInstr &MI,
30103017 unsigned OpIdx) const {
30113018 MachineOperand &MO = MI.getOperand (OpIdx);
30123019 return MO.isReg () &&
3013- getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MO.getReg (), MRI);
3020+ (getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, MO.getReg (), MRI) ||
3021+ getOpcodeDef (TargetOpcode::G_POISON, MO.getReg (), MRI));
30143022}
30153023
30163024bool CombinerHelper::matchOperandIsPoison (MachineInstr &MI,
@@ -7960,10 +7968,12 @@ bool CombinerHelper::matchShuffleDisjointMask(MachineInstr &MI,
79607968 auto &Shuffle = cast<GShuffleVector>(MI);
79617969 // If any of the two inputs is already undef, don't check the mask again to
79627970 // prevent infinite loop
7963- if (getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, Shuffle.getSrc1Reg (), MRI))
7971+ if (getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, Shuffle.getSrc1Reg (), MRI) ||
7972+ getOpcodeDef (TargetOpcode::G_POISON, Shuffle.getSrc1Reg (), MRI))
79647973 return false ;
79657974
7966- if (getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, Shuffle.getSrc2Reg (), MRI))
7975+ if (getOpcodeDef (TargetOpcode::G_IMPLICIT_DEF, Shuffle.getSrc2Reg (), MRI) ||
7976+ getOpcodeDef (TargetOpcode::G_POISON, Shuffle.getSrc2Reg (), MRI))
79677977 return false ;
79687978
79697979 const LLT DstTy = MRI.getType (Shuffle.getReg (0 ));
0 commit comments