diff options
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp index 70045512fae5..02f6b39e0905 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerInfo.cpp @@ -128,24 +128,26 @@ static bool mutationIsSane(const LegalizeRule &Rule, switch (Rule.getAction()) { case FewerElements: - case MoreElements: { if (!OldTy.isVector()) return false; - + LLVM_FALLTHROUGH; + case MoreElements: { + // MoreElements can go from scalar to vector. + const unsigned OldElts = OldTy.isVector() ? OldTy.getNumElements() : 1; if (NewTy.isVector()) { if (Rule.getAction() == FewerElements) { // Make sure the element count really decreased. - if (NewTy.getNumElements() >= OldTy.getNumElements()) + if (NewTy.getNumElements() >= OldElts) return false; } else { // Make sure the element count really increased. - if (NewTy.getNumElements() <= OldTy.getNumElements()) + if (NewTy.getNumElements() <= OldElts) return false; } } // Make sure the element type didn't change. - return NewTy.getScalarType() == OldTy.getElementType(); + return NewTy.getScalarType() == OldTy.getScalarType(); } case NarrowScalar: case WidenScalar: { @@ -685,6 +687,10 @@ bool LegalizerInfo::legalizeIntrinsic(MachineInstr &MI, return true; } +unsigned LegalizerInfo::getExtOpcodeForWideningConstant(LLT SmallTy) const { + return SmallTy.isByteSized() ? TargetOpcode::G_SEXT : TargetOpcode::G_ZEXT; +} + /// \pre Type indices of every opcode form a dense set starting from 0. void LegalizerInfo::verify(const MCInstrInfo &MII) const { #ifndef NDEBUG |