[llvm] 5213037 - [SystemZ] Avoid unaligned VL/VST:s with memcpy/memmove/memset. (#187100)

via llvm-commits llvm-commits at lists.llvm.org
Mon May 4 08:50:02 PDT 2026


Author: Jonas Paulsson
Date: 2026-05-04T17:49:56+02:00
New Revision: 5213037d24b9b8949859ccd2d2462272cb775dc7

URL: https://github.com/llvm/llvm-project/commit/5213037d24b9b8949859ccd2d2462272cb775dc7
DIFF: https://github.com/llvm/llvm-project/commit/5213037d24b9b8949859ccd2d2462272cb775dc7.diff

LOG: [SystemZ] Avoid unaligned VL/VST:s with memcpy/memmove/memset. (#187100)

Also limit the number of stores per memmove to 2, like for memcpy.

Added: 
    

Modified: 
    llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
    llvm/test/CodeGen/SystemZ/memcpy-03.ll
    llvm/test/CodeGen/SystemZ/memmove-01.ll
    llvm/test/CodeGen/SystemZ/memset-08.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
index bd9a172f9d9d7..f1f6872b68fbe 100644
--- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
@@ -814,6 +814,10 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
   MaxStoresPerMemcpy = Subtarget.hasVector() ? 2 : 0;
   MaxStoresPerMemcpyOptSize = 0;
 
+  // Same with memmove.
+  MaxStoresPerMemmove = Subtarget.hasVector() ? 2 : 0;
+  MaxStoresPerMemmoveOptSize = 0;
+
   // The main memset sequence is a byte store followed by an MVC.
   // Two STC or MV..I stores win over that, but the kind of fused stores
   // generated by target-independent code don't when the byte value is
@@ -1458,17 +1462,21 @@ bool SystemZTargetLowering::findOptimalMemOpLowering(
     LLVMContext &Context, std::vector<EVT> &MemOps, unsigned Limit,
     const MemOp &Op, unsigned DstAS, unsigned SrcAS,
     const AttributeList &FuncAttributes, EVT *LargestVT) const {
+
+  assert(Limit != ~0U &&
+         "Expected EmitTargetCodeForMemXXX() to handle AlwaysInline cases.");
+
+  if (Op.isZeroMemset())
+    return false; // Memset zero: Use XC.
+
   const int MVCFastLen = 16;
+  // Use MVC up to 16 bytes.  Small memset uses STC/MVI for first byte.
+  if ((Op.isMemset() ? Op.size() - 1 : Op.size()) <= MVCFastLen)
+    return false;
 
-  if (Limit != ~unsigned(0)) {
-    // Don't expand Op into scalar loads/stores in these cases:
-    if (Op.isMemcpy() && Op.allowOverlap() && Op.size() <= MVCFastLen)
-      return false; // Small memcpy: Use MVC
-    if (Op.isMemset() && Op.size() - 1 <= MVCFastLen)
-      return false; // Small memset (first byte with STC/MVI): Use MVC
-    if (Op.isZeroMemset())
-      return false; // Memset zero: Use XC
-  }
+  // Avoid unaligned VL/VST:s.
+  if (!Op.isAligned(Align(8)) || (Op.size() >= 25 && Op.size() <= 31))
+    return false;
 
   return TargetLowering::findOptimalMemOpLowering(
       Context, MemOps, Limit, Op, DstAS, SrcAS, FuncAttributes, LargestVT);

diff  --git a/llvm/test/CodeGen/SystemZ/memcpy-03.ll b/llvm/test/CodeGen/SystemZ/memcpy-03.ll
index 19d6c15d9d3ee..ef0da0c87b4d6 100644
--- a/llvm/test/CodeGen/SystemZ/memcpy-03.ll
+++ b/llvm/test/CodeGen/SystemZ/memcpy-03.ll
@@ -309,10 +309,7 @@ define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun17_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 16(%r3)
-; CHECK-NEXT:    stc %r0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(17,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 17, i1 false)
   ret void
@@ -321,10 +318,7 @@ define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun17_unalignedSrc(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun17_unalignedSrc:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 16(%r3)
-; CHECK-NEXT:    stc %r0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(17,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 4 %Src, i64 17, i1 false)
   ret void
@@ -345,10 +339,7 @@ define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun18_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lh %r0, 16(%r3)
-; CHECK-NEXT:    sth %r0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(18,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 18, i1 false)
   ret void
@@ -357,10 +348,7 @@ define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun18_unalignedDst(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun18_unalignedDst:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lh %r0, 16(%r3)
-; CHECK-NEXT:    sth %r0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(18,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 2 %Dst, ptr align 16 %Src, i64 18, i1 false)
   ret void
@@ -381,10 +369,7 @@ define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun19_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun19_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    l %r0, 15(%r3)
-; CHECK-NEXT:    st %r0, 15(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(19,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 19, i1 false)
   ret void
@@ -405,10 +390,7 @@ define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun20_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun20_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    l %r0, 16(%r3)
-; CHECK-NEXT:    st %r0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(20,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 20, i1 false)
   ret void
@@ -444,10 +426,7 @@ define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun21_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun21_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 13(%r3)
-; CHECK-NEXT:    stg %r0, 13(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(21,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 21, i1 false)
   ret void
@@ -468,10 +447,7 @@ define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun22_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun22_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 14(%r3)
-; CHECK-NEXT:    stg %r0, 14(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(22,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 22, i1 false)
   ret void
@@ -492,10 +468,7 @@ define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun23_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun23_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 15(%r3)
-; CHECK-NEXT:    stg %r0, 15(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(23,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 23, i1 false)
   ret void
@@ -516,10 +489,7 @@ define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun24_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 16(%r3)
-; CHECK-NEXT:    stg %r0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(24,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 24, i1 false)
   ret void
@@ -528,10 +498,7 @@ define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun25:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 9(%r3)
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(25,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 25, i1 false)
   ret void
@@ -540,10 +507,7 @@ define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun25_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 9(%r3)
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(25,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 25, i1 false)
   ret void
@@ -552,10 +516,7 @@ define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun26:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 10(%r3)
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(26,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 26, i1 false)
   ret void
@@ -564,10 +525,7 @@ define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun26_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 10(%r3)
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(26,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 26, i1 false)
   ret void
@@ -576,10 +534,7 @@ define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun27:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 11(%r3)
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(27,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 27, i1 false)
   ret void
@@ -588,10 +543,7 @@ define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun27_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 11(%r3)
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(27,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 27, i1 false)
   ret void
@@ -600,10 +552,7 @@ define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun28:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 12(%r3)
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(28,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 28, i1 false)
   ret void
@@ -612,10 +561,7 @@ define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun28_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 12(%r3)
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(28,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 28, i1 false)
   ret void
@@ -624,10 +570,7 @@ define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun29:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 13(%r3)
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(29,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 29, i1 false)
   ret void
@@ -636,10 +579,7 @@ define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun29_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 13(%r3)
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(29,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 29, i1 false)
   ret void
@@ -648,10 +588,7 @@ define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun30:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 14(%r3)
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(30,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 30, i1 false)
   ret void
@@ -660,10 +597,7 @@ define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun30_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 14(%r3)
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(30,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 30, i1 false)
   ret void
@@ -672,10 +606,7 @@ define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun31:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 15(%r3)
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvc 0(31,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 31, i1 false)
   ret void
@@ -684,10 +615,7 @@ define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun31_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun31_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 15(%r3)
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(31,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 31, i1 false)
   ret void
@@ -708,10 +636,7 @@ define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun32_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 16(%r3)
-; CHECK-NEXT:    vst %v0, 16(%r2)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvc 0(32,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 32, i1 false)
   ret void

diff  --git a/llvm/test/CodeGen/SystemZ/memmove-01.ll b/llvm/test/CodeGen/SystemZ/memmove-01.ll
index b0ed727186d24..2beb5d7577851 100644
--- a/llvm/test/CodeGen/SystemZ/memmove-01.ll
+++ b/llvm/test/CodeGen/SystemZ/memmove-01.ll
@@ -533,10 +533,14 @@ define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun17_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    stc %r0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 17
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 17, i1 false)
   ret void
@@ -545,10 +549,14 @@ define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun17_unalignedSrc(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun17_unalignedSrc:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    stc %r0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 17
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 16 %Dst, ptr align 4 %Src, i64 17, i1 false)
   ret void
@@ -569,10 +577,14 @@ define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun18_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lh %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    sth %r0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 18
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 18, i1 false)
   ret void
@@ -581,10 +593,14 @@ define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun18_unalignedDst(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun18_unalignedDst:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lh %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    sth %r0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 18
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 2 %Dst, ptr align 16 %Src, i64 18, i1 false)
   ret void
@@ -605,10 +621,14 @@ define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun19_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun19_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    l %r0, 15(%r3)
-; CHECK-NEXT:    st %r0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 19
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 19, i1 false)
   ret void
@@ -629,10 +649,14 @@ define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun20_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun20_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    l %r0, 16(%r3)
-; CHECK-NEXT:    st %r0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 20
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 20, i1 false)
   ret void
@@ -668,10 +692,14 @@ define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun21_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun21_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    lg %r0, 13(%r3)
-; CHECK-NEXT:    stg %r0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 21
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 21, i1 false)
   ret void
@@ -692,10 +720,14 @@ define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun22_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun22_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    lg %r0, 14(%r3)
-; CHECK-NEXT:    stg %r0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 22
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 22, i1 false)
   ret void
@@ -716,10 +748,14 @@ define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun23_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun23_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    lg %r0, 15(%r3)
-; CHECK-NEXT:    stg %r0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 23
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 23, i1 false)
   ret void
@@ -740,10 +776,14 @@ define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun24_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    lg %r0, 16(%r3)
-; CHECK-NEXT:    stg %r0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 24
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 24, i1 false)
   ret void
@@ -752,10 +792,14 @@ define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun25:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 9(%r3)
-; CHECK-NEXT:    vst %v1, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 25
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 25, i1 false)
   ret void
