diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelLowering.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonISelLowering.h | 2 |
2 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp index 6ae52701f7f..6387ac2ef67 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -2323,6 +2323,18 @@ bool HexagonTargetLowering::isShuffleMaskLegal(ArrayRef<int> Mask, return true; } +TargetLoweringBase::LegalizeTypeAction +HexagonTargetLowering::getPreferredVectorAction(EVT VT) const { + if (Subtarget.useHVXOps()) { + // If the size of VT is at least half of the vector length, + // widen the vector. Note: the threshold was not selected in + // any scientific way. + if (VT.getSizeInBits() >= Subtarget.getVectorLength()*8/2) + return TargetLoweringBase::TypeWidenVector; + } + return TargetLowering::getPreferredVectorAction(VT); +} + // Lower a vector shuffle (V1, V2, V3). V1 and V2 are the two vectors // to select data from, V3 is the permutation. SDValue diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.h b/llvm/lib/Target/Hexagon/HexagonISelLowering.h index 07f8b0c9c14..2705fcbf8d6 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.h +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.h @@ -122,6 +122,8 @@ namespace HexagonISD { unsigned DefinedValues) const override; bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override; + TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(EVT VT) + const override; SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; const char *getTargetNodeName(unsigned Opcode) const override; |