diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 0e5e7047550354..2ec9f84f48ecb5 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -12091,8 +12091,8 @@ EVT AArch64TargetLowering::getOptimalMemOpType( }; if (CanUseNEON && Op.isMemset() && !IsSmallMemset && - AlignmentIsAcceptable(MVT::v2i64, Align(16))) - return MVT::v2i64; + AlignmentIsAcceptable(MVT::v16i8, Align(16))) + return MVT::v16i8; if (CanUseFP && !IsSmallMemset && AlignmentIsAcceptable(MVT::f128, Align(16))) return MVT::f128; if (Op.size() >= 8 && AlignmentIsAcceptable(MVT::i64, Align(8))) diff --git a/llvm/test/CodeGen/AArch64/memset.ll b/llvm/test/CodeGen/AArch64/memset.ll new file mode 100644 index 00000000000000..4d1d2241c05abf --- /dev/null +++ b/llvm/test/CodeGen/AArch64/memset.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-linux-gnu" + +; CHECK: memset_call: +; CHECK-NOT: and +; CHECK: dup +; CHECK-NEXT: stp +; CHECK-NEXT: stp +; CHECK-NEXT: ret +define void @memset_call(i8* %0, i32 %1) { + %3 = trunc i32 %1 to i8 + call void @llvm.memset.p0i8.i64(i8* %0, i8 %3, i64 64, i1 false) + ret void +} + +declare void @llvm.memset.p0i8.i64(i8*, i8, i64, i1 immarg) +