@@ -764,10 +808,14 @@ define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun25_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 9(%r3)
-; CHECK-NEXT:    vst %v1, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 25
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 25, i1 false)
   ret void
@@ -776,10 +824,14 @@ define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun26:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 10(%r3)
-; CHECK-NEXT:    vst %v1, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 26
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 26, i1 false)
   ret void
@@ -788,10 +840,14 @@ define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun26_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 10(%r3)
-; CHECK-NEXT:    vst %v1, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 26
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 26, i1 false)
   ret void
@@ -800,10 +856,14 @@ define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun27:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 11(%r3)
-; CHECK-NEXT:    vst %v1, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 27
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 27, i1 false)
   ret void
@@ -812,10 +872,14 @@ define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun27_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 11(%r3)
-; CHECK-NEXT:    vst %v1, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 27
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 27, i1 false)
   ret void
@@ -824,10 +888,14 @@ define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun28:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 12(%r3)
-; CHECK-NEXT:    vst %v1, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 28
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 28, i1 false)
   ret void
@@ -836,10 +904,14 @@ define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun28_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 12(%r3)
-; CHECK-NEXT:    vst %v1, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 28
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 28, i1 false)
   ret void
@@ -848,10 +920,14 @@ define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun29:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 13(%r3)
-; CHECK-NEXT:    vst %v1, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 29
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 29, i1 false)
   ret void
