diff options
author | David Green <david.green@arm.com> | 2019-09-19 12:17:41 +0000 |
---|---|---|
committer | David Green <david.green@arm.com> | 2019-09-19 12:17:41 +0000 |
commit | 0cfb78e52af247366e6e8fe00a906022bf4abca5 (patch) | |
tree | d1f6e40aaad275d9a01c98f0d8ee257833b3b4ab /llvm/lib | |
parent | ec841cf36ca1cb6a154393d7e9f48e8723a38966 (diff) | |
download | bcm5719-llvm-0cfb78e52af247366e6e8fe00a906022bf4abca5.tar.gz bcm5719-llvm-0cfb78e52af247366e6e8fe00a906022bf4abca5.zip |
[ARM] MVE i1 splat
We needn't BFI each lane individually into a predicate register when each lane
in the same. A simple sign extend and a vmsr will do.
Differential Revision: https://reviews.llvm.org/D67653
llvm-svn: 372313
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index d3adf5e4722..e30b878d84e 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -6945,6 +6945,19 @@ static SDValue LowerBUILD_VECTOR_i1(SDValue Op, SelectionDAG &DAG, } else return SDValue(); + // If this is a single value copied into all lanes (a splat), we can just sign + // extend that single value + SDValue FirstOp = Op.getOperand(0); + if (!isa<ConstantSDNode>(FirstOp) && + std::all_of(std::next(Op->op_begin()), Op->op_end(), + [&FirstOp](SDUse &U) { + return U.get().isUndef() || U.get() == FirstOp; + })) { + SDValue Ext = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, MVT::i32, FirstOp, + DAG.getValueType(MVT::i1)); + return DAG.getNode(ARMISD::PREDICATE_CAST, dl, Op.getValueType(), Ext); + } + // First create base with bits set where known unsigned Bits32 = 0; for (unsigned i = 0; i < NumElts; ++i) { @@ -6957,7 +6970,6 @@ static SDValue LowerBUILD_VECTOR_i1(SDValue Op, SelectionDAG &DAG, } // Add in unknown nodes - // FIXME: Handle splats of the same value better. SDValue Base = DAG.getNode(ARMISD::PREDICATE_CAST, dl, VT, DAG.getConstant(Bits32, dl, MVT::i32)); for (unsigned i = 0; i < NumElts; ++i) { |