diff options
| author | Kevin Qin <Kevin.Qin@arm.com> | 2013-12-24 08:11:47 +0000 |
|---|---|---|
| committer | Kevin Qin <Kevin.Qin@arm.com> | 2013-12-24 08:11:47 +0000 |
| commit | cd5f3153f54dcd878bc86d6a9634e9e91d591894 (patch) | |
| tree | b1370ed0c85499e136269c18724ba56dccae3ea0 /llvm/lib | |
| parent | d8540f7e8279d6167f6bd5aa1d62ee2f1e594dc6 (diff) | |
| download | bcm5719-llvm-cd5f3153f54dcd878bc86d6a9634e9e91d591894.tar.gz bcm5719-llvm-cd5f3153f54dcd878bc86d6a9634e9e91d591894.zip | |
[AArch64 NEON] Fix a pattern match failure with NEON_VDUP.
This failure caused by improper condition when lowering shuffle_vector
to scalar_to_vector. After this patch NEON_VDUP with v1i64 will not
be generated.
llvm-svn: 197966
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrNEON.td | 10 |
2 files changed, 8 insertions, 6 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 1b75d0571ae..f72dfe46de7 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -4070,9 +4070,7 @@ AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, if (ValueCounts.size() == 0) return DAG.getUNDEF(VT); - // Loads are better lowered with insert_vector_elt. - // Keep going if we are hitting this case. - if (isOnlyLowElement && !ISD::isNormalLoad(Value.getNode())) + if (isOnlyLowElement) return DAG.getNode(ISD::SCALAR_TO_VECTOR, DL, VT, Value); unsigned EltSize = VT.getVectorElementType().getSizeInBits(); diff --git a/llvm/lib/Target/AArch64/AArch64InstrNEON.td b/llvm/lib/Target/AArch64/AArch64InstrNEON.td index 43c2bf48c7d..cd063d3d2fe 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrNEON.td +++ b/llvm/lib/Target/AArch64/AArch64InstrNEON.td @@ -3690,12 +3690,16 @@ def : LD1R_pattern<v2f32, f32, load, LD1R_2S>; def : LD1R_pattern<v4i32, i32, load, LD1R_4S>; def : LD1R_pattern<v4f32, f32, load, LD1R_4S>; -def : LD1R_pattern<v1i64, i64, load, LD1R_1D>; -def : LD1R_pattern<v1f64, f64, load, LD1R_1D>; - def : LD1R_pattern<v2i64, i64, load, LD1R_2D>; def : LD1R_pattern<v2f64, f64, load, LD1R_2D>; +class LD1R_pattern_v1 <ValueType VTy, ValueType DTy, PatFrag LoadOp, + Instruction INST> + : Pat<(VTy (scalar_to_vector (DTy (LoadOp GPR64xsp:$Rn)))), + (VTy (INST GPR64xsp:$Rn))>; + +def : LD1R_pattern_v1<v1i64, i64, load, LD1R_1D>; +def : LD1R_pattern_v1<v1f64, f64, load, LD1R_1D>; multiclass VectorList_Bare_BHSD<string PREFIX, int Count, RegisterClass RegList> { |