@@ -860,10 +936,14 @@ define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun29_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 13(%r3)
-; CHECK-NEXT:    vst %v1, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 29
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 29, i1 false)
   ret void
@@ -872,10 +952,14 @@ define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun30:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 14(%r3)
-; CHECK-NEXT:    vst %v1, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 30
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 30, i1 false)
   ret void
@@ -884,10 +968,14 @@ define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun30_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 14(%r3)
-; CHECK-NEXT:    vst %v1, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 30
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 30, i1 false)
   ret void
@@ -896,10 +984,14 @@ define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun31:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 15(%r3)
-; CHECK-NEXT:    vst %v1, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 31
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 31, i1 false)
   ret void
@@ -908,10 +1000,14 @@ define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun31_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun31_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 15(%r3)
-; CHECK-NEXT:    vst %v1, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 31
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 31, i1 false)
   ret void
@@ -932,10 +1028,14 @@ define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun32_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 16(%r3)
-; CHECK-NEXT:    vst %v1, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 32
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 32, i1 false)
   ret void
@@ -944,12 +1044,14 @@ define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun33:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 32(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    vl %v1, 16(%r3), 3
-; CHECK-NEXT:    stc %r0, 32(%r2)
-; CHECK-NEXT:    vst %v1, 16(%r2), 3
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 33
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 33, i1 false)
   ret void
