diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-07 17:25:51 +0000 | 
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-07 17:25:51 +0000 | 
| commit | 91be65be656072a68b51a8c4e7bb751ea475d896 (patch) | |
| tree | d3c63504f16de21d3e4e6dce07fa57b024c084c1 /llvm/include | |
| parent | bae220ce9c2b774e06bb0e811ccb0d7a018c526f (diff) | |
| download | bcm5719-llvm-91be65be656072a68b51a8c4e7bb751ea475d896.tar.gz bcm5719-llvm-91be65be656072a68b51a8c4e7bb751ea475d896.zip | |
GlobalISel: Try to make legalize rules more useful for vectors
Mostly keep the existing functions on scalars, but add versions which
also operate based on the vector element size.
llvm-svn: 353430
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h | 80 | ||||
| -rw-r--r-- | llvm/include/llvm/Support/LowLevelTypeImpl.h | 16 | 
2 files changed, 86 insertions, 10 deletions
| diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h index 66a722ef8e1..59791738fdf 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h @@ -215,12 +215,27 @@ LegalityPredicate isPointer(unsigned TypeIdx, unsigned AddrSpace);  /// True iff the specified type index is a scalar that's narrower than the given  /// size.  LegalityPredicate narrowerThan(unsigned TypeIdx, unsigned Size); +  /// True iff the specified type index is a scalar that's wider than the given  /// size.  LegalityPredicate widerThan(unsigned TypeIdx, unsigned Size); + +/// True iff the specified type index is a scalar or vector with an element type +/// that's narrower than the given size. +LegalityPredicate scalarOrEltNarrowerThan(unsigned TypeIdx, unsigned Size); + +/// True iff the specified type index is a scalar or a vector with an element +/// type that's wider than the given size. +LegalityPredicate scalarOrEltWiderThan(unsigned TypeIdx, unsigned Size); +  /// True iff the specified type index is a scalar whose size is not a power of  /// 2.  LegalityPredicate sizeNotPow2(unsigned TypeIdx); + +/// True iff the specified type index is a scalar or vector whose element size +/// is not a power of 2. +LegalityPredicate scalarOrEltSizeNotPow2(unsigned TypeIdx); +  /// True iff the specified type indices are both the same bit size.  LegalityPredicate sameSize(unsigned TypeIdx0, unsigned TypeIdx1);  /// True iff the specified MMO index has a size that is not a power of 2 @@ -237,10 +252,20 @@ LegalityPredicate atomicOrderingAtLeastOrStrongerThan(unsigned MMOIdx,  namespace LegalizeMutations {  /// Select this specific type for the given type index.  LegalizeMutation changeTo(unsigned TypeIdx, LLT Ty); +  /// Keep the same type as the given type index.  LegalizeMutation changeTo(unsigned TypeIdx, unsigned FromTypeIdx); -/// Widen the type for the given type index to the next power of 2. -LegalizeMutation widenScalarToNextPow2(unsigned TypeIdx, unsigned Min = 0); + +/// Keep the same scalar or element type as the given type index. +LegalizeMutation changeElementTo(unsigned TypeIdx, unsigned FromTypeIdx); + +/// Keep the same scalar or element type as the given type. +LegalizeMutation changeElementTo(unsigned TypeIdx, LLT Ty); + +/// Widen the scalar type or vector element type for the given type index to the +/// next power of 2. +LegalizeMutation widenScalarOrEltToNextPow2(unsigned TypeIdx, unsigned Min = 0); +  /// Add more elements to the type for the given type index to the next power of  /// 2.  LegalizeMutation moreElementsToNextPow2(unsigned TypeIdx, unsigned Min = 0); @@ -618,8 +643,19 @@ public:    LegalizeRuleSet &widenScalarToNextPow2(unsigned TypeIdx,                                           unsigned MinSize = 0) {      using namespace LegalityPredicates; -    return actionIf(LegalizeAction::WidenScalar, sizeNotPow2(typeIdx(TypeIdx)), -                    LegalizeMutations::widenScalarToNextPow2(TypeIdx, MinSize)); +    return actionIf( +        LegalizeAction::WidenScalar, sizeNotPow2(typeIdx(TypeIdx)), +        LegalizeMutations::widenScalarOrEltToNextPow2(TypeIdx, MinSize)); +  } + +  /// Widen the scalar or vector element type to the next power of two that is +  /// at least MinSize.  No effect if the scalar size is a power of two. +  LegalizeRuleSet &widenScalarOrEltToNextPow2(unsigned TypeIdx, +                                              unsigned MinSize = 0) { +    using namespace LegalityPredicates; +    return actionIf( +        LegalizeAction::WidenScalar, scalarOrEltSizeNotPow2(typeIdx(TypeIdx)), +        LegalizeMutations::widenScalarOrEltToNextPow2(TypeIdx, MinSize));    }    LegalizeRuleSet &narrowScalar(unsigned TypeIdx, LegalizeMutation Mutation) { @@ -635,6 +671,15 @@ public:    }    /// Ensure the scalar is at least as wide as Ty. +  LegalizeRuleSet &minScalarOrElt(unsigned TypeIdx, const LLT &Ty) { +    using namespace LegalityPredicates; +    using namespace LegalizeMutations; +    return actionIf(LegalizeAction::WidenScalar, +                    scalarOrEltNarrowerThan(TypeIdx, Ty.getScalarSizeInBits()), +                    changeElementTo(typeIdx(TypeIdx), Ty)); +  } + +  /// Ensure the scalar is at least as wide as Ty.    LegalizeRuleSet &minScalar(unsigned TypeIdx, const LLT &Ty) {      using namespace LegalityPredicates;      using namespace LegalizeMutations; @@ -644,6 +689,15 @@ public:    }    /// Ensure the scalar is at most as wide as Ty. +  LegalizeRuleSet &maxScalarOrElt(unsigned TypeIdx, const LLT &Ty) { +    using namespace LegalityPredicates; +    using namespace LegalizeMutations; +    return actionIf(LegalizeAction::NarrowScalar, +                    scalarOrEltWiderThan(TypeIdx, Ty.getScalarSizeInBits()), +                    changeElementTo(typeIdx(TypeIdx), Ty)); +  } + +  /// Ensure the scalar is at most as wide as Ty.    LegalizeRuleSet &maxScalar(unsigned TypeIdx, const LLT &Ty) {      using namespace LegalityPredicates;      using namespace LegalizeMutations; @@ -659,12 +713,12 @@ public:                                 const LLT &Ty) {      using namespace LegalityPredicates;      using namespace LegalizeMutations; -    return actionIf(LegalizeAction::NarrowScalar, -                    [=](const LegalityQuery &Query) { -                      return widerThan(TypeIdx, Ty.getSizeInBits()) && -                             Predicate(Query); -                    }, -                    changeTo(typeIdx(TypeIdx), Ty)); +    return actionIf( +        LegalizeAction::NarrowScalar, +        [=](const LegalityQuery &Query) { +          return widerThan(TypeIdx, Ty.getSizeInBits()) && Predicate(Query); +        }, +        changeElementTo(typeIdx(TypeIdx), Ty));    }    /// Limit the range of scalar sizes to MinTy and MaxTy. @@ -674,6 +728,12 @@ public:      return minScalar(TypeIdx, MinTy).maxScalar(TypeIdx, MaxTy);    } +  /// Limit the range of scalar sizes to MinTy and MaxTy. +  LegalizeRuleSet &clampScalarOrElt(unsigned TypeIdx, const LLT &MinTy, +                                    const LLT &MaxTy) { +    return minScalarOrElt(TypeIdx, MinTy).maxScalarOrElt(TypeIdx, MaxTy); +  } +    /// Widen the scalar to match the size of another.    LegalizeRuleSet &minScalarSameAs(unsigned TypeIdx, unsigned LargeTypeIdx) {      typeIdx(TypeIdx); diff --git a/llvm/include/llvm/Support/LowLevelTypeImpl.h b/llvm/include/llvm/Support/LowLevelTypeImpl.h index 86422500ac5..efe5c51d1a5 100644 --- a/llvm/include/llvm/Support/LowLevelTypeImpl.h +++ b/llvm/include/llvm/Support/LowLevelTypeImpl.h @@ -115,6 +115,22 @@ public:      return isVector() ? getElementType() : *this;    } +  /// If this type is a vector, return a vector with the same number of elements +  /// but the new element type. Otherwise, return the new element type. +  LLT changeElementType(LLT NewEltTy) const { +    return isVector() ? LLT::vector(getNumElements(), NewEltTy) : NewEltTy; +  } + +  /// If this type is a vector, return a vector with the same number of elements +  /// but the new element size. Otherwise, return the new element type. Invalid +  /// for pointer types. For pointer types, use changeElementType. +  LLT changeElementSize(unsigned NewEltSize) const { +    assert(!getScalarType().isPointer() && +           "invalid to directly change element size for pointers"); +    return isVector() ? LLT::vector(getNumElements(), NewEltSize) +                      : LLT::scalar(NewEltSize); +  } +    unsigned getScalarSizeInBits() const {      assert(RawData != 0 && "Invalid Type");      if (!IsVector) { | 

