diff options
53 files changed, 1142 insertions, 513 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/ConstantFoldingMIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/ConstantFoldingMIRBuilder.h index e817d9b4550..df196bfbd43 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/ConstantFoldingMIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/ConstantFoldingMIRBuilder.h @@ -54,6 +54,17 @@ public:          return buildConstant(Dst, MaybeCst->getSExtValue());        break;      } +    case TargetOpcode::G_SEXT_INREG: { +      assert(DstOps.size() == 1 && "Invalid dst ops"); +      assert(SrcOps.size() == 2 && "Invalid src ops"); +      const DstOp &Dst = DstOps[0]; +      const SrcOp &Src0 = SrcOps[0]; +      const SrcOp &Src1 = SrcOps[1]; +      if (auto MaybeCst = +              ConstantFoldExtOp(Opc, Src0.getReg(), Src1.getImm(), *getMRI())) +        return buildConstant(Dst, MaybeCst->getSExtValue()); +      break; +    }      }      return MachineIRBuilder::buildInstr(Opc, DstOps, SrcOps);    } diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h index 41229885d79..7f960e72784 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h @@ -139,24 +139,18 @@ public:      Register DstReg = MI.getOperand(0).getReg();      Register SrcReg = lookThroughCopyInstrs(MI.getOperand(1).getReg()); -    // sext(trunc x) - > ashr (shl (aext/copy/trunc x), c), c +    // sext(trunc x) - > (sext_inreg (aext/copy/trunc x), c)      Register TruncSrc;      if (mi_match(SrcReg, MRI, m_GTrunc(m_Reg(TruncSrc)))) {        LLT DstTy = MRI.getType(DstReg); -      // Guess on the RHS shift amount type, which should be re-legalized if -      // applicable. -      if (isInstUnsupported({TargetOpcode::G_SHL, {DstTy, DstTy}}) || -          isInstUnsupported({TargetOpcode::G_ASHR, {DstTy, DstTy}}) || -          isConstantUnsupported(DstTy)) +      if (isInstUnsupported({TargetOpcode::G_SEXT_INREG, {DstTy}}))          return false;        LLVM_DEBUG(dbgs() << ".. Combine MI: " << MI;);        LLT SrcTy = MRI.getType(SrcReg); -      unsigned ShAmt = DstTy.getScalarSizeInBits() - SrcTy.getScalarSizeInBits(); -      auto MIBShAmt = Builder.buildConstant(DstTy, ShAmt); -      auto MIBShl = Builder.buildInstr( -          TargetOpcode::G_SHL, {DstTy}, -          {Builder.buildAnyExtOrTrunc(DstTy, TruncSrc), MIBShAmt}); -      Builder.buildInstr(TargetOpcode::G_ASHR, {DstReg}, {MIBShl, MIBShAmt}); +      uint64_t SizeInBits = SrcTy.getScalarSizeInBits(); +      Builder.buildInstr( +          TargetOpcode::G_SEXT_INREG, {DstReg}, +          {Builder.buildAnyExtOrTrunc(DstTy, TruncSrc), SizeInBits});        markInstAndDefDead(MI, *MRI.getVRegDef(SrcReg), DeadInsts);        return true;      } diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h index d0c00d18723..1cf62d1fde5 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -331,6 +331,8 @@ class LegalizeRuleSet {    /// individually handled.    SmallBitVector TypeIdxsCovered{MCOI::OPERAND_LAST_GENERIC -                                   MCOI::OPERAND_FIRST_GENERIC + 2}; +  SmallBitVector ImmIdxsCovered{MCOI::OPERAND_LAST_GENERIC_IMM - +                                MCOI::OPERAND_FIRST_GENERIC_IMM + 2};  #endif    unsigned typeIdx(unsigned TypeIdx) { @@ -342,9 +344,21 @@ class LegalizeRuleSet {  #endif      return TypeIdx;    } -  void markAllTypeIdxsAsCovered() { + +  unsigned immIdx(unsigned ImmIdx) { +    assert(ImmIdx <= (MCOI::OPERAND_LAST_GENERIC_IMM - +                      MCOI::OPERAND_FIRST_GENERIC_IMM) && +           "Imm Index is out of bounds"); +#ifndef NDEBUG +    ImmIdxsCovered.set(ImmIdx); +#endif +    return ImmIdx; +  } + +  void markAllIdxsAsCovered() {  #ifndef NDEBUG      TypeIdxsCovered.set(); +    ImmIdxsCovered.set();  #endif    } @@ -403,6 +417,15 @@ class LegalizeRuleSet {      return actionIf(Action, typePairInSet(typeIdx(0), typeIdx(1), Types),                      Mutation);    } +  /// Use the given action when type index 0 is any type in the given list and +  /// imm index 0 is anything. Action should not be an action that requires +  /// mutation. +  LegalizeRuleSet &actionForTypeWithAnyImm(LegalizeAction Action, +                                           std::initializer_list<LLT> Types) { +    using namespace LegalityPredicates; +    immIdx(0); // Inform verifier imm idx 0 is handled. +    return actionIf(Action, typeInSet(typeIdx(0), Types)); +  }    /// Use the given action when type indexes 0 and 1 are both in the given list.    /// That is, the type pair is in the cartesian product of the list.    /// Action should not be an action that requires mutation. @@ -454,7 +477,7 @@ public:    LegalizeRuleSet &legalIf(LegalityPredicate Predicate) {      // We have no choice but conservatively assume that the free-form      // user-provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Legal, Predicate);    }    /// The instruction is legal when type index 0 is any type in the given list. @@ -466,6 +489,12 @@ public:    LegalizeRuleSet &legalFor(std::initializer_list<std::pair<LLT, LLT>> Types) {      return actionFor(LegalizeAction::Legal, Types);    } +  /// The instruction is legal when type index 0 is any type in the given list +  /// and imm index 0 is anything. +  LegalizeRuleSet &legalForTypeWithAnyImm(std::initializer_list<LLT> Types) { +    markAllIdxsAsCovered(); +    return actionForTypeWithAnyImm(LegalizeAction::Legal, Types); +  }    /// The instruction is legal when type indexes 0 and 1 along with the memory    /// size and minimum alignment is any type and size tuple in the given list.    LegalizeRuleSet &legalForTypesWithMemDesc( @@ -497,7 +526,7 @@ public:    LegalizeRuleSet &alwaysLegal() {      using namespace LegalizeMutations; -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Legal, always);    } @@ -506,7 +535,7 @@ public:      using namespace LegalizeMutations;      // We have no choice but conservatively assume that predicate-less lowering      // properly handles all type indices by design: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Lower, always);    }    /// The instruction is lowered if predicate is true. Keep type index 0 as the @@ -515,7 +544,7 @@ public:      using namespace LegalizeMutations;      // We have no choice but conservatively assume that lowering with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Lower, Predicate);    }    /// The instruction is lowered if predicate is true. @@ -523,7 +552,7 @@ public:                             LegalizeMutation Mutation) {      // We have no choice but conservatively assume that lowering with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Lower, Predicate, Mutation);    }    /// The instruction is lowered when type index 0 is any type in the given @@ -571,7 +600,7 @@ public:    LegalizeRuleSet &libcallIf(LegalityPredicate Predicate) {      // We have no choice but conservatively assume that a libcall with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Libcall, Predicate);    }    LegalizeRuleSet &libcallFor(std::initializer_list<LLT> Types) { @@ -597,7 +626,7 @@ public:                                   LegalizeMutation Mutation) {      // We have no choice but conservatively assume that an action with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::WidenScalar, Predicate, Mutation);    }    /// Narrow the scalar to the one selected by the mutation if the predicate is @@ -606,7 +635,7 @@ public:                                    LegalizeMutation Mutation) {      // We have no choice but conservatively assume that an action with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::NarrowScalar, Predicate, Mutation);    } @@ -616,7 +645,7 @@ public:                                    LegalizeMutation Mutation) {      // We have no choice but conservatively assume that an action with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::MoreElements, Predicate, Mutation);    }    /// Remove elements to reach the type selected by the mutation if the @@ -625,7 +654,7 @@ public:                                     LegalizeMutation Mutation) {      // We have no choice but conservatively assume that an action with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::FewerElements, Predicate, Mutation);    } @@ -648,7 +677,7 @@ public:    LegalizeRuleSet &customIf(LegalityPredicate Predicate) {      // We have no choice but conservatively assume that a custom action with a      // free-form user provided Predicate properly handles all type indices: -    markAllTypeIdxsAsCovered(); +    markAllIdxsAsCovered();      return actionIf(LegalizeAction::Custom, Predicate);    }    LegalizeRuleSet &customFor(std::initializer_list<LLT> Types) { @@ -886,6 +915,10 @@ public:    /// LegalizeRuleSet in any way at all.    /// \pre Type indices of the opcode form a dense [0, \p NumTypeIdxs) set.    bool verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const; +  /// Check if there is no imm index which is obviously not handled by the +  /// LegalizeRuleSet in any way at all. +  /// \pre Type indices of the opcode form a dense [0, \p NumTypeIdxs) set. +  bool verifyImmIdxsCoverage(unsigned NumImmIdxs) const;    /// Apply the ruleset to the given LegalityQuery.    LegalizeActionStep apply(const LegalityQuery &Query) const; diff --git a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h index 4cdaa48fb68..847d5fda6a2 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h @@ -151,6 +151,9 @@ Optional<APInt> ConstantFoldBinOp(unsigned Opcode, const unsigned Op1,                                    const unsigned Op2,                                    const MachineRegisterInfo &MRI); +Optional<APInt> ConstantFoldExtOp(unsigned Opcode, const unsigned Op1, +                                  uint64_t Imm, const MachineRegisterInfo &MRI); +  /// Returns true if \p Val can be assumed to never be a NaN. If \p SNaN is true,  /// this returns if \p Val can be assumed to never be a signaling NaN.  bool isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI, diff --git a/llvm/include/llvm/MC/MCInstrDesc.h b/llvm/include/llvm/MC/MCInstrDesc.h index 0aa586dfc90..b119d90f651 100644 --- a/llvm/include/llvm/MC/MCInstrDesc.h +++ b/llvm/include/llvm/MC/MCInstrDesc.h @@ -56,7 +56,11 @@ enum OperandType {    OPERAND_GENERIC_5 = 11,    OPERAND_LAST_GENERIC = 11, -  OPERAND_FIRST_TARGET = 12, +  OPERAND_FIRST_GENERIC_IMM = 12, +  OPERAND_GENERIC_IMM_0 = 12, +  OPERAND_LAST_GENERIC_IMM = 12, + +  OPERAND_FIRST_TARGET = 13,  };  } @@ -103,6 +107,16 @@ public:      assert(isGenericType() && "non-generic types don't have an index");      return OperandType - MCOI::OPERAND_FIRST_GENERIC;    } + +  bool isGenericImm() const { +    return OperandType >= MCOI::OPERAND_FIRST_GENERIC_IMM && +           OperandType <= MCOI::OPERAND_LAST_GENERIC_IMM; +  } + +  unsigned getGenericImmIndex() const { +    assert(isGenericImm() && "non-generic immediates don't have an index"); +    return OperandType - MCOI::OPERAND_FIRST_GENERIC_IMM; +  }  };  //===----------------------------------------------------------------------===// diff --git a/llvm/include/llvm/Support/TargetOpcodes.def b/llvm/include/llvm/Support/TargetOpcodes.def index 8d4ce176561..44791e45c20 100644 --- a/llvm/include/llvm/Support/TargetOpcodes.def +++ b/llvm/include/llvm/Support/TargetOpcodes.def @@ -356,6 +356,7 @@ HANDLE_TARGET_OPCODE(G_VAARG)  // Generic sign extend  HANDLE_TARGET_OPCODE(G_SEXT) +HANDLE_TARGET_OPCODE(G_SEXT_INREG)  // Generic zero extend  HANDLE_TARGET_OPCODE(G_ZEXT) diff --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td index af7f0b1a67a..5323e1a0f2d 100644 --- a/llvm/include/llvm/Target/GenericOpcodes.td +++ b/llvm/include/llvm/Target/GenericOpcodes.td @@ -33,6 +33,20 @@ def G_SEXT : GenericInstruction {    let hasSideEffects = 0;  } +// Sign extend the a value from an arbitrary bit position, copying the sign bit +// into all bits above it. This is equivalent to a shl + ashr pair with an +// appropriate shift amount. $sz is an immediate (MachineOperand::isImm() +// returns true) to allow targets to have some bitwidths legal and others +// lowered. This opcode is particularly useful if the target has sign-extension +// instructions that are cheaper than the constituent shifts as the optimizer is +// able to make decisions on whether it's better to hang on to the G_SEXT_INREG +// or to lower it and optimize the individual shifts. +def G_SEXT_INREG : GenericInstruction { +  let OutOperandList = (outs type0:$dst); +  let InOperandList = (ins type0:$src, untyped_imm_0:$sz); +  let hasSideEffects = 0; +} +  // Zero extend the underlying scalar type of an operation, putting zero bits  // into the newly-created space.  def G_ZEXT : GenericInstruction { diff --git a/llvm/include/llvm/Target/Target.td b/llvm/include/llvm/Target/Target.td index 1eb87383dd0..fc63696142c 100644 --- a/llvm/include/llvm/Target/Target.td +++ b/llvm/include/llvm/Target/Target.td @@ -841,6 +841,7 @@ def f64imm : Operand<f64>;  class TypedOperand<string Ty> : Operand<untyped> {    let OperandType = Ty;    bit IsPointer = 0; +  bit IsImmediate = 0;  }  def type0 : TypedOperand<"OPERAND_GENERIC_0">; @@ -859,6 +860,12 @@ let IsPointer = 1 in {    def ptype5 : TypedOperand<"OPERAND_GENERIC_5">;  } +// untyped_imm is for operands where isImm() will be true. It currently has no +// special behaviour and is only used for clarity. +def untyped_imm_0 : TypedOperand<"OPERAND_GENERIC_IMM_0"> { +  let IsImmediate = 1; +} +  /// zero_reg definition - Special node to stand for the zero register.  ///  def zero_reg; diff --git a/llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp index 461bc6038c2..51a74793f02 100644 --- a/llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp @@ -162,6 +162,17 @@ MachineInstrBuilder CSEMIRBuilder::buildInstr(unsigned Opc,        return buildConstant(DstOps[0], Cst->getSExtValue());      break;    } +  case TargetOpcode::G_SEXT_INREG: { +    assert(DstOps.size() == 1 && "Invalid dst ops"); +    assert(SrcOps.size() == 2 && "Invalid src ops"); +    const DstOp &Dst = DstOps[0]; +    const SrcOp &Src0 = SrcOps[0]; +    const SrcOp &Src1 = SrcOps[1]; +    if (auto MaybeCst = +            ConstantFoldExtOp(Opc, Src0.getReg(), Src1.getImm(), *getMRI())) +      return buildConstant(Dst, MaybeCst->getSExtValue()); +    break; +  }    }    bool CanCopy = checkCopyToDefsPossible(DstOps);    if (!canPerformCSEForOpc(Opc)) diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 500bae412d5..e2b5082503c 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -861,6 +861,98 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,      MI.eraseFromParent();      return Legalized;    } +  case TargetOpcode::G_SEXT_INREG: { +    if (TypeIdx != 0) +      return UnableToLegalize; + +    if (!MI.getOperand(2).isImm()) +      return UnableToLegalize; +    int64_t SizeInBits = MI.getOperand(2).getImm(); + +    // So long as the new type has more bits than the bits we're extending we +    // don't need to break it apart. +    if (NarrowTy.getScalarSizeInBits() >= SizeInBits) { +      Observer.changingInstr(MI); +      // We don't lose any non-extension bits by truncating the src and +      // sign-extending the dst. +      MachineOperand &MO1 = MI.getOperand(1); +      auto TruncMIB = MIRBuilder.buildTrunc(NarrowTy, MO1.getReg()); +      MO1.setReg(TruncMIB->getOperand(0).getReg()); + +      MachineOperand &MO2 = MI.getOperand(0); +      Register DstExt = MRI.createGenericVirtualRegister(NarrowTy); +      MIRBuilder.setInsertPt(MIRBuilder.getMBB(), ++MIRBuilder.getInsertPt()); +      MIRBuilder.buildInstr(TargetOpcode::G_SEXT, {MO2.getReg()}, {DstExt}); +      MO2.setReg(DstExt); +      Observer.changedInstr(MI); +      return Legalized; +    } + +    // Break it apart. Components below the extension point are unmodified. The +    // component containing the extension point becomes a narrower SEXT_INREG. +    // Components above it are ashr'd from the component containing the +    // extension point. +    if (SizeOp0 % NarrowSize != 0) +      return UnableToLegalize; +    int NumParts = SizeOp0 / NarrowSize; + +    // List the registers where the destination will be scattered. +    SmallVector<Register, 2> DstRegs; +    // List the registers where the source will be split. +    SmallVector<Register, 2> SrcRegs; + +    // Create all the temporary registers. +    for (int i = 0; i < NumParts; ++i) { +      Register SrcReg = MRI.createGenericVirtualRegister(NarrowTy); + +      SrcRegs.push_back(SrcReg); +    } + +    // Explode the big arguments into smaller chunks. +    MIRBuilder.buildUnmerge(SrcRegs, MI.getOperand(1).getReg()); + +    Register AshrCstReg = +        MIRBuilder.buildConstant(NarrowTy, NarrowTy.getScalarSizeInBits() - 1) +            ->getOperand(0) +            .getReg(); +    Register FullExtensionReg = 0; +    Register PartialExtensionReg = 0; + +    // Do the operation on each small part. +    for (int i = 0; i < NumParts; ++i) { +      if ((i + 1) * NarrowTy.getScalarSizeInBits() < SizeInBits) +        DstRegs.push_back(SrcRegs[i]); +      else if (i * NarrowTy.getScalarSizeInBits() > SizeInBits) { +        assert(PartialExtensionReg && +               "Expected to visit partial extension before full"); +        if (FullExtensionReg) { +          DstRegs.push_back(FullExtensionReg); +          continue; +        } +        DstRegs.push_back(MIRBuilder +                              .buildInstr(TargetOpcode::G_ASHR, {NarrowTy}, +                                          {PartialExtensionReg, AshrCstReg}) +                              ->getOperand(0) +                              .getReg()); +        FullExtensionReg = DstRegs.back(); +      } else { +        DstRegs.push_back( +            MIRBuilder +                .buildInstr( +                    TargetOpcode::G_SEXT_INREG, {NarrowTy}, +                    {SrcRegs[i], SizeInBits % NarrowTy.getScalarSizeInBits()}) +                ->getOperand(0) +                .getReg()); +        PartialExtensionReg = DstRegs.back(); +      } +    } + +    // Gather the destination registers into the final destination. +    Register DstReg = MI.getOperand(0).getReg(); +    MIRBuilder.buildMerge(DstReg, DstRegs); +    MI.eraseFromParent(); +    return Legalized; +  }    }  } @@ -1633,6 +1725,15 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {      Observer.changedInstr(MI);      return Legalized;    } +  case TargetOpcode::G_SEXT_INREG: +    if (TypeIdx != 0) +      return UnableToLegalize; + +    Observer.changingInstr(MI); +    widenScalarSrc(MI, WideTy, 1, TargetOpcode::G_ANYEXT); +    widenScalarDst(MI, WideTy, 0, TargetOpcode::G_TRUNC); +    Observer.changedInstr(MI); +    return Legalized;    }  } @@ -1980,6 +2081,21 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) {      return lowerFMinNumMaxNum(MI);    case G_UNMERGE_VALUES:      return lowerUnmergeValues(MI); +  case TargetOpcode::G_SEXT_INREG: { +    assert(MI.getOperand(2).isImm() && "Expected immediate"); +    int64_t SizeInBits = MI.getOperand(2).getImm(); + +    Register DstReg = MI.getOperand(0).getReg(); +    Register SrcReg = MI.getOperand(1).getReg(); +    LLT DstTy = MRI.getType(DstReg); +    Register TmpRes = MRI.createGenericVirtualRegister(DstTy); + +    auto MIBSz = MIRBuilder.buildConstant(DstTy, DstTy.getScalarSizeInBits() - SizeInBits); +    MIRBuilder.buildInstr(TargetOpcode::G_SHL, {TmpRes}, {SrcReg, MIBSz->getOperand(0).getReg()}); +    MIRBuilder.buildInstr(TargetOpcode::G_ASHR, {DstReg}, {TmpRes, MIBSz->getOperand(0).getReg()}); +    MI.eraseFromParent(); +    return Legalized; +  }    }  } diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp index 6e1de95b327..ebe3b7c640c 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp @@ -215,7 +215,30 @@ bool LegalizeRuleSet::verifyTypeIdxsCoverage(unsigned NumTypeIdxs) const {      return true;    }    const bool AllCovered = (FirstUncovered >= NumTypeIdxs); -  LLVM_DEBUG(dbgs() << ".. the first uncovered type index: " << FirstUncovered +  if (NumTypeIdxs > 0) +    LLVM_DEBUG(dbgs() << ".. the first uncovered type index: " << FirstUncovered +                      << ", " << (AllCovered ? "OK" : "FAIL") << "\n"); +  return AllCovered; +#else +  return true; +#endif +} + +bool LegalizeRuleSet::verifyImmIdxsCoverage(unsigned NumImmIdxs) const { +#ifndef NDEBUG +  if (Rules.empty()) { +    LLVM_DEBUG( +        dbgs() << ".. imm index coverage check SKIPPED: no rules defined\n"); +    return true; +  } +  const int64_t FirstUncovered = ImmIdxsCovered.find_first_unset(); +  if (FirstUncovered < 0) { +    LLVM_DEBUG(dbgs() << ".. imm index coverage check SKIPPED:" +                         " user-defined predicate detected\n"); +    return true; +  } +  const bool AllCovered = (FirstUncovered >= NumImmIdxs); +  LLVM_DEBUG(dbgs() << ".. the first uncovered imm index: " << FirstUncovered                      << ", " << (AllCovered ? "OK" : "FAIL") << "\n");    return AllCovered;  #else @@ -387,8 +410,6 @@ unsigned LegalizerInfo::getActionDefinitionsIdx(unsigned Opcode) const {      LLVM_DEBUG(dbgs() << ".. opcode " << Opcode << " is aliased to " << Alias                        << "\n");      OpcodeIdx = getOpcodeIdxForOpcode(Alias); -    LLVM_DEBUG(dbgs() << ".. opcode " << Alias << " is aliased to " -                      << RulesForOpcode[OpcodeIdx].getAlias() << "\n");      assert(RulesForOpcode[OpcodeIdx].getAlias() == 0 && "Cannot chain aliases");    } @@ -677,12 +698,23 @@ void LegalizerInfo::verify(const MCInstrInfo &MII) const {                       ? std::max(OpInfo.getGenericTypeIndex() + 1U, Acc)                       : Acc;          }); +    const unsigned NumImmIdxs = std::accumulate( +        MCID.opInfo_begin(), MCID.opInfo_end(), 0U, +        [](unsigned Acc, const MCOperandInfo &OpInfo) { +          return OpInfo.isGenericImm() +                     ? std::max(OpInfo.getGenericImmIndex() + 1U, Acc) +                     : Acc; +        });      LLVM_DEBUG(dbgs() << MII.getName(Opcode) << " (opcode " << Opcode                        << "): " << NumTypeIdxs << " type ind" -                      << (NumTypeIdxs == 1 ? "ex" : "ices") << "\n"); +                      << (NumTypeIdxs == 1 ? "ex" : "ices") << ", " +                      << NumImmIdxs << " imm ind" +                      << (NumImmIdxs == 1 ? "ex" : "ices") << "\n");      const LegalizeRuleSet &RuleSet = getActionDefinitions(Opcode);      if (!RuleSet.verifyTypeIdxsCoverage(NumTypeIdxs))        FailedOpcodes.push_back(Opcode); +    else if (!RuleSet.verifyImmIdxsCoverage(NumImmIdxs)) +      FailedOpcodes.push_back(Opcode);    }    if (!FailedOpcodes.empty()) {      errs() << "The following opcodes have ill-defined legalization rules:"; diff --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp index 712f0db6159..907cb67f0db 100644 --- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp +++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp @@ -392,6 +392,23 @@ bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,    return false;  } +Optional<APInt> llvm::ConstantFoldExtOp(unsigned Opcode, const unsigned Op1, +                                        uint64_t Imm, +                                        const MachineRegisterInfo &MRI) { +  auto MaybeOp1Cst = getConstantVRegVal(Op1, MRI); +  if (MaybeOp1Cst) { +    LLT Ty = MRI.getType(Op1); +    APInt C1(Ty.getSizeInBits(), *MaybeOp1Cst, true); +    switch (Opcode) { +    default: +      break; +    case TargetOpcode::G_SEXT_INREG: +      return C1.trunc(Imm).sext(C1.getBitWidth()); +    } +  } +  return None; +} +  void llvm::getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU) {    AU.addPreserved<StackProtector>();  } diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 93466383164..49f0c02e47c 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1368,7 +1368,23 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {          break;        }      } +    break; +  } +  case TargetOpcode::G_SEXT_INREG: { +    if (!MI->getOperand(2).isImm()) { +      report("G_SEXT_INREG expects an immediate operand #2", MI); +      break; +    } + +    LLT DstTy = MRI->getType(MI->getOperand(0).getReg()); +    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg()); +    verifyVectorElementMatch(DstTy, SrcTy, MI); +    int64_t Imm = MI->getOperand(2).getImm(); +    if (Imm <= 0) +      report("G_SEXT_INREG size must be >= 1", MI); +    if (Imm >= SrcTy.getScalarSizeInBits()) +      report("G_SEXT_INREG size must be less than source bit width", MI);      break;    }    default: diff --git a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp index 79a21679463..3992e0e2914 100644 --- a/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -370,6 +370,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST) {    getActionDefinitionsBuilder(G_TRUNC).alwaysLegal(); +  getActionDefinitionsBuilder(G_SEXT_INREG).lower(); +    // FP conversions    getActionDefinitionsBuilder(G_FPTRUNC).legalFor(        {{s16, s32}, {s16, s64}, {s32, s64}, {v4s16, v4s32}, {v2s32, v2s64}}); diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 663cdd73a87..37222d9988e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -774,6 +774,8 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST_,        .scalarize(1);    } +  getActionDefinitionsBuilder(G_SEXT_INREG).lower(); +    computeTables();    verify(*ST.getInstrInfo());  } diff --git a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp index 73a57b297ad..81414e6d76f 100644 --- a/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp +++ b/llvm/lib/Target/ARM/ARMLegalizerInfo.cpp @@ -84,6 +84,8 @@ ARMLegalizerInfo::ARMLegalizerInfo(const ARMSubtarget &ST) {    getActionDefinitionsBuilder({G_SEXT, G_ZEXT, G_ANYEXT})        .legalForCartesianProduct({s8, s16, s32}, {s1, s8, s16}); +  getActionDefinitionsBuilder(G_SEXT_INREG).lower(); +    getActionDefinitionsBuilder({G_MUL, G_AND, G_OR, G_XOR})        .legalFor({s32})        .minScalar(0, s32); diff --git a/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp b/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp index ea7cc098df4..558af42cf7e 100644 --- a/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp +++ b/llvm/lib/Target/Mips/MipsLegalizerInfo.cpp @@ -144,6 +144,8 @@ MipsLegalizerInfo::MipsLegalizerInfo(const MipsSubtarget &ST) {        .libcallForCartesianProduct({s64, s32}, {s64})        .minScalar(1, s32); +  getActionDefinitionsBuilder(G_SEXT_INREG).lower(); +    computeTables();    verify(*ST.getInstrInfo());  } diff --git a/llvm/lib/Target/X86/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/X86LegalizerInfo.cpp index 96900565e23..04121f863c8 100644 --- a/llvm/lib/Target/X86/X86LegalizerInfo.cpp +++ b/llvm/lib/Target/X86/X86LegalizerInfo.cpp @@ -177,6 +177,7 @@ void X86LegalizerInfo::setLegalizerInfo32bit() {      setAction({G_ANYEXT, Ty}, Legal);    }    setAction({G_ANYEXT, s128}, Legal); +  getActionDefinitionsBuilder(G_SEXT_INREG).lower();    // Comparison    setAction({G_ICMP, s1}, Legal); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-extends.ll b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-extends.ll new file mode 100644 index 00000000000..b5658155f46 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-extends.ll @@ -0,0 +1,30 @@ +; RUN: llc -O0 -mtriple=aarch64-apple-ios -global-isel -stop-after=irtranslator %s -o - | FileCheck %s + +; Test that extends correctly translate to G_[ZS]EXT. The translator will never +; emit a G_SEXT_INREG. + +define i32 @test_zext(i32 %a) { +  ; CHECK-LABEL: name: test_zext +  ; CHECK: %0:_(s32) = COPY $w0 +  ; CHECK: %1:_(s8) = G_TRUNC %0(s32) +  ; CHECK: %2:_(s16) = G_ZEXT %1(s8) +  ; CHECK: %3:_(s32) = G_ZEXT %2(s16) +  ; CHECK: $w0 = COPY %3(s32) +  %tmp0 = trunc i32 %a to i8 +  %tmp1 = zext i8 %tmp0 to i16 +  %tmp2 = zext i16 %tmp1 to i32 +  ret i32 %tmp2 +} + +define i32 @test_sext(i32 %a) { +  ; CHECK-LABEL: name: test_sext +  ; CHECK: %0:_(s32) = COPY $w0 +  ; CHECK: %1:_(s8) = G_TRUNC %0(s32) +  ; CHECK: %2:_(s16) = G_SEXT %1(s8) +  ; CHECK: %3:_(s32) = G_SEXT %2(s16) +  ; CHECK: $w0 = COPY %3(s32) +  %tmp0 = trunc i32 %a to i8 +  %tmp1 = sext i8 %tmp0 to i16 +  %tmp2 = sext i16 %tmp1 to i32 +  ret i32 %tmp2 +} diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-div.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-div.mir index 94982226ce1..2ec40881aea 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-div.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-div.mir @@ -7,8 +7,8 @@ body:             |      ; CHECK-LABEL: name: test_div      ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0      ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C]](s32)      ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 24      ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY [[C1]](s64) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ext.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ext.mir index 8c195959a1f..e08bf29f3c7 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ext.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-ext.mir @@ -22,13 +22,13 @@ body:             |      ; CHECK: $x0 = COPY [[AND]](s64)      ; CHECK: [[COPY3:%[0-9]+]]:_(s64) = COPY [[COPY]](s64)      ; CHECK: $x0 = COPY [[COPY3]](s64) -    ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32      ; CHECK: [[COPY4:%[0-9]+]]:_(s64) = COPY [[COPY]](s64) +    ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 32      ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY4]], [[C1]](s64)      ; CHECK: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C1]](s64)      ; CHECK: $x0 = COPY [[ASHR]](s64) -    ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[TRUNC4:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64) +    ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[TRUNC4]], [[C2]](s32)      ; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 31      ; CHECK: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[SHL1]], [[C3]](s64) @@ -45,8 +45,8 @@ body:             |      ; CHECK: $w0 = COPY [[AND2]](s32)      ; CHECK: [[TRUNC8:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)      ; CHECK: $w0 = COPY [[TRUNC8]](s32) -    ; CHECK: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[TRUNC9:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64) +    ; CHECK: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[TRUNC9]], [[C6]](s32)      ; CHECK: [[C7:%[0-9]+]]:_(s64) = G_CONSTANT i64 16      ; CHECK: [[ASHR2:%[0-9]+]]:_(s32) = G_ASHR [[SHL2]], [[C7]](s64) @@ -142,8 +142,8 @@ body:             |      ; CHECK-LABEL: name: test_anyext_sext      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 31      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s64) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-gep.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-gep.mir index 373a1db41ed..6d34574b3ba 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-gep.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-gep.mir @@ -7,10 +7,10 @@ body:             |      ; CHECK-LABEL: name: test_gep_small      ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0      ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 -    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 56      ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY [[COPY1]](s64) -    ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY2]], [[C]] -    ; CHECK: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C]] +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 56 +    ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY2]], [[C]](s64) +    ; CHECK: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C]](s64)      ; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[COPY]], [[ASHR]](s64)      ; CHECK: $x0 = COPY [[GEP]](p0)      %0:_(p0) = COPY $x0 diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-itofp.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-itofp.mir index 6c4f430aebd..cfd67a315e9 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-itofp.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-itofp.mir @@ -148,8 +148,8 @@ body: |      liveins: $w0      ; CHECK-LABEL: name: test_sitofp_s32_s1      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 31      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s64) @@ -186,8 +186,8 @@ body: |      liveins: $w0      ; CHECK-LABEL: name: test_sitofp_s64_s8      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 24      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s64) @@ -252,8 +252,8 @@ body: |      liveins: $w0      ; CHECK-LABEL: name: test_sitofp_s32_s16      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 16      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s64) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-rem.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-rem.mir index 3295c2a6cc8..79178ea4a2a 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-rem.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-rem.mir @@ -45,8 +45,8 @@ body:             |      ; CHECK-LABEL: name: test_srem_8      ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0      ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC]], [[C]](s32)      ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 24      ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY [[C1]](s64) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-sext.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-sext.mir new file mode 100644 index 00000000000..e0b74775429 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-sext.mir @@ -0,0 +1,18 @@ +# RUN: llc -march=aarch64 -run-pass=legalizer %s -o - | FileCheck %s +--- +name:            test_sext_inreg +body: | +  bb.0.entry: +    liveins: $w0, $w1 +    ; CHECK-LABEL: name: test_sext_inreg +    ; CHECK-DAG: [[COPY:%[0-9]+]]:_(s32) = COPY $w1 +    ; CHECK-DAG: [[I25:%[0-9]+]]:_(s32) = G_CONSTANT i32 25 +    ; CHECK-DAG: [[SEXT1:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[I25]] +    ; This constant is coming from a custom legalization for G_ASHR rather than G_SEXT_INREG lowering +    ; CHECK-DAG: [[I25_64:%[0-9]+]]:_(s64) = G_CONSTANT i64 25 +    ; CHECK-DAG: [[SEXT2:%[0-9]+]]:_(s32) = G_ASHR [[SEXT1]], [[I25_64]] +    ; CHECK-DAG: $w0 = COPY [[SEXT2]](s32) +    %0:_(s32) = COPY $w1 +    %2:_(s32) = G_SEXT_INREG %0(s32), 7 +    $w0 = COPY %2(s32) +... diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-shift.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-shift.mir index 39452a6ccb4..0a95f21b302 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-shift.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-shift.mir @@ -10,8 +10,8 @@ body:             |      ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255      ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)      ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[TRUNC]], [[C]] -    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[TRUNC1]], [[C1]](s32)      ; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 24      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C2]](s64) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-undef.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-undef.mir index a979c0bfbfe..b3e35f6605e 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-undef.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-undef.mir @@ -24,8 +24,8 @@ body: |      liveins:      ; CHECK-LABEL: name: test_implicit_def_s3 -    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 61      ; CHECK: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 61      ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[DEF]], [[C]](s64)      ; CHECK: [[ASHR:%[0-9]+]]:_(s64) = G_ASHR [[SHL]], [[C]](s64)      ; CHECK: $x0 = COPY [[ASHR]](s64) diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir index bd3f36d1ba9..a6cf1d6fd81 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalizer-info-validation.mir @@ -13,391 +13,464 @@  # check-lines below and keep each and every one of them justified. -# DEBUG:      G_ADD (opcode [[ADD_OPC:[0-9]+]]): 1 type index +# DEBUG:      G_ADD (opcode [[ADD_OPC:[0-9]+]]): 1 type index, 0 imm indices  # DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_SUB (opcode [[SUB_OPC:[0-9]+]]): 1 type index +# DEBUG-NEXT: G_SUB (opcode [[SUB_OPC:[0-9]+]]): 1 type index, 0 imm indices  # DEBUG-NEXT: .. opcode [[SUB_OPC]] is aliased to [[ADD_OPC]] -# DEBUG-NEXT: .. opcode [[ADD_OPC]] is aliased to 0  # DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_MUL (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK +# DEBUG-NEXT: G_MUL (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  #  # DEBUG-NEXT: G_SDIV (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_UDIV (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_SREM (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_UREM (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_AND (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_OR (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_XOR (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_IMPLICIT_DEF (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_PHI (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FRAME_INDEX (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_GLOBAL_VALUE (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_EXTRACT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_UNMERGE_VALUES (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_INSERT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_MERGE_VALUES (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_BUILD_VECTOR (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_BUILD_VECTOR_TRUNC (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_CONCAT_VECTORS (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_PTRTOINT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_INTTOPTR (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_BITCAST (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_INTRINSIC_TRUNC (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_INTRINSIC_ROUND (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_LOAD (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_SEXTLOAD (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ZEXTLOAD (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_UDIV (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode 39 is aliased to 38 +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_STORE (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_SREM (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMIC_CMPXCHG_WITH_SUCCESS (opcode {{[0-9]+}}): 3 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_UREM (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode 41 is aliased to 40 +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMIC_CMPXCHG (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_AND (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode 42 is aliased to 35 +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMICRMW_XCHG (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_OR (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode 43 is aliased to 35 +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMICRMW_ADD (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_XOR (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode 44 is aliased to 35 +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMICRMW_SUB (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_IMPLICIT_DEF (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # -# DEBUG-NEXT: G_ATOMICRMW_AND (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_PHI (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMICRMW_NAND (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_FRAME_INDEX (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMICRMW_OR (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_GLOBAL_VALUE (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # -# DEBUG-NEXT: G_ATOMICRMW_XOR (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_EXTRACT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # -# DEBUG-NEXT: G_ATOMICRMW_MAX (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_UNMERGE_VALUES (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # -# DEBUG-NEXT: G_ATOMICRMW_MIN (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_INSERT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # -# DEBUG-NEXT: G_ATOMICRMW_UMAX (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_MERGE_VALUES (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # -# DEBUG-NEXT: G_ATOMICRMW_UMIN (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_BUILD_VECTOR (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # +# DEBUG-NEXT: G_BUILD_VECTOR_TRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# +# DEBUG-NEXT: G_CONCAT_VECTORS (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# +# DEBUG-NEXT: G_PTRTOINT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# +# DEBUG-NEXT: G_INTTOPTR (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# +# DEBUG-NEXT: G_BITCAST (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# +# DEBUG-NEXT: G_INTRINSIC_TRUNC (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_INTRINSIC_ROUND (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_LOAD (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_SEXTLOAD (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ZEXTLOAD (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_STORE (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMIC_CMPXCHG_WITH_SUCCESS (opcode {{[0-9]+}}): 3 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMIC_CMPXCHG (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_XCHG (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_ADD (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_SUB (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_AND (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_NAND (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_ATOMICRMW_OR (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_XOR (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_MAX (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_MIN (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_UMAX (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ATOMICRMW_UMIN (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # DEBUG-NEXT: G_ATOMICRMW_FADD (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_ATOMICRMW_FSUB (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FENCE (opcode {{[0-9]+}}): 0 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_BRCOND (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_BRINDIRECT (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_INTRINSIC (opcode {{[0-9]+}}): 0 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_INTRINSIC_W_SIDE_EFFECTS (opcode {{[0-9]+}}): 0 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_ANYEXT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_TRUNC (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_CONSTANT (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FCONSTANT (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_VASTART (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_VAARG (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SEXT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_ZEXT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_SHL (opcode {{[0-9]+}}): 2 type indices -# DEBUG:.. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_LSHR (opcode {{[0-9]+}}): 2 type indices -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_ASHR (opcode {{[0-9]+}}): 2 type indices -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_ICMP (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_FCMP (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SELECT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_UADDO (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_UADDE (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_USUBO (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_USUBE (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SADDO (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SADDE (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_SSUBO (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SSUBE (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_UMULO (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SMULO (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_UMULH (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_SMULH (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FADD (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FSUB (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FMUL (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FMA (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_FDIV (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FREM (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FPOW (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FEXP (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FEXP2 (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FLOG (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FLOG2 (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FLOG10 (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FNEG (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FPEXT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_FPTRUNC (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_FPTOSI (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_FPTOUI (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_SITOFP (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_UITOFP (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_FABS (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_BRCOND (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_BRINDIRECT (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_INTRINSIC (opcode {{[0-9]+}}): 0 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_INTRINSIC_W_SIDE_EFFECTS (opcode {{[0-9]+}}): 0 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_ANYEXT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_TRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_CONSTANT (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FCONSTANT (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_VASTART (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_VAARG (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SEXT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_SEXT_INREG (opcode {{[0-9]+}}): 1 type index, 1 imm index +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ZEXT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_SHL (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_LSHR (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ASHR (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_ICMP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_FCMP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SELECT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_UADDO (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_UADDE (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_USUBO (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_USUBE (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SADDO (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SADDE (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_SSUBO (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SSUBE (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_UMULO (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SMULO (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_UMULH (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SMULH (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FADD (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FSUB (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FMUL (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FMA (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_FDIV (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FREM (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FPOW (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FEXP (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FEXP2 (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FLOG (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FLOG2 (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FLOG10 (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FNEG (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FPEXT (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FPTRUNC (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FPTOSI (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FPTOUI (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_SITOFP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_UITOFP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FABS (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # DEBUG-NEXT: G_FCOPYSIGN (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_FCANONICALIZE (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_FCANONICALIZE (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FMINNUM (opcode {{[0-9]+}}): 1 type index  # DEBUG: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FMAXNUM (opcode {{[0-9]+}}): 1 type index  # DEBUG: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FMINNUM_IEEE (opcode {{[0-9]+}}): 1 type index  # DEBUG: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FMAXNUM_IEEE (opcode {{[0-9]+}}): 1 type index  # DEBUG: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FMINIMUM (opcode {{[0-9]+}}): 1 type index  # DEBUG: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_FMAXIMUM (opcode {{[0-9]+}}): 1 type index  # DEBUG: .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_GEP (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_PTR_MASK (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_GEP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_PTR_MASK (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK  # DEBUG: G_SMIN (opcode {{[0-9]+}}): 1 type index  # DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG: G_SMAX (opcode {{[0-9]+}}): 1 type index  # DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG: G_UMIN (opcode {{[0-9]+}}): 1 type index  # DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG: G_UMAX (opcode {{[0-9]+}}): 1 type index  # DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_BR (opcode {{[0-9]+}}): 0 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_BR (opcode {{[0-9]+}}): 0 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined  # DEBUG-NEXT: G_BRJT (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_INSERT_VECTOR_ELT (opcode {{[0-9]+}}): 3 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_EXTRACT_VECTOR_ELT (opcode {{[0-9]+}}): 3 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_SHUFFLE_VECTOR (opcode {{[0-9]+}}): 3 type indices -# DEBUG:      .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_CTTZ (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_CTTZ_ZERO_UNDEF (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_CTLZ (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. the first uncovered type index: 2, OK -# -# DEBUG-NEXT: G_CTLZ_ZERO_UNDEF (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_CTPOP (opcode {{[0-9]+}}): 2 type indices -# DEBUG:      .. type index coverage check SKIPPED: no rules defined -# -# DEBUG-NEXT: G_BSWAP (opcode {{[0-9]+}}): 1 type index -# DEBUG:      .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FCEIL (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_FCOS (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FSIN (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. the first uncovered type index: 1, OK -# -# DEBUG-NEXT: G_FSQRT (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_FFLOOR (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_FRINT (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected -# -# DEBUG-NEXT: G_FNEARBYINT (opcode {{[0-9]+}}): 1 type index -# DEBUG: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_INSERT_VECTOR_ELT (opcode {{[0-9]+}}): 3 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_EXTRACT_VECTOR_ELT (opcode {{[0-9]+}}): 3 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_SHUFFLE_VECTOR (opcode {{[0-9]+}}): 3 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_CTTZ (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_CTTZ_ZERO_UNDEF (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_CTLZ (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 2, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_CTLZ_ZERO_UNDEF (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_CTPOP (opcode {{[0-9]+}}): 2 type indices, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: .. imm index coverage check SKIPPED: no rules defined +# DEBUG-NEXT: G_BSWAP (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FCEIL (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_FCOS (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FSIN (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. the first uncovered type index: 1, OK +# DEBUG-NEXT: .. the first uncovered imm index: 0, OK +# DEBUG-NEXT: G_FSQRT (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_FFLOOR (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_FRINT (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: G_FNEARBYINT (opcode {{[0-9]+}}): 1 type index, 0 imm indices +# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}} +# DEBUG-NEXT: .. type index coverage check SKIPPED: user-defined predicate detected +# DEBUG-NEXT: .. imm index coverage check SKIPPED: user-defined predicate detected  # CHECK-NOT: ill-defined diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-sext.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-sext.mir index 821b7a5063a..84623f1d995 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-sext.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-sext.mir @@ -10,8 +10,8 @@ body: |      ; CHECK-LABEL: name: test_sext_trunc_v2s32_to_v2s16_to_v2s32      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY [[COPY]](<2 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -33,10 +33,10 @@ body: |      ; CHECK-LABEL: name: test_sext_trunc_v2s32_to_v2s16_to_v2s64      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 -    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 48      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)      ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[UV]](s32)      ; CHECK: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[UV1]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 48      ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)      ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ANYEXT]], [[TRUNC]](s32)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64) @@ -59,14 +59,13 @@ body: |    bb.0:      liveins: $vgpr0_vgpr1 +    ; The G_SEXT_INREG doesn't lower here because G_TRUNC is both illegal and +    ; unable to legalize. This prevents further legalization.      ; CHECK-LABEL: name: test_sext_trunc_v2s32_to_v2s8_to_v2s16      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 -    ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 8 -    ; CHECK: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s16>) = G_BUILD_VECTOR [[C]](s16), [[C]](s16)      ; CHECK: [[TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[COPY]](<2 x s32>) -    ; CHECK: [[SHL:%[0-9]+]]:_(<2 x s16>) = G_SHL [[TRUNC]], [[BUILD_VECTOR]](<2 x s16>) -    ; CHECK: [[ASHR:%[0-9]+]]:_(<2 x s16>) = G_ASHR [[SHL]], [[BUILD_VECTOR]](<2 x s16>) -    ; CHECK: $vgpr0 = COPY [[ASHR]](<2 x s16>) +    ; CHECK: [[SEXT_INREG:%[0-9]+]]:_(<2 x s16>) = G_SEXT_INREG [[TRUNC]], 8 +    ; CHECK: $vgpr0 = COPY [[SEXT_INREG]](<2 x s16>)      %0:_(<2 x s32>) = COPY $vgpr0_vgpr1      %1:_(<2 x s8>) = G_TRUNC %0      %2:_(<2 x s16>) = G_SEXT %1 @@ -81,8 +80,8 @@ body: |      ; CHECK-LABEL: name: test_sext_trunc_v3s32_to_v3s16_to_v3s32      ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(<3 x s32>) = COPY [[COPY]](<3 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<3 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir index 6d91548e069..e76bbb6784d 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir @@ -14,8 +14,8 @@ body:             |      ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](s32), [[UV3]]      ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; CHECK: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -56,8 +56,8 @@ body:             |      ; CHECK: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](s32), [[UV3]]      ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; CHECK: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -227,8 +227,8 @@ body:             |      ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)      ; CHECK: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[UV]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[UV1]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-ext-legalizer.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-ext-legalizer.mir index 8eeb6bd6a24..9b838bd4935 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-ext-legalizer.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-ext-legalizer.mir @@ -9,8 +9,8 @@ body: |      ; CHECK-LABEL: name: test_sext_trunc_i64_i32_i64      ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 -    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32      ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY [[COPY]](s64) +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32      ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)      ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY1]], [[TRUNC]](s32)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ashr.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ashr.mir index c14b148ec7a..45e06950ad9 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ashr.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-ashr.mir @@ -126,8 +126,8 @@ body: |      ; SI-LABEL: name: test_ashr_s16_s32      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[COPY1]](s32) @@ -167,8 +167,8 @@ body: |      ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; SI: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]] -    ; SI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY3]], [[C1]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; SI: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[AND]](s32) @@ -211,8 +211,8 @@ body: |      ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; SI: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]] -    ; SI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY3]], [[C1]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; SI: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[AND]](s32) @@ -261,8 +261,8 @@ body: |      ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; SI: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]] -    ; SI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY3]], [[C1]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; SI: [[ASHR1:%[0-9]+]]:_(s32) = G_ASHR [[ASHR]], [[AND]](s32) @@ -275,11 +275,11 @@ body: |      ; VI: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32)      ; VI: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)      ; VI: [[AND:%[0-9]+]]:_(s16) = G_AND [[TRUNC1]], [[TRUNC]] +    ; VI: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; VI: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 -    ; VI: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[C1]](s32) -    ; VI: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) -    ; VI: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC3]], [[TRUNC2]](s16) -    ; VI: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC2]](s16) +    ; VI: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[C1]](s32) +    ; VI: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC2]], [[TRUNC3]](s16) +    ; VI: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC3]](s16)      ; VI: [[ASHR1:%[0-9]+]]:_(s16) = G_ASHR [[ASHR]], [[AND]](s16)      ; VI: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ASHR1]](s16)      ; VI: $vgpr0 = COPY [[ANYEXT]](s32) @@ -290,11 +290,11 @@ body: |      ; GFX9: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32)      ; GFX9: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)      ; GFX9: [[AND:%[0-9]+]]:_(s16) = G_AND [[TRUNC1]], [[TRUNC]] +    ; GFX9: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; GFX9: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 -    ; GFX9: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[C1]](s32) -    ; GFX9: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) -    ; GFX9: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC3]], [[TRUNC2]](s16) -    ; GFX9: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC2]](s16) +    ; GFX9: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[C1]](s32) +    ; GFX9: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC2]], [[TRUNC3]](s16) +    ; GFX9: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC3]](s16)      ; GFX9: [[ASHR1:%[0-9]+]]:_(s16) = G_ASHR [[ASHR]], [[AND]](s16)      ; GFX9: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ASHR1]](s16)      ; GFX9: $vgpr0 = COPY [[ANYEXT]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract-vector-elt.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract-vector-elt.mir index ba8472648af..79326961285 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract-vector-elt.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract-vector-elt.mir @@ -205,8 +205,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_0_v2i8_i32      ; CHECK: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY [[DEF]](<2 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -249,8 +249,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_0_v2i1_i32      ; CHECK: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY [[DEF]](<2 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -276,8 +276,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_0_v2i1_i1      ; CHECK: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF      ; CHECK: [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 false -    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY [[DEF]](<2 x s32>) +    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C1]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C1]](s32) @@ -305,8 +305,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v2s8_varidx_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr2 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY2:%[0-9]+]]:_(<2 x s32>) = COPY [[COPY]](<2 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY2]](<2 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -334,8 +334,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v3s8_varidx_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr3 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY2:%[0-9]+]]:_(<3 x s32>) = COPY [[COPY]](<3 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY2]](<3 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -365,8 +365,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v4s8_varidx_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr4 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY2:%[0-9]+]]:_(<4 x s32>) = COPY [[COPY]](<4 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY2]](<4 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -475,8 +475,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v3s16_varidx_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr3 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY2:%[0-9]+]]:_(<3 x s32>) = COPY [[COPY]](<3 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY2]](<3 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -505,8 +505,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v3s16_idx0_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(<3 x s32>) = COPY [[COPY]](<3 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<3 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -535,8 +535,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v3s16_idx1_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(<3 x s32>) = COPY [[COPY]](<3 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<3 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) @@ -565,8 +565,8 @@ body: |      ; CHECK-LABEL: name: extract_vector_elt_v3s16_idx2_i32      ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(<3 x s32>) = COPY [[COPY]](<3 x s32>) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<3 x s32>)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[UV]], [[C]](s32)      ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[UV1]], [[C]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-icmp.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-icmp.mir index 31bd781a6da..94ec526518b 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-icmp.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-icmp.mir @@ -613,8 +613,8 @@ body: |      ; GFX7: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p3), [[UV3]]      ; GFX7: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; GFX7: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; GFX7: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX7: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; GFX7: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX7: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX7: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX7: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -631,8 +631,8 @@ body: |      ; GFX8: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p3), [[UV3]]      ; GFX8: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; GFX8: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; GFX8: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX8: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; GFX8: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX8: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX8: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX8: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -649,8 +649,8 @@ body: |      ; GFX9: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p3), [[UV3]]      ; GFX9: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; GFX9: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX9: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX9: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX9: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX9: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -679,8 +679,8 @@ body: |      ; GFX7: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p999), [[UV3]]      ; GFX7: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; GFX7: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; GFX7: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX7: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; GFX7: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX7: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX7: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX7: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -697,8 +697,8 @@ body: |      ; GFX8: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p999), [[UV3]]      ; GFX8: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; GFX8: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; GFX8: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX8: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; GFX8: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX8: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX8: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX8: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) @@ -715,8 +715,8 @@ body: |      ; GFX9: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[UV1]](p999), [[UV3]]      ; GFX9: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP]](s1)      ; GFX9: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[ICMP1]](s1) -    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX9: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ANYEXT]](s32) +    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; GFX9: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX9: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX9: [[COPY3:%[0-9]+]]:_(s32) = COPY [[ANYEXT1]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sext.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sext.mir index 841723b791f..a31686d6832 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sext.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sext.mir @@ -24,8 +24,8 @@ body: |      ; CHECK-LABEL: name: test_sext_s16_to_s64      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 -    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 48      ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 48      ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)      ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ANYEXT]], [[TRUNC]](s32)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64) @@ -45,8 +45,8 @@ body: |      ; CHECK-LABEL: name: test_sext_s16_to_s32      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; CHECK: $vgpr0 = COPY [[ASHR]](s32) @@ -64,8 +64,8 @@ body: |      ; CHECK-LABEL: name: test_sext_i1_to_s32      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 31      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; CHECK: $vgpr0 = COPY [[ASHR]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sextload-flat.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sextload-flat.mir index 98b5c45eced..c76d5063a88 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sextload-flat.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-sextload-flat.mir @@ -14,8 +14,8 @@ body: |      ; VI-LABEL: name: test_sextload_flat_i32_i8      ; VI: [[COPY:%[0-9]+]]:_(p0) = COPY $vgpr0_vgpr1      ; VI: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load 1) -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY [[LOAD]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: $vgpr0 = COPY [[ASHR]](s32) @@ -36,8 +36,8 @@ body: |      ; VI-LABEL: name: test_sextload_flat_i32_i16      ; VI: [[COPY:%[0-9]+]]:_(p0) = COPY $vgpr0_vgpr1      ; VI: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load 2) -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY [[LOAD]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: $vgpr0 = COPY [[ASHR]](s32) @@ -59,8 +59,8 @@ body: |      ; VI-LABEL: name: test_sextload_flat_i31_i8      ; VI: [[COPY:%[0-9]+]]:_(p0) = COPY $vgpr0_vgpr1      ; VI: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load 1) -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY [[LOAD]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[ASHR]](s32) @@ -84,8 +84,8 @@ body: |      ; VI-LABEL: name: test_sextload_flat_i64_i8      ; VI: [[COPY:%[0-9]+]]:_(p0) = COPY $vgpr0_vgpr1      ; VI: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load 1) -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY [[LOAD]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[ASHR]](s32) @@ -108,8 +108,8 @@ body: |      ; VI-LABEL: name: test_sextload_flat_i64_i16      ; VI: [[COPY:%[0-9]+]]:_(p0) = COPY $vgpr0_vgpr1      ; VI: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p0) :: (load 2) -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY [[LOAD]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: [[SEXT:%[0-9]+]]:_(s64) = G_SEXT [[ASHR]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smax.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smax.mir index 2413f3834f8..09cd4626746 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smax.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smax.mir @@ -39,8 +39,8 @@ body: |      ; SI-LABEL: name: test_smax_s16      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -83,8 +83,8 @@ body: |      ; SI-LABEL: name: test_smax_s8      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -96,12 +96,14 @@ body: |      ; VI-LABEL: name: test_smax_s8      ; VI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; VI: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8      ; VI: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32) -    ; VI: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; VI: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC1]], [[TRUNC]](s16)      ; VI: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC]](s16)      ; VI: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32) +    ; VI: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 +    ; VI: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C2]](s32)      ; VI: [[SHL1:%[0-9]+]]:_(s16) = G_SHL [[TRUNC2]], [[TRUNC]](s16)      ; VI: [[ASHR1:%[0-9]+]]:_(s16) = G_ASHR [[SHL1]], [[TRUNC]](s16)      ; VI: [[SMAX:%[0-9]+]]:_(s16) = G_SMAX [[ASHR]], [[ASHR1]] @@ -110,12 +112,14 @@ body: |      ; GFX9-LABEL: name: test_smax_s8      ; GFX9: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; GFX9: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; GFX9: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8      ; GFX9: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32) -    ; GFX9: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; GFX9: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC1]], [[TRUNC]](s16)      ; GFX9: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC]](s16)      ; GFX9: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32) +    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 +    ; GFX9: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32)      ; GFX9: [[SHL1:%[0-9]+]]:_(s16) = G_SHL [[TRUNC2]], [[TRUNC]](s16)      ; GFX9: [[ASHR1:%[0-9]+]]:_(s16) = G_ASHR [[SHL1]], [[TRUNC]](s16)      ; GFX9: [[SMAX:%[0-9]+]]:_(s16) = G_SMAX [[ASHR]], [[ASHR1]] @@ -139,8 +143,8 @@ body: |      ; SI-LABEL: name: test_smax_s17      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -152,8 +156,8 @@ body: |      ; VI-LABEL: name: test_smax_s17      ; VI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; VI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -165,8 +169,8 @@ body: |      ; GFX9-LABEL: name: test_smax_s17      ; GFX9: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; GFX9: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; GFX9: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; GFX9: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX9: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX9: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smin.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smin.mir index a57bef3bb32..bbd628709e4 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smin.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-smin.mir @@ -39,8 +39,8 @@ body: |      ; SI-LABEL: name: test_smin_s16      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -83,8 +83,8 @@ body: |      ; SI-LABEL: name: test_smin_s8      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -96,12 +96,14 @@ body: |      ; VI-LABEL: name: test_smin_s8      ; VI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; VI: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8      ; VI: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32) -    ; VI: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; VI: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC1]], [[TRUNC]](s16)      ; VI: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC]](s16)      ; VI: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32) +    ; VI: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 +    ; VI: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C2]](s32)      ; VI: [[SHL1:%[0-9]+]]:_(s16) = G_SHL [[TRUNC2]], [[TRUNC]](s16)      ; VI: [[ASHR1:%[0-9]+]]:_(s16) = G_ASHR [[SHL1]], [[TRUNC]](s16)      ; VI: [[SMIN:%[0-9]+]]:_(s16) = G_SMIN [[ASHR]], [[ASHR1]] @@ -110,12 +112,14 @@ body: |      ; GFX9-LABEL: name: test_smin_s8      ; GFX9: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; GFX9: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 +    ; GFX9: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8      ; GFX9: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32) -    ; GFX9: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)      ; GFX9: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[TRUNC1]], [[TRUNC]](s16)      ; GFX9: [[ASHR:%[0-9]+]]:_(s16) = G_ASHR [[SHL]], [[TRUNC]](s16)      ; GFX9: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32) +    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 +    ; GFX9: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[C]](s32)      ; GFX9: [[SHL1:%[0-9]+]]:_(s16) = G_SHL [[TRUNC2]], [[TRUNC]](s16)      ; GFX9: [[ASHR1:%[0-9]+]]:_(s16) = G_ASHR [[SHL1]], [[TRUNC]](s16)      ; GFX9: [[SMIN:%[0-9]+]]:_(s16) = G_SMIN [[ASHR]], [[ASHR1]] @@ -139,8 +143,8 @@ body: |      ; SI-LABEL: name: test_smin_s17      ; SI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; SI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; SI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; SI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; SI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; SI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; SI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -152,8 +156,8 @@ body: |      ; VI-LABEL: name: test_smin_s17      ; VI: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; VI: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; VI: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; VI: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; VI: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; VI: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; VI: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) @@ -165,8 +169,8 @@ body: |      ; GFX9-LABEL: name: test_smin_s17      ; GFX9: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0      ; GFX9: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 -    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; GFX9: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; GFX9: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 15      ; GFX9: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; GFX9: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; GFX9: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) diff --git a/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-divmod.mir b/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-divmod.mir index a14f89f06f6..bba007fbd8d 100644 --- a/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-divmod.mir +++ b/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-divmod.mir @@ -122,13 +122,13 @@ body:             |      ; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1      ; The G_TRUNC will combine with the extensions introduced by the legalizer,      ; leading to the following complicated sequences. -    ; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 -    ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] -    ; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] -    ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] -    ; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] -    ; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] -    ; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]] +    ; CHECK-DAG: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 +    ; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] +    ; CHECK-DAG: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] +    ; CHECK-DAG: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] +    ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] +    ; CHECK-DAG: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] +    ; CHECK-DAG: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]      %0(s32) = COPY $r0      %1(s16) = G_TRUNC %0(s32)      %2(s32) = COPY $r1 @@ -228,13 +228,13 @@ body:             |      ; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1      ; The G_TRUNC will combine with the extensions introduced by the legalizer,      ; leading to the following complicated sequences. -    ; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 -    ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] -    ; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] -    ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] -    ; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] -    ; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] -    ; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]] +    ; CHECK-DAG: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 +    ; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] +    ; CHECK-DAG: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] +    ; CHECK-DAG: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] +    ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] +    ; CHECK-DAG: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] +    ; CHECK-DAG: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]      %0(s32) = COPY $r0      %1(s8) = G_TRUNC %0(s32)      %2(s32) = COPY $r1 @@ -414,13 +414,13 @@ body:             |      ; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1      ; The G_TRUNC will combine with the extensions introduced by the legalizer,      ; leading to the following complicated sequences. -    ; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 -    ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] -    ; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] -    ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] -    ; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] -    ; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] -    ; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]] +    ; CHECK-DAG: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 +    ; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] +    ; CHECK-DAG: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] +    ; CHECK-DAG: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] +    ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] +    ; CHECK-DAG: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] +    ; CHECK-DAG: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]      %0(s32) = COPY $r0      %1(s16) = G_TRUNC %0(s32)      %2(s32) = COPY $r1 @@ -526,13 +526,13 @@ body:             |      ; CHECK-DAG: [[R1:%[0-9]+]]:_(s32) = COPY $r1      ; The G_TRUNC will combine with the extensions introduced by the legalizer,      ; leading to the following complicated sequences. -    ; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 -    ; CHECK: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] -    ; CHECK: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] -    ; CHECK: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] -    ; CHECK: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] -    ; CHECK: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] -    ; CHECK: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]] +    ; CHECK-DAG: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 +    ; CHECK-DAG: [[X:%[0-9]+]]:_(s32) = COPY [[R0]] +    ; CHECK-DAG: [[SHIFTEDX:%[0-9]+]]:_(s32) = G_SHL [[X]], [[BITS]] +    ; CHECK-DAG: [[X32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDX]], [[BITS]] +    ; CHECK-DAG: [[Y:%[0-9]+]]:_(s32) = COPY [[R1]] +    ; CHECK-DAG: [[SHIFTEDY:%[0-9]+]]:_(s32) = G_SHL [[Y]], [[BITS]] +    ; CHECK-DAG: [[Y32:%[0-9]+]]:_(s32) = G_ASHR [[SHIFTEDY]], [[BITS]]      %0(s32) = COPY $r0      %1(s8) = G_TRUNC %0(s32)      %2(s32) = COPY $r1 diff --git a/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-exts.mir b/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-exts.mir index 6fa6f58e11a..1f673b85068 100644 --- a/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-exts.mir +++ b/llvm/test/CodeGen/ARM/GlobalISel/arm-legalize-exts.mir @@ -3,6 +3,7 @@  --- |    define void @test_zext_s16_to_s32() { ret void }    define void @test_sext_s8_to_s32() { ret void } +  define void @test_sext_inreg_s8_to_s32() { ret void }    define void @test_anyext_s1_to_s32() { ret void }    define void @test_zext_s8_to_s16() { ret void } @@ -61,6 +62,32 @@ body:             |      BX_RET 14, $noreg, implicit $r0  ...  --- +name:            test_sext_inreg_s8_to_s32 +# CHECK-LABEL: name: test_sext_inreg_s8_to_s32 +legalized:       false +# CHECK: legalized: true +regBankSelected: false +selected:        false +tracksRegLiveness: true +registers: +  - { id: 0, class: _ } +  - { id: 1, class: _ } +  - { id: 2, class: _ } +body:             | +  bb.0: +    liveins: $r0 + +    %0(p0) = COPY $r0 +    %1(s32) = G_LOAD %0(p0) :: (load 4) +    %2(s32) = G_SEXT_INREG %1, 8 +    ; G_SEXT_INREG should be lowered to a shift pair +    ; CHECK: [[T1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 +    ; CHECK: [[T2:%[0-9]+]]:_(s32) = G_SHL {{%[0-9]+}}, [[T1]] +    ; CHECK: {{%[0-9]+}}:_(s32) = G_ASHR [[T2]], [[T1]] +    $r0 = COPY %2(s32) +    BX_RET 14, $noreg, implicit $r0 +... +---  name:            test_anyext_s1_to_s32  # CHECK-LABEL: name: test_anyext_s1_to_s32  legalized:       false @@ -188,8 +215,8 @@ body:             |      ; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[V8]](s8)      ; CHECK: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[V8]](s8)      ; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SEXT]] -    ; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[OR]] +    ; CHECK: [[BITS:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[BITS]](s32)      ; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[BITS]](s32)      ; CHECK: $r0 = COPY [[ASHR]] diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/add.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/add.mir index dba5bc0e848..b3123333703 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/add.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/add.mir @@ -51,8 +51,8 @@ body:             |      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]] -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) @@ -140,8 +140,8 @@ body:             |      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[ADD:%[0-9]+]]:_(s32) = G_ADD [[COPY2]], [[COPY3]] -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[ADD]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/constants.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/constants.mir index d223411c58a..a2b754ad3fc 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/constants.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/constants.mir @@ -54,10 +54,10 @@ body:             |    bb.1.entry:      ; MIPS32-LABEL: name: signed_i16      ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -32768 -    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32) -    ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C1]] -    ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]] +    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 +    ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C1]](s32) +    ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32)      ; MIPS32: RetRA implicit $v0      %0:_(s16) = G_CONSTANT i16 -32768 @@ -74,10 +74,10 @@ body:             |    bb.1.entry:      ; MIPS32-LABEL: name: signed_i8      ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -128 -    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32) -    ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C1]] -    ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]] +    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 +    ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY]], [[C1]](s32) +    ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32)      ; MIPS32: RetRA implicit $v0      %0:_(s8) = G_CONSTANT i8 -128 diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/fptosi_and_fptoui.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/fptosi_and_fptoui.mir index 73f24fedfcf..96f7868e09f 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/fptosi_and_fptoui.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/fptosi_and_fptoui.mir @@ -93,8 +93,8 @@ body:             |      ; FP32: liveins: $f12      ; FP32: [[COPY:%[0-9]+]]:_(s32) = COPY $f12      ; FP32: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32) -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: $v0 = COPY [[ASHR]](s32) @@ -103,8 +103,8 @@ body:             |      ; FP64: liveins: $f12      ; FP64: [[COPY:%[0-9]+]]:_(s32) = COPY $f12      ; FP64: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32) -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: $v0 = COPY [[ASHR]](s32) @@ -128,8 +128,8 @@ body:             |      ; FP32: liveins: $f12      ; FP32: [[COPY:%[0-9]+]]:_(s32) = COPY $f12      ; FP32: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32) -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: $v0 = COPY [[ASHR]](s32) @@ -138,8 +138,8 @@ body:             |      ; FP64: liveins: $f12      ; FP64: [[COPY:%[0-9]+]]:_(s32) = COPY $f12      ; FP64: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s32) -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: $v0 = COPY [[ASHR]](s32) @@ -229,8 +229,8 @@ body:             |      ; FP32: liveins: $d6      ; FP32: [[COPY:%[0-9]+]]:_(s64) = COPY $d6      ; FP32: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s64) -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: $v0 = COPY [[ASHR]](s32) @@ -239,8 +239,8 @@ body:             |      ; FP64: liveins: $d6      ; FP64: [[COPY:%[0-9]+]]:_(s64) = COPY $d6      ; FP64: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s64) -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: $v0 = COPY [[ASHR]](s32) @@ -264,8 +264,8 @@ body:             |      ; FP32: liveins: $d6      ; FP32: [[COPY:%[0-9]+]]:_(s64) = COPY $d6      ; FP32: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s64) -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: $v0 = COPY [[ASHR]](s32) @@ -274,8 +274,8 @@ body:             |      ; FP64: liveins: $d6      ; FP64: [[COPY:%[0-9]+]]:_(s64) = COPY $d6      ; FP64: [[FPTOSI:%[0-9]+]]:_(s32) = G_FPTOSI [[COPY]](s64) -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[FPTOSI]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: $v0 = COPY [[ASHR]](s32) diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/icmp.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/icmp.mir index c60767a1afc..b25b0720640 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/icmp.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/icmp.mir @@ -109,8 +109,8 @@ body:             |      ; MIPS32: liveins: $a0, $a1      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0      ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/mul.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/mul.mir index cfb68cb2330..351bf5efcdf 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/mul.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/mul.mir @@ -52,8 +52,8 @@ body:             |      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[COPY3]] -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[MUL]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) @@ -141,8 +141,8 @@ body:             |      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[MUL:%[0-9]+]]:_(s32) = G_MUL [[COPY2]], [[COPY3]] -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[MUL]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/rem_and_div.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/rem_and_div.mir index cc31f068151..57b234d0f9b 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/rem_and_div.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/rem_and_div.mir @@ -32,8 +32,8 @@ body:             |      ; MIPS32: liveins: $a0, $a1      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0      ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) @@ -67,8 +67,8 @@ body:             |      ; MIPS32: liveins: $a0, $a1      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0      ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) @@ -163,8 +163,8 @@ body:             |      ; MIPS32: liveins: $a0, $a1      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0      ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) @@ -198,8 +198,8 @@ body:             |      ; MIPS32: liveins: $a0, $a1      ; MIPS32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0      ; MIPS32: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) @@ -300,8 +300,8 @@ body:             |      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C]]      ; MIPS32: [[UDIV:%[0-9]+]]:_(s32) = G_UDIV [[AND]], [[AND1]] -    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[UDIV]](s32) +    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C1]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) @@ -334,8 +334,8 @@ body:             |      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C]]      ; MIPS32: [[UDIV:%[0-9]+]]:_(s32) = G_UDIV [[AND]], [[AND1]] -    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[UDIV]](s32) +    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C1]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) @@ -429,8 +429,8 @@ body:             |      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C]]      ; MIPS32: [[UREM:%[0-9]+]]:_(s32) = G_UREM [[AND]], [[AND1]] -    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[UREM]](s32) +    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C1]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) @@ -463,8 +463,8 @@ body:             |      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C]]      ; MIPS32: [[UREM:%[0-9]+]]:_(s32) = G_UREM [[AND]], [[AND1]] -    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[UREM]](s32) +    ; MIPS32: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C1]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sitofp_and_uitofp.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sitofp_and_uitofp.mir index 00abc06bd2d..7a8ed1e3a6a 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sitofp_and_uitofp.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sitofp_and_uitofp.mir @@ -92,8 +92,8 @@ body:             |      ; FP32-LABEL: name: i16tof32      ; FP32: liveins: $a0      ; FP32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: [[SITOFP:%[0-9]+]]:_(s32) = G_SITOFP [[ASHR]](s32) @@ -102,8 +102,8 @@ body:             |      ; FP64-LABEL: name: i16tof32      ; FP64: liveins: $a0      ; FP64: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: [[SITOFP:%[0-9]+]]:_(s32) = G_SITOFP [[ASHR]](s32) @@ -127,8 +127,8 @@ body:             |      ; FP32-LABEL: name: i8tof32      ; FP32: liveins: $a0      ; FP32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: [[SITOFP:%[0-9]+]]:_(s32) = G_SITOFP [[ASHR]](s32) @@ -137,8 +137,8 @@ body:             |      ; FP64-LABEL: name: i8tof32      ; FP64: liveins: $a0      ; FP64: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: [[SITOFP:%[0-9]+]]:_(s32) = G_SITOFP [[ASHR]](s32) @@ -228,8 +228,8 @@ body:             |      ; FP32-LABEL: name: i16tof64      ; FP32: liveins: $a0      ; FP32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: [[SITOFP:%[0-9]+]]:_(s64) = G_SITOFP [[ASHR]](s32) @@ -238,8 +238,8 @@ body:             |      ; FP64-LABEL: name: i16tof64      ; FP64: liveins: $a0      ; FP64: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: [[SITOFP:%[0-9]+]]:_(s64) = G_SITOFP [[ASHR]](s32) @@ -263,8 +263,8 @@ body:             |      ; FP32-LABEL: name: i8tof64      ; FP32: liveins: $a0      ; FP32: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP32: [[SITOFP:%[0-9]+]]:_(s64) = G_SITOFP [[ASHR]](s32) @@ -273,8 +273,8 @@ body:             |      ; FP64-LABEL: name: i8tof64      ; FP64: liveins: $a0      ; FP64: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 -    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; FP64: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; FP64: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C]](s32)      ; FP64: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; FP64: [[SITOFP:%[0-9]+]]:_(s64) = G_SITOFP [[ASHR]](s32) diff --git a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sub.mir b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sub.mir index d06287cf094..2e02eb07174 100644 --- a/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sub.mir +++ b/llvm/test/CodeGen/Mips/GlobalISel/legalizer/sub.mir @@ -50,8 +50,8 @@ body:             |      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]] -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) @@ -139,8 +139,8 @@ body:             |      ; MIPS32: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)      ; MIPS32: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)      ; MIPS32: [[SUB:%[0-9]+]]:_(s32) = G_SUB [[COPY2]], [[COPY3]] -    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[COPY4:%[0-9]+]]:_(s32) = COPY [[SUB]](s32) +    ; MIPS32: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; MIPS32: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY4]], [[C]](s32)      ; MIPS32: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C]](s32)      ; MIPS32: $v0 = COPY [[ASHR]](s32) diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir index 8685b058aea..aafedd3b5b7 100644 --- a/llvm/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir +++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-ext-x86-64.mir @@ -77,8 +77,8 @@ body:             |      ; CHECK-LABEL: name: test_sext_i1      ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $dil -    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 63      ; CHECK: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s8) +    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 63      ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s64)      ; CHECK: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ANYEXT]], [[TRUNC]](s8)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s64) diff --git a/llvm/test/CodeGen/X86/GlobalISel/x86_64-legalize-sitofp.mir b/llvm/test/CodeGen/X86/GlobalISel/x86_64-legalize-sitofp.mir index 0df0cdc2fc0..7a69731652d 100644 --- a/llvm/test/CodeGen/X86/GlobalISel/x86_64-legalize-sitofp.mir +++ b/llvm/test/CodeGen/X86/GlobalISel/x86_64-legalize-sitofp.mir @@ -88,8 +88,8 @@ body:             |      ; CHECK-LABEL: name: int8_to_float      ; CHECK: liveins: $edi      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[TRUNC]](s8)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32) @@ -122,8 +122,8 @@ body:             |      ; CHECK-LABEL: name: int16_to_float      ; CHECK: liveins: $edi      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[TRUNC]](s8)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32) @@ -208,8 +208,8 @@ body:             |      ; CHECK-LABEL: name: int8_to_double      ; CHECK: liveins: $edi      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 24      ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[TRUNC]](s8)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32) @@ -242,8 +242,8 @@ body:             |      ; CHECK-LABEL: name: int16_to_double      ; CHECK: liveins: $edi      ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $edi -    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY [[COPY]](s32) +    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16      ; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32)      ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[TRUNC]](s8)      ; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[C]](s32) diff --git a/llvm/test/MachineVerifier/test_g_sext_inreg.mir b/llvm/test/MachineVerifier/test_g_sext_inreg.mir new file mode 100644 index 00000000000..03159424321 --- /dev/null +++ b/llvm/test/MachineVerifier/test_g_sext_inreg.mir @@ -0,0 +1,53 @@ +# RUN: not llc -verify-machineinstrs -run-pass none -o /dev/null %s 2>&1 | FileCheck %s + +--- | + +  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" +  target triple = "aarch64--" +  define void @test() { ret void } + +... + +--- +name:            test +registers: +  - { id: 0, class: gpr } +  - { id: 1, class: gpr } +  - { id: 2, class: gpr } +  - { id: 3, class: gpr } +  - { id: 4, class: gpr } +  - { id: 5, class: gpr } +  - { id: 6, class: gpr } +  - { id: 7, class: gpr } +body: | +  bb.0: +   liveins: $x0 +   %0(s64) = COPY $x0 +   %1(<4 x s16>) = COPY $x0 + +   ; CHECK: *** Bad machine code: G_SEXT_INREG expects an immediate operand #2 *** +   ; CHECK: instruction: %2:gpr(s64) = G_SEXT_INREG +   %2(s64) = G_SEXT_INREG %0, %0 + +   ; CHECK: *** Bad machine code: G_SEXT_INREG expects an immediate operand #2 *** +   ; CHECK: instruction: %3:gpr(s64) = G_SEXT_INREG +   %3(s64) = G_SEXT_INREG %0, i8 8 + +   ; CHECK: *** Bad machine code: Type mismatch in generic instruction *** +   ; CHECK: instruction: %4:gpr(<2 x s32>) = G_SEXT_INREG +   ; CHECK: *** Bad machine code: operand types must be all-vector or all-scalar *** +   ; CHECK: instruction: %4:gpr(<2 x s32>) = G_SEXT_INREG +   %4(<2 x s32>) = G_SEXT_INREG %0, 8 + +   ; CHECK: *** Bad machine code: operand types must preserve number of vector elements *** +   ; CHECK: instruction: %5:gpr(<2 x s32>) = G_SEXT_INREG +   %5(<2 x s32>) = G_SEXT_INREG %1, 8 + +   ; CHECK: *** Bad machine code: G_SEXT_INREG size must be >= 1 *** +   ; CHECK: instruction: %6:gpr(s64) = G_SEXT_INREG +   %6(s64) = G_SEXT_INREG %0, 0 + +   ; CHECK: *** Bad machine code: G_SEXT_INREG size must be less than source bit width *** +   ; CHECK: instruction: %7:gpr(s64) = G_SEXT_INREG +   %7(s64) = G_SEXT_INREG %0, 128 +... diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 98d12930b72..f96804a5645 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -1056,4 +1056,131 @@ TEST_F(GISelMITest, WidenScalarMergeValuesPointer) {    EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;  } +TEST_F(GISelMITest, WidenSEXTINREG) { +  if (!TM) +    return; + +  // Declare your legalization info +  DefineLegalizerInfo(A, { +    getActionDefinitionsBuilder(G_SEXT_INREG).legalForTypeWithAnyImm({s64}); +  }); +  // Build Instr +  auto MIB = B.buildInstr( +      TargetOpcode::G_SEXT_INREG, {LLT::scalar(32)}, +      {B.buildInstr(TargetOpcode::G_TRUNC, {LLT::scalar(32)}, {Copies[0]}), +       uint64_t(8)}); +  AInfo Info(MF->getSubtarget()); +  DummyGISelObserver Observer; +  LegalizerHelper Helper(*MF, Info, Observer, B); +  // Perform Legalization +  ASSERT_TRUE(Helper.widenScalar(*MIB, 0, LLT::scalar(64)) == +              LegalizerHelper::LegalizeResult::Legalized); + +  auto CheckStr = R"( +  CHECK: [[T0:%[0-9]+]]:_(s32) = G_TRUNC +  CHECK: [[T1:%[0-9]+]]:_(s64) = G_ANYEXT [[T0]]:_(s32) +  CHECK: [[T2:%[0-9]+]]:_(s64) = G_SEXT_INREG [[T1]]:_, 8 +  CHECK: [[T3:%[0-9]+]]:_(s32) = G_TRUNC [[T2]]:_(s64) +  )"; + +  // Check +  ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); +} + +TEST_F(GISelMITest, NarrowSEXTINREG) { +  if (!TM) +    return; + +  // Declare your legalization info, these aren't actually relevant to the test. +  DefineLegalizerInfo(A, { +    getActionDefinitionsBuilder(G_SEXT_INREG).legalForTypeWithAnyImm({s64}); +  }); +  // Build Instr +  auto MIB = B.buildInstr( +      TargetOpcode::G_SEXT_INREG, {LLT::scalar(16)}, +      {B.buildInstr(TargetOpcode::G_TRUNC, {LLT::scalar(16)}, {Copies[0]}), +       uint64_t(8)}); +  MIB->getParent()->dump(); +  AInfo Info(MF->getSubtarget()); +  DummyGISelObserver Observer; +  LegalizerHelper Helper(*MF, Info, Observer, B); +  // Perform Legalization +  ASSERT_TRUE(Helper.narrowScalar(*MIB, 0, LLT::scalar(10)) == +              LegalizerHelper::LegalizeResult::Legalized); +  MIB->getParent()->dump(); + +  auto CheckStr = R"( +  CHECK: [[T0:%[0-9]+]]:_(s16) = G_TRUNC +  CHECK: [[T1:%[0-9]+]]:_(s10) = G_TRUNC [[T0]]:_(s16) +  CHECK: [[T2:%[0-9]+]]:_(s10) = G_SEXT_INREG [[T1]]:_, 8 +  CHECK: [[T3:%[0-9]+]]:_(s16) = G_SEXT [[T2]]:_(s10) +  )"; + +  // Check +  ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); +} + +TEST_F(GISelMITest, NarrowSEXTINREG2) { +  if (!TM) +    return; + +  // Declare your legalization info, these aren't actually relevant to the test. +  DefineLegalizerInfo( +      A, { getActionDefinitionsBuilder(G_SEXT_INREG).legalForTypeWithAnyImm({s64}); }); +  // Build Instr +  auto MIB = B.buildInstr( +      TargetOpcode::G_SEXT_INREG, {LLT::scalar(32)}, +      {B.buildInstr(TargetOpcode::G_TRUNC, {LLT::scalar(32)}, {Copies[0]}), +       uint64_t(9)}); +  AInfo Info(MF->getSubtarget()); +  DummyGISelObserver Observer; +  LegalizerHelper Helper(*MF, Info, Observer, B); +  // Perform Legalization +  ASSERT_TRUE(Helper.narrowScalar(*MIB, 0, LLT::scalar(8)) == +              LegalizerHelper::LegalizeResult::Legalized); +  MF->dump(); + +  auto CheckStr = R"( +  CHECK: [[T0:%[0-9]+]]:_(s32) = G_TRUNC +  CHECK: [[T1:%[0-9]+]]:_(s8), [[T2:%[0-9]+]]:_(s8), [[T3:%[0-9]+]]:_(s8), [[T4:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[T0]]:_(s32) +  CHECK: [[CST2:%[0-9]+]]:_(s8) = G_CONSTANT i8 7 +  CHECK: [[T5:%[0-9]+]]:_(s8) = G_SEXT_INREG [[T2]]:_, 1 +  CHECK: [[T6:%[0-9]+]]:_(s8) = G_ASHR [[T5]]:_, [[CST2]]:_ +  CHECK: [[T7:%[0-9]+]]:_(s32) = G_MERGE_VALUES [[T1]]:_(s8), [[T5]]:_(s8), [[T6]]:_(s8), [[T6]]:_(s8) +  )"; + +  // Check +  ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); +} + +TEST_F(GISelMITest, LowerSEXTINREG) { +  if (!TM) +    return; + +  // Declare your legalization info, these aren't actually relevant to the test. +  DefineLegalizerInfo( +      A, { getActionDefinitionsBuilder(G_SEXT_INREG).legalForTypeWithAnyImm({s64}); }); +  // Build Instr +  auto MIB = B.buildInstr( +      TargetOpcode::G_SEXT_INREG, {LLT::scalar(32)}, +      {B.buildInstr(TargetOpcode::G_TRUNC, {LLT::scalar(32)}, {Copies[0]}), +       uint64_t(8)}); +  AInfo Info(MF->getSubtarget()); +  DummyGISelObserver Observer; +  LegalizerHelper Helper(*MF, Info, Observer, B); +  // Perform Legalization +  ASSERT_TRUE(Helper.lower(*MIB, 0, LLT()) == +              LegalizerHelper::LegalizeResult::Legalized); +  MF->dump(); + +  auto CheckStr = R"( +  CHECK: [[T1:%[0-9]+]]:_(s32) = G_TRUNC +  CHECK: [[CST:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 +  CHECK: [[T2:%[0-9]+]]:_(s32) = G_SHL [[T1]]:_, [[CST]]:_ +  CHECK: [[T3:%[0-9]+]]:_(s32) = G_ASHR [[T2]]:_, [[CST]]:_ +  )"; + +  // Check +  ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); +}  } // namespace diff --git a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp index 7ba79188cb7..de6445175e4 100644 --- a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -266,6 +266,22 @@ TEST(PatternMatchInstr, MatchBinaryOp) {    match = mi_match(MIBCSub->getOperand(0).getReg(), MRI, m_ICst(Cst));    EXPECT_TRUE(match);    EXPECT_EQ(Cst, 0); + +  auto MIBCSext1 = +      CFB1.buildInstr(TargetOpcode::G_SEXT_INREG, {s32}, +                      {CFB1.buildConstant(s32, 0x01), uint64_t(8)}); +  // This should be a constant now. +  match = mi_match(MIBCSext1->getOperand(0).getReg(), MRI, m_ICst(Cst)); +  EXPECT_TRUE(match); +  EXPECT_EQ(1, Cst); + +  auto MIBCSext2 = +      CFB1.buildInstr(TargetOpcode::G_SEXT_INREG, {s32}, +                      {CFB1.buildConstant(s32, 0x80), uint64_t(8)}); +  // This should be a constant now. +  match = mi_match(MIBCSext2->getOperand(0).getReg(), MRI, m_ICst(Cst)); +  EXPECT_TRUE(match); +  EXPECT_EQ(-0x80, Cst);  }  TEST(PatternMatchInstr, MatchFPUnaryOp) {  | 