@@ -958,12 +1060,14 @@ define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
 define void @fun33_unaligned(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun33_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 32(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r3)
-; CHECK-NEXT:    vl %v1, 16(%r3)
-; CHECK-NEXT:    stc %r0, 32(%r2)
-; CHECK-NEXT:    vst %v1, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
+; CHECK-NEXT:    .cfi_offset %r14, -48
+; CHECK-NEXT:    .cfi_offset %r15, -40
+; CHECK-NEXT:    aghi %r15, -160
+; CHECK-NEXT:    .cfi_def_cfa_offset 320
+; CHECK-NEXT:    lghi %r4, 33
+; CHECK-NEXT:    brasl %r14, memmove at PLT
+; CHECK-NEXT:    lmg %r14, %r15, 272(%r15)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 33, i1 false)
   ret void

diff  --git a/llvm/test/CodeGen/SystemZ/memset-08.ll b/llvm/test/CodeGen/SystemZ/memset-08.ll
index 6349b11cac62b..43c50320e0113 100644
--- a/llvm/test/CodeGen/SystemZ/memset-08.ll
+++ b/llvm/test/CodeGen/SystemZ/memset-08.ll
@@ -359,10 +359,8 @@ define void @reg18(ptr %Dst, i8 %val) {
 define void @reg18_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg18_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 0(%r2)
-; CHECK-NEXT:    vsteh %v0, 16(%r2), 0
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(17,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 18, i1 false)
   ret void
@@ -383,10 +381,8 @@ define void @reg19(ptr %Dst, i8 %val) {
 define void @reg19_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg19_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vstef %v0, 15(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(18,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 19, i1 false)
   ret void
@@ -407,10 +403,8 @@ define void @reg20(ptr %Dst, i8 %val) {
 define void @reg20_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg20_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vstef %v0, 16(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(19,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 20, i1 false)
   ret void
@@ -447,10 +441,8 @@ define void @reg21(ptr %Dst, i8 %val) {
 define void @reg21_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg21_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vsteg %v0, 13(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(20,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 21, i1 false)
   ret void
@@ -471,10 +463,8 @@ define void @reg22(ptr %Dst, i8 %val) {
 define void @reg22_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg22_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vsteg %v0, 14(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(21,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 22, i1 false)
   ret void
@@ -495,10 +485,8 @@ define void @reg23(ptr %Dst, i8 %val) {
 define void @reg23_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg23_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vsteg %v0, 15(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(22,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 23, i1 false)
   ret void
@@ -519,10 +507,8 @@ define void @reg24(ptr %Dst, i8 %val) {
 define void @reg24_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg24_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vsteg %v0, 16(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(23,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 24, i1 false)
   ret void
@@ -531,10 +517,8 @@ define void @reg24_unaligned(ptr %Dst, i8 %val) {
 define void @reg25(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg25:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(24,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 25, i1 false)
   ret void
@@ -543,10 +527,8 @@ define void @reg25(ptr %Dst, i8 %val) {
 define void @reg25_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg25_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(24,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 25, i1 false)
   ret void
@@ -555,10 +537,8 @@ define void @reg25_unaligned(ptr %Dst, i8 %val) {
 define void @reg26(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg26:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(25,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 26, i1 false)
   ret void
@@ -567,10 +547,8 @@ define void @reg26(ptr %Dst, i8 %val) {
 define void @reg26_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg26_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(25,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 26, i1 false)
   ret void
@@ -579,10 +557,8 @@ define void @reg26_unaligned(ptr %Dst, i8 %val) {
 define void @reg27(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg27:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(26,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 27, i1 false)
   ret void
@@ -591,10 +567,8 @@ define void @reg27(ptr %Dst, i8 %val) {
 define void @reg27_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg27_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(26,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 27, i1 false)
   ret void
@@ -603,10 +577,8 @@ define void @reg27_unaligned(ptr %Dst, i8 %val) {
 define void @reg28(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg28:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(27,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 28, i1 false)
   ret void
@@ -615,10 +587,8 @@ define void @reg28(ptr %Dst, i8 %val) {
 define void @reg28_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg28_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(27,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 28, i1 false)
   ret void
@@ -627,10 +597,8 @@ define void @reg28_unaligned(ptr %Dst, i8 %val) {
 define void @reg29(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg29:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(28,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 29, i1 false)
   ret void
@@ -639,10 +607,8 @@ define void @reg29(ptr %Dst, i8 %val) {
 define void @reg29_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg29_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(28,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 29, i1 false)
   ret void
@@ -651,10 +617,8 @@ define void @reg29_unaligned(ptr %Dst, i8 %val) {
 define void @reg30(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg30:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(29,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 30, i1 false)
   ret void
@@ -663,10 +627,8 @@ define void @reg30(ptr %Dst, i8 %val) {
 define void @reg30_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg30_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(29,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 30, i1 false)
   ret void
@@ -675,10 +637,8 @@ define void @reg30_unaligned(ptr %Dst, i8 %val) {
 define void @reg31(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg31:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(30,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 31, i1 false)
   ret void
@@ -687,10 +647,8 @@ define void @reg31(ptr %Dst, i8 %val) {
 define void @reg31_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg31_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(30,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 31, i1 false)
   ret void
@@ -711,10 +669,8 @@ define void @reg32(ptr %Dst, i8 %val) {
 define void @reg32_unaligned(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg32_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(31,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 32, i1 false)
   ret void
@@ -1092,9 +1048,8 @@ define void @imm18(ptr %Dst) {
 define void @imm18_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm18_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 18
-; CHECK-NEXT:    vst %v0, 0(%r2)
-; CHECK-NEXT:    mvhhi 16(%r2), 4626
+; CHECK-NEXT:    mvi 0(%r2), 18
+; CHECK-NEXT:    mvc 1(17,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 18, i64 18, i1 false)
   ret void
@@ -1114,9 +1069,8 @@ define void @imm19(ptr %Dst) {
 define void @imm19_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm19_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 19
-; CHECK-NEXT:    vstef %v0, 15(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 19
+; CHECK-NEXT:    mvc 1(18,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 19, i64 19, i1 false)
   ret void
@@ -1136,9 +1090,8 @@ define void @imm20(ptr %Dst) {
 define void @imm20_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm20_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 20
-; CHECK-NEXT:    vstef %v0, 16(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 20
+; CHECK-NEXT:    mvc 1(19,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 20, i64 20, i1 false)
   ret void
@@ -1173,9 +1126,8 @@ define void @imm21(ptr %Dst) {
 define void @imm21_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm21_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 21
-; CHECK-NEXT:    vsteg %v0, 13(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 21
+; CHECK-NEXT:    mvc 1(20,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 21, i64 21, i1 false)
   ret void
@@ -1195,9 +1147,8 @@ define void @imm22(ptr %Dst) {
 define void @imm22_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm22_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 22
-; CHECK-NEXT:    vsteg %v0, 14(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 22
+; CHECK-NEXT:    mvc 1(21,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 22, i64 22, i1 false)
   ret void
@@ -1217,9 +1168,8 @@ define void @imm23(ptr %Dst) {
 define void @imm23_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm23_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 23
-; CHECK-NEXT:    vsteg %v0, 15(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 23
+; CHECK-NEXT:    mvc 1(22,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 23, i64 23, i1 false)
   ret void
@@ -1239,9 +1189,8 @@ define void @imm24(ptr %Dst) {
 define void @imm24_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm24_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 24
-; CHECK-NEXT:    vsteg %v0, 16(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 24
+; CHECK-NEXT:    mvc 1(23,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 24, i64 24, i1 false)
   ret void
@@ -1250,9 +1199,8 @@ define void @imm24_unaligned(ptr %Dst) {
 define void @imm25(ptr %Dst) {
 ; CHECK-LABEL: imm25:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 25
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 25
+; CHECK-NEXT:    mvc 1(24,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 25, i64 25, i1 false)
   ret void
@@ -1261,9 +1209,8 @@ define void @imm25(ptr %Dst) {
 define void @imm25_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm25_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 25
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 25
+; CHECK-NEXT:    mvc 1(24,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 25, i64 25, i1 false)
   ret void
@@ -1272,9 +1219,8 @@ define void @imm25_unaligned(ptr %Dst) {
 define void @imm26(ptr %Dst) {
 ; CHECK-LABEL: imm26:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 26
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 26
+; CHECK-NEXT:    mvc 1(25,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 26, i64 26, i1 false)
   ret void
@@ -1283,9 +1229,8 @@ define void @imm26(ptr %Dst) {
 define void @imm26_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm26_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 26
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 26
+; CHECK-NEXT:    mvc 1(25,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 26, i64 26, i1 false)
   ret void
@@ -1294,9 +1239,8 @@ define void @imm26_unaligned(ptr %Dst) {
 define void @imm27(ptr %Dst) {
 ; CHECK-LABEL: imm27:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 27
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 27
+; CHECK-NEXT:    mvc 1(26,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 27, i64 27, i1 false)
   ret void
@@ -1305,9 +1249,8 @@ define void @imm27(ptr %Dst) {
 define void @imm27_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm27_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 27
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 27
+; CHECK-NEXT:    mvc 1(26,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 27, i64 27, i1 false)
   ret void
@@ -1316,9 +1259,8 @@ define void @imm27_unaligned(ptr %Dst) {
 define void @imm28(ptr %Dst) {
 ; CHECK-LABEL: imm28:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 28
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 28
+; CHECK-NEXT:    mvc 1(27,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 28, i64 28, i1 false)
   ret void
@@ -1327,9 +1269,8 @@ define void @imm28(ptr %Dst) {
 define void @imm28_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm28_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 28
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 28
+; CHECK-NEXT:    mvc 1(27,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 28, i64 28, i1 false)
   ret void
@@ -1338,9 +1279,8 @@ define void @imm28_unaligned(ptr %Dst) {
 define void @imm29(ptr %Dst) {
 ; CHECK-LABEL: imm29:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 29
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 29
+; CHECK-NEXT:    mvc 1(28,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 29, i64 29, i1 false)
   ret void
@@ -1349,9 +1289,8 @@ define void @imm29(ptr %Dst) {
 define void @imm29_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm29_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 29
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 29
+; CHECK-NEXT:    mvc 1(28,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 29, i64 29, i1 false)
   ret void
@@ -1360,9 +1299,8 @@ define void @imm29_unaligned(ptr %Dst) {
 define void @imm30(ptr %Dst) {
 ; CHECK-LABEL: imm30:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 30
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 30
+; CHECK-NEXT:    mvc 1(29,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 30, i64 30, i1 false)
   ret void
@@ -1371,9 +1309,8 @@ define void @imm30(ptr %Dst) {
 define void @imm30_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm30_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 30
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 30
+; CHECK-NEXT:    mvc 1(29,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 30, i64 30, i1 false)
   ret void
@@ -1382,9 +1319,8 @@ define void @imm30_unaligned(ptr %Dst) {
 define void @imm31(ptr %Dst) {
 ; CHECK-LABEL: imm31:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 31
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvi 0(%r2), 31
+; CHECK-NEXT:    mvc 1(30,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 31, i64 31, i1 false)
   ret void
@@ -1393,9 +1329,8 @@ define void @imm31(ptr %Dst) {
 define void @imm31_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm31_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 31
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 31
+; CHECK-NEXT:    mvc 1(30,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 31, i64 31, i1 false)
   ret void
@@ -1415,9 +1350,8 @@ define void @imm32(ptr %Dst) {
 define void @imm32_unaligned(ptr %Dst) {
 ; CHECK-LABEL: imm32_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 32
-; CHECK-NEXT:    vst %v0, 16(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    mvi 0(%r2), 32
+; CHECK-NEXT:    mvc 1(31,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
   call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 32, i64 32, i1 false)
   ret void


        


More information about the llvm-commits mailing list