[llvm-branch-commits] [llvm] [SystemZ] Backport memops handling (avoid unaligned VL/VSTs). (PR #196359)

Jonas Paulsson via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu May 7 09:18:12 PDT 2026


https://github.com/JonPsson1 created https://github.com/llvm/llvm-project/pull/196359

Unfortunately this backport to the 22 branch becomes a bit involved. It seems it requires four separate commits (per this branch):

1 pre-commit of tests
2 actual patch (5213037)
3 post-commit that fixes tests (remove superfluous args).
4 Fixing of memmove-01.ll to work on this branch.

Not quite sure how to proceed, would it work to commit this branch as a single backport-commit?

@uweigand @dyung

>From d0897cfb40908bc63b51b912dd6a737fa35c5859 Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Tue, 28 Apr 2026 19:09:09 +0200
Subject: [PATCH 1/4] [SystemZ] Improved testing for memcpy/memmove/memset.
 (#194682)

This is a pre-commit for #187100.
---
 llvm/test/CodeGen/SystemZ/memcpy-03.ll  |  723 ++++++--
 llvm/test/CodeGen/SystemZ/memmove-01.ll |  970 +++++++++++
 llvm/test/CodeGen/SystemZ/memset-08.ll  | 2084 ++++++++++++++++++++---
 3 files changed, 3457 insertions(+), 320 deletions(-)
 create mode 100644 llvm/test/CodeGen/SystemZ/memmove-01.ll

diff --git a/llvm/test/CodeGen/SystemZ/memcpy-03.ll b/llvm/test/CodeGen/SystemZ/memcpy-03.ll
index c703aef275322..19d6c15d9d3ee 100644
--- a/llvm/test/CodeGen/SystemZ/memcpy-03.ll
+++ b/llvm/test/CodeGen/SystemZ/memcpy-03.ll
@@ -1,217 +1,736 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc -mcpu=z15 < %s -mtriple=s390x-linux-gnu | FileCheck %s
+; RUN: llc -mcpu=z17 < %s -mtriple=s390x-linux-gnu | FileCheck %s
 ;
-; Test memcpys of small constant lengths that should not be done with MVC.
+; Test non-volatile memcpys of small constant lengths in both aligned and
+; unaligned cases.
 
 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
 
-define void @fun16(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun1(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun1:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(1,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 1, i1 false)
+  ret void
+}
+
+define void @fun1_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun1_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(1,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 1, i1 false)
+  ret void
+}
+
+define void @fun2(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun2:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(2,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 2, i1 false)
+  ret void
+}
+
+define void @fun2_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun2_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(2,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 2, i1 false)
+  ret void
+}
+
+define void @fun3(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun3:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(3,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 3, i1 false)
+  ret void
+}
+
+define void @fun3_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun3_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(3,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 3, i1 false)
+  ret void
+}
+
+define void @fun4(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun4:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(4,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 4, i1 false)
+  ret void
+}
+
+define void @fun4_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun4_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(4,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 4, i1 false)
+  ret void
+}
+
+define void @fun5(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun5:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(5,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 5, i1 false)
+  ret void
+}
+
+define void @fun5_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun5_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(5,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 5, i1 false)
+  ret void
+}
+
+define void @fun6(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun6:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(6,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 6, i1 false)
+  ret void
+}
+
+define void @fun6_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun6_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(6,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 6, i1 false)
+  ret void
+}
+
+define void @fun7(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun7:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(7,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 7, i1 false)
+  ret void
+}
+
+define void @fun7_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun7_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(7,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 7, i1 false)
+  ret void
+}
+
+define void @fun8(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun8:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(8,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 8, i1 false)
+  ret void
+}
+
+define void @fun8_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun8_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(8,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 8, i1 false)
+  ret void
+}
+
+define void @fun9(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun9:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(9,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 9, i1 false)
+  ret void
+}
+
+define void @fun9_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun9_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(9,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 9, i1 false)
+  ret void
+}
+
+define void @fun10(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun10:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(10,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 10, i1 false)
+  ret void
+}
+
+define void @fun10_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun10_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(10,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 10, i1 false)
+  ret void
+}
+
+define void @fun11(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun11:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(11,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 11, i1 false)
+  ret void
+}
+
+define void @fun11_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun11_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(11,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 11, i1 false)
+  ret void
+}
+
+define void @fun12(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun12:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(12,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 12, i1 false)
+  ret void
+}
+
+define void @fun12_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun12_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(12,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 12, i1 false)
+  ret void
+}
+
+define void @fun13(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun13:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(13,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 13, i1 false)
+  ret void
+}
+
+define void @fun13_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun13_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(13,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 13, i1 false)
+  ret void
+}
+
+define void @fun14(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun14:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(14,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 14, i1 false)
+  ret void
+}
+
+define void @fun14_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun14_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(14,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 14, i1 false)
+  ret void
+}
+
+define void @fun15(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun15:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(15,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 15, i1 false)
+  ret void
+}
+
+define void @fun15_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun15_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(15,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 15, i1 false)
+  ret void
+}
+
+define void @fun16(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun16:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    mvc 0(16,%r3), 0(%r2)
+; CHECK-NEXT:    mvc 0(16,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 16, i1 false)
+  ret void
+}
+
+define void @fun16_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun16_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(16,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 16, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 16, i1 false)
   ret void
 }
 
-define void @fun17(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun17:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lb %r0, 16(%r2)
-; CHECK-NEXT:    stc %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    lb %r0, 16(%r3)
+; CHECK-NEXT:    stc %r0, 16(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 17, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 17, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 17, i1 false)
   ret void
 }
 
-define void @fun18(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 4 %Src, i64 17, i1 false)
+  ret void
+}
+
+define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun18:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lh %r0, 16(%r2)
-; CHECK-NEXT:    sth %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    lh %r0, 16(%r3)
+; CHECK-NEXT:    sth %r0, 16(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 18, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 18, i1 false)
   ret void
 }
 
-define void @fun19(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 18, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %Dst, ptr align 16 %Src, i64 18, i1 false)
+  ret void
+}
+
+define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun19:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    l %r0, 15(%r2)
-; CHECK-NEXT:    st %r0, 15(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    l %r0, 15(%r3)
+; CHECK-NEXT:    st %r0, 15(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 19, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 19, i1 false)
   ret void
 }
 
-define void @fun20(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 19, i1 false)
+  ret void
+}
+
+define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun20:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    l %r0, 16(%r2)
-; CHECK-NEXT:    st %r0, 16(%r3)
+; CHECK-NEXT:    l %r0, 16(%r3)
+; CHECK-NEXT:    st %r0, 16(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 20, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 20, i1 false)
+  ret void
+}
+
+define void @fun20_localDst(ptr %Src, i8 %val) {
+; CHECK-LABEL: fun20_localDst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    aghi %r15, -184
+; CHECK-NEXT:    .cfi_def_cfa_offset 344
 ; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    vst %v0, 164(%r15), 4
+; CHECK-NEXT:    mvc 180(4,%r15), 16(%r2)
+; CHECK-NEXT:    aghi %r15, 184
 ; CHECK-NEXT:    br %r14
+  %Dst = alloca [20 x i8]
   call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 20, i1 false)
   ret void
 }
 
-define void @fun21(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun21:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 13(%r2)
-; CHECK-NEXT:    stg %r0, 13(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    lg %r0, 13(%r3)
+; CHECK-NEXT:    stg %r0, 13(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 21, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 21, i1 false)
   ret void
 }
 
-define void @fun22(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 21, i1 false)
+  ret void
+}
+
+define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun22:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 14(%r2)
-; CHECK-NEXT:    stg %r0, 14(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    lg %r0, 14(%r3)
+; CHECK-NEXT:    stg %r0, 14(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 22, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 22, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 22, i1 false)
   ret void
 }
 
-define void @fun23(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun23:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 15(%r2)
-; CHECK-NEXT:    stg %r0, 15(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    lg %r0, 15(%r3)
+; CHECK-NEXT:    stg %r0, 15(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 23, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 23, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 23, i1 false)
   ret void
 }
 
-define void @fun24(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun24:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lg %r0, 16(%r2)
-; CHECK-NEXT:    stg %r0, 16(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    lg %r0, 16(%r3)
+; CHECK-NEXT:    stg %r0, 16(%r2)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 24, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 24, i1 false)
   ret void
 }
 
-define void @fun25(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun25:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 9(%r2)
-; CHECK-NEXT:    vst %v0, 9(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 25, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 25, i1 false)
   ret void
 }
 
-define void @fun26(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun26:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 10(%r2)
-; CHECK-NEXT:    vst %v0, 10(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 26, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 26, i1 false)
   ret void
 }
 
-define void @fun27(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 26, i1 false)
+  ret void
+}
+
+define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun27:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 11(%r2)
-; CHECK-NEXT:    vst %v0, 11(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 27, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 27, i1 false)
   ret void
 }
 
-define void @fun28(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun28:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 12(%r2)
-; CHECK-NEXT:    vst %v0, 12(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 28, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 28, i1 false)
   ret void
 }
 
-define void @fun29(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 28, i1 false)
+  ret void
+}
+
+define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun29:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 13(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 29, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 29, i1 false)
   ret void
 }
 
-define void @fun30(ptr %Src, ptr %Dst, 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 29, i1 false)
+  ret void
+}
+
+define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun30:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 14(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 30, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 30, i1 false)
   ret void
 }
 
-define void @fun31(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun31:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 15(%r3)
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; 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:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 31, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 31, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 31, i1 false)
   ret void
 }
 
-define void @fun32(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun32:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 16(%r2), 4
-; CHECK-NEXT:    vst %v0, 16(%r3), 4
-; CHECK-NEXT:    vl %v0, 0(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r3), 4
+; CHECK-NEXT:    vl %v0, 16(%r3), 3
+; CHECK-NEXT:    vst %v0, 16(%r2), 3
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 32, i1 false)
+  ret void
+}
+
+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:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 32, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 32, i1 false)
   ret void
 }
 
-define void @fun33(ptr %Src, ptr %Dst, i8 %val) {
+define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
 ; CHECK-LABEL: fun33:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    mvc 0(33,%r3), 0(%r2)
+; CHECK-NEXT:    mvc 0(33,%r2), 0(%r3)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 33, i1 false)
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 33, i1 false)
   ret void
 }
 
+define void @fun33_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun33_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvc 0(33,%r2), 0(%r3)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 33, i1 false)
+  ret void
+}
diff --git a/llvm/test/CodeGen/SystemZ/memmove-01.ll b/llvm/test/CodeGen/SystemZ/memmove-01.ll
new file mode 100644
index 0000000000000..b0ed727186d24
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/memmove-01.ll
@@ -0,0 +1,970 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mcpu=z17 < %s -mtriple=s390x-linux-gnu | FileCheck %s
+;
+; Test non-volatile memmoves of small constant lengths in both aligned and
+; unaligned cases.
+
+declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
+
+define void @fun1(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun1:
+; CHECK:       # %bb.0:
+; 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, 1
+; 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 1, i1 false)
+  ret void
+}
+
+define void @fun1_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun1_unaligned:
+; CHECK:       # %bb.0:
+; 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, 1
+; 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 1, i1 false)
+  ret void
+}
+
+define void @fun2(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun2:
+; CHECK:       # %bb.0:
+; 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, 2
+; 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 2, i1 false)
+  ret void
+}
+
+define void @fun2_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun2_unaligned:
+; CHECK:       # %bb.0:
+; 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, 2
+; 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 2, i1 false)
+  ret void
+}
+
+define void @fun3(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun3:
+; CHECK:       # %bb.0:
+; 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, 3
+; 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 3, i1 false)
+  ret void
+}
+
+define void @fun3_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun3_unaligned:
+; CHECK:       # %bb.0:
+; 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, 3
+; 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 3, i1 false)
+  ret void
+}
+
+define void @fun4(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun4:
+; CHECK:       # %bb.0:
+; 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, 4
+; 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 4, i1 false)
+  ret void
+}
+
+define void @fun4_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun4_unaligned:
+; CHECK:       # %bb.0:
+; 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, 4
+; 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 4, i1 false)
+  ret void
+}
+
+define void @fun5(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun5:
+; CHECK:       # %bb.0:
+; 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, 5
+; 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 5, i1 false)
+  ret void
+}
+
+define void @fun5_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun5_unaligned:
+; CHECK:       # %bb.0:
+; 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, 5
+; 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 5, i1 false)
+  ret void
+}
+
+define void @fun6(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun6:
+; CHECK:       # %bb.0:
+; 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, 6
+; 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 6, i1 false)
+  ret void
+}
+
+define void @fun6_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun6_unaligned:
+; CHECK:       # %bb.0:
+; 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, 6
+; 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 6, i1 false)
+  ret void
+}
+
+define void @fun7(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun7:
+; CHECK:       # %bb.0:
+; 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, 7
+; 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 7, i1 false)
+  ret void
+}
+
+define void @fun7_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun7_unaligned:
+; CHECK:       # %bb.0:
+; 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, 7
+; 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 7, i1 false)
+  ret void
+}
+
+define void @fun8(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun8:
+; CHECK:       # %bb.0:
+; 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, 8
+; 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 8, i1 false)
+  ret void
+}
+
+define void @fun8_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun8_unaligned:
+; CHECK:       # %bb.0:
+; 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, 8
+; 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 8, i1 false)
+  ret void
+}
+
+define void @fun9(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun9:
+; CHECK:       # %bb.0:
+; 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, 9
+; 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 9, i1 false)
+  ret void
+}
+
+define void @fun9_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun9_unaligned:
+; CHECK:       # %bb.0:
+; 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, 9
+; 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 9, i1 false)
+  ret void
+}
+
+define void @fun10(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun10:
+; CHECK:       # %bb.0:
+; 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, 10
+; 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 10, i1 false)
+  ret void
+}
+
+define void @fun10_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun10_unaligned:
+; CHECK:       # %bb.0:
+; 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, 10
+; 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 10, i1 false)
+  ret void
+}
+
+define void @fun11(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun11:
+; CHECK:       # %bb.0:
+; 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, 11
+; 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 11, i1 false)
+  ret void
+}
+
+define void @fun11_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun11_unaligned:
+; CHECK:       # %bb.0:
+; 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, 11
+; 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 11, i1 false)
+  ret void
+}
+
+define void @fun12(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun12:
+; CHECK:       # %bb.0:
+; 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, 12
+; 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 12, i1 false)
+  ret void
+}
+
+define void @fun12_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun12_unaligned:
+; CHECK:       # %bb.0:
+; 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, 12
+; 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 12, i1 false)
+  ret void
+}
+
+define void @fun13(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun13:
+; CHECK:       # %bb.0:
+; 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, 13
+; 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 13, i1 false)
+  ret void
+}
+
+define void @fun13_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun13_unaligned:
+; CHECK:       # %bb.0:
+; 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, 13
+; 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 13, i1 false)
+  ret void
+}
+
+define void @fun14(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun14:
+; CHECK:       # %bb.0:
+; 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, 14
+; 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 14, i1 false)
+  ret void
+}
+
+define void @fun14_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun14_unaligned:
+; CHECK:       # %bb.0:
+; 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, 14
+; 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 14, i1 false)
+  ret void
+}
+
+define void @fun15(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun15:
+; CHECK:       # %bb.0:
+; 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, 15
+; 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 15, i1 false)
+  ret void
+}
+
+define void @fun15_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun15_unaligned:
+; CHECK:       # %bb.0:
+; 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, 15
+; 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 15, i1 false)
+  ret void
+}
+
+define void @fun16(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun16:
+; CHECK:       # %bb.0:
+; 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, 16
+; 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 16, i1 false)
+  ret void
+}
+
+define void @fun16_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun16_unaligned:
+; CHECK:       # %bb.0:
+; 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, 16
+; 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 16, i1 false)
+  ret void
+}
+
+define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun17:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lb %r0, 16(%r3)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    stc %r0, 16(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 17, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 17, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 16 %Dst, ptr align 4 %Src, i64 17, i1 false)
+  ret void
+}
+
+define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun18:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lh %r0, 16(%r3)
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    sth %r0, 16(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 18, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 18, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 2 %Dst, ptr align 16 %Src, i64 18, i1 false)
+  ret void
+}
+
+define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun19:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    l %r0, 15(%r3)
+; CHECK-NEXT:    st %r0, 15(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 19, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 19, i1 false)
+  ret void
+}
+
+define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun20:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    l %r0, 16(%r3)
+; CHECK-NEXT:    st %r0, 16(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 20, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 20, i1 false)
+  ret void
+}
+
+define void @fun20_localDst(ptr %Src, i8 %val) {
+; CHECK-LABEL: fun20_localDst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    aghi %r15, -184
+; CHECK-NEXT:    .cfi_def_cfa_offset 344
+; CHECK-NEXT:    vl %v0, 0(%r2), 4
+; CHECK-NEXT:    vst %v0, 164(%r15), 4
+; CHECK-NEXT:    mvc 180(4,%r15), 16(%r2)
+; CHECK-NEXT:    aghi %r15, 184
+; CHECK-NEXT:    br %r14
+  %Dst = alloca [20 x i8]
+  call void @llvm.memmove.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 20, i1 false)
+  ret void
+}
+
+define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun21:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    lg %r0, 13(%r3)
+; CHECK-NEXT:    stg %r0, 13(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 21, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 21, i1 false)
+  ret void
+}
+
+define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun22:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    lg %r0, 14(%r3)
+; CHECK-NEXT:    stg %r0, 14(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 22, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 22, i1 false)
+  ret void
+}
+
+define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun23:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    lg %r0, 15(%r3)
+; CHECK-NEXT:    stg %r0, 15(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 23, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 23, i1 false)
+  ret void
+}
+
+define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun24:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    lg %r0, 16(%r3)
+; CHECK-NEXT:    stg %r0, 16(%r2)
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 26, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 26, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 28, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 28, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 29, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 29, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 31, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 31, i1 false)
+  ret void
+}
+
+define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
+; CHECK-LABEL: fun32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vl %v0, 0(%r3), 3
+; CHECK-NEXT:    vl %v1, 16(%r3), 3
+; CHECK-NEXT:    vst %v1, 16(%r2), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 32, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 1 %Dst, ptr align 1 %Src, i64 32, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memmove.p0.p0.i64(ptr align 8 %Dst, ptr align 8 %Src, i64 33, i1 false)
+  ret void
+}
+
+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:    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 9312309833680..6349b11cac62b 100644
--- a/llvm/test/CodeGen/SystemZ/memset-08.ll
+++ b/llvm/test/CodeGen/SystemZ/memset-08.ll
@@ -1,230 +1,1768 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc -mcpu=z15 %s -mtriple=s390x-linux-gnu -o - | FileCheck %s
 ;
-; Test memsets of small constant lengths, that should not be done with MVC.
+; Test non-volatile memsets of small constant lengths in both aligned and
+; unaligned cases.
 
 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
 
+define void @reg1(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg1:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 1, i1 false)
+  ret void
+}
+
+define void @reg1_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg1_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 1, i1 false)
+  ret void
+}
+
+define void @reg2(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg2:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 1(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 2, i1 false)
+  ret void
+}
+
+define void @reg2_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg2_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 1(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 2, i1 false)
+  ret void
+}
+
+define void @reg3(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg3:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(2,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 3, i1 false)
+  ret void
+}
+
+define void @reg3_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg3_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(2,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 3, i1 false)
+  ret void
+}
+
+define void @reg4(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg4:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(3,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 4, i1 false)
+  ret void
+}
+
+define void @reg4_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg4_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(3,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 4, i1 false)
+  ret void
+}
+
+define void @reg5(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg5:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(4,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 5, i1 false)
+  ret void
+}
+
+define void @reg5_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg5_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(4,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 5, i1 false)
+  ret void
+}
+
+define void @reg6(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg6:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(5,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 6, i1 false)
+  ret void
+}
+
+define void @reg6_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg6_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(5,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 6, i1 false)
+  ret void
+}
+
+define void @reg7(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg7:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(6,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 7, i1 false)
+  ret void
+}
+
+define void @reg7_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg7_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(6,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 7, i1 false)
+  ret void
+}
+
+define void @reg8(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg8:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(7,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 8, i1 false)
+  ret void
+}
+
+define void @reg8_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg8_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(7,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 8, i1 false)
+  ret void
+}
+
+define void @reg9(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg9:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(8,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 9, i1 false)
+  ret void
+}
+
+define void @reg9_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg9_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(8,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 9, i1 false)
+  ret void
+}
+
+define void @reg10(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg10:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(9,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 10, i1 false)
+  ret void
+}
+
+define void @reg10_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg10_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(9,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 10, i1 false)
+  ret void
+}
+
+define void @reg11(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg11:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(10,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 11, i1 false)
+  ret void
+}
+
+define void @reg11_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg11_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(10,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 11, i1 false)
+  ret void
+}
+
+define void @reg12(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg12:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(11,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 12, i1 false)
+  ret void
+}
+
+define void @reg12_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg12_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(11,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 12, i1 false)
+  ret void
+}
+
+define void @reg13(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg13:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(12,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 13, i1 false)
+  ret void
+}
+
+define void @reg13_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg13_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(12,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 13, i1 false)
+  ret void
+}
+
+define void @reg14(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg14:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(13,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 14, i1 false)
+  ret void
+}
+
+define void @reg14_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg14_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(13,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 14, i1 false)
+  ret void
+}
+
+define void @reg15(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg15:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(14,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 15, i1 false)
+  ret void
+}
+
+define void @reg15_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg15_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(14,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 15, i1 false)
+  ret void
+}
+
+define void @reg16(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg16:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(15,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 16, i1 false)
+  ret void
+}
+
+define void @reg16_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg16_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(15,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 16, i1 false)
+  ret void
+}
+
 define void @reg17(ptr %Dst, i8 %val) {
 ; CHECK-LABEL: reg17:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    stc %r3, 0(%r2)
-; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 17, i1 false)
+  ret void
+}
+
+define void @reg17_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg17_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 17, i1 false)
+  ret void
+}
+
+define void @reg18(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg18:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vlvgp %v0, %r3, %r3
+; CHECK-NEXT:    vrepb %v0, %v0, 7
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    vsteh %v0, 16(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 18, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 18, i1 false)
+  ret void
+}
+
+define void @reg19(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg19:
+; 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), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 19, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 19, i1 false)
+  ret void
+}
+
+define void @reg20(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg20:
+; 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), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 20, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 20, i1 false)
+  ret void
+}
+
+define void @reg20_localDst(i8 %val) {
+; CHECK-LABEL: reg20_localDst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    aghi %r15, -184
+; CHECK-NEXT:    .cfi_def_cfa_offset 344
+; CHECK-NEXT:    vlvgp %v0, %r2, %r2
+; CHECK-NEXT:    vrepb %v0, %v0, 7
+; CHECK-NEXT:    vstef %v0, 180(%r15), 0
+; CHECK-NEXT:    vst %v0, 164(%r15), 4
+; CHECK-NEXT:    aghi %r15, 184
+; CHECK-NEXT:    br %r14
+  %Dst = alloca [20 x i8]
+  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 20, i1 false)
+  ret void
+}
+
+define void @reg21(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg21:
+; 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), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 21, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 21, i1 false)
+  ret void
+}
+
+define void @reg22(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg22:
+; 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), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 22, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 22, i1 false)
+  ret void
+}
+
+define void @reg23(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg23:
+; 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), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 23, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 23, i1 false)
+  ret void
+}
+
+define void @reg24(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg24:
+; 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), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 26, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 26, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 28, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 28, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 29, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 29, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 31, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 31, i1 false)
+  ret void
+}
+
+define void @reg32(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vlvgp %v0, %r3, %r3
+; CHECK-NEXT:    vrepb %v0, %v0, 7
+; CHECK-NEXT:    vst %v0, 16(%r2), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 32, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 32, i1 false)
+  ret void
+}
+
+define void @reg33(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg33:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 %val, i64 33, i1 false)
+  ret void
+}
+
+define void @reg33_unaligned(ptr %Dst, i8 %val) {
+; CHECK-LABEL: reg33_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    stc %r3, 0(%r2)
+; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 %val, i64 33, i1 false)
+  ret void
+}
+
+;; Immediate value
+
+define void @imm1(ptr %Dst) {
+; CHECK-LABEL: imm1:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 1
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 1, i64 1, i1 false)
+  ret void
+}
+
+define void @imm1_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm1_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 255
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 -1, i64 1, i1 false)
+  ret void
+}
+
+define void @imm2(ptr %Dst) {
+; CHECK-LABEL: imm2:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvhhi 0(%r2), 514
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 2, i64 2, i1 false)
+  ret void
+}
+
+define void @imm2_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm2_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvhhi 0(%r2), 514
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 2, i64 2, i1 false)
+  ret void
+}
+
+define void @imm3(ptr %Dst) {
+; CHECK-LABEL: imm3:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 2(%r2), 3
+; CHECK-NEXT:    mvhhi 0(%r2), 771
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 3, i64 3, i1 false)
+  ret void
+}
+
+define void @imm3_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm3_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 2(%r2), 3
+; CHECK-NEXT:    mvhhi 0(%r2), 771
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 3, i64 3, i1 false)
+  ret void
+}
+
+define void @imm4(ptr %Dst) {
+; CHECK-LABEL: imm4:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 4
+; CHECK-NEXT:    vstef %v0, 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 4, i64 4, i1 false)
+  ret void
+}
+
+define void @imm4_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm4_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 4
+; CHECK-NEXT:    vstef %v0, 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 4, i64 4, i1 false)
+  ret void
+}
+
+define void @imm5(ptr %Dst) {
+; CHECK-LABEL: imm5:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 5
+; CHECK-NEXT:    mvc 1(4,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 5, i64 5, i1 false)
+  ret void
+}
+
+define void @imm5_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm5_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 5
+; CHECK-NEXT:    mvc 1(4,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 5, i64 5, i1 false)
+  ret void
+}
+
+define void @imm6(ptr %Dst) {
+; CHECK-LABEL: imm6:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 6
+; CHECK-NEXT:    mvc 1(5,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 6, i64 6, i1 false)
+  ret void
+}
+
+define void @imm6_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm6_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 6
+; CHECK-NEXT:    mvc 1(5,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 6, i64 6, i1 false)
+  ret void
+}
+
+define void @imm7(ptr %Dst) {
+; CHECK-LABEL: imm7:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 7
+; CHECK-NEXT:    mvc 1(6,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 7, i64 7, i1 false)
+  ret void
+}
+
+define void @imm7_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm7_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 7
+; CHECK-NEXT:    mvc 1(6,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 7, i64 7, i1 false)
+  ret void
+}
+
+define void @imm8(ptr %Dst) {
+; CHECK-LABEL: imm8:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 8
+; CHECK-NEXT:    mvc 1(7,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 8, i64 8, i1 false)
+  ret void
+}
+
+define void @imm8_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm8_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 8
+; CHECK-NEXT:    mvc 1(7,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 8, i64 8, i1 false)
+  ret void
+}
+
+define void @imm9(ptr %Dst) {
+; CHECK-LABEL: imm9:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 9
+; CHECK-NEXT:    mvc 1(8,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 9, i64 9, i1 false)
+  ret void
+}
+
+define void @imm9_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm9_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 9
+; CHECK-NEXT:    mvc 1(8,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 9, i64 9, i1 false)
+  ret void
+}
+
+define void @imm10(ptr %Dst) {
+; CHECK-LABEL: imm10:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 10
+; CHECK-NEXT:    mvc 1(9,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 10, i64 10, i1 false)
+  ret void
+}
+
+define void @imm10_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm10_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 10
+; CHECK-NEXT:    mvc 1(9,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 10, i64 10, i1 false)
+  ret void
+}
+
+define void @imm11(ptr %Dst) {
+; CHECK-LABEL: imm11:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 11
+; CHECK-NEXT:    mvc 1(10,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 11, i64 11, i1 false)
+  ret void
+}
+
+define void @imm11_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm11_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 11
+; CHECK-NEXT:    mvc 1(10,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 11, i64 11, i1 false)
+  ret void
+}
+
+define void @imm12(ptr %Dst) {
+; CHECK-LABEL: imm12:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 12
+; CHECK-NEXT:    mvc 1(11,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 12, i64 12, i1 false)
+  ret void
+}
+
+define void @imm12_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm12_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 12
+; CHECK-NEXT:    mvc 1(11,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 12, i64 12, i1 false)
+  ret void
+}
+
+define void @imm13(ptr %Dst) {
+; CHECK-LABEL: imm13:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 13
+; CHECK-NEXT:    mvc 1(12,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 13, i64 13, i1 false)
+  ret void
+}
+
+define void @imm13_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm13_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 13
+; CHECK-NEXT:    mvc 1(12,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 13, i64 13, i1 false)
+  ret void
+}
+
+define void @imm14(ptr %Dst) {
+; CHECK-LABEL: imm14:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 14
+; CHECK-NEXT:    mvc 1(13,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 14, i64 14, i1 false)
+  ret void
+}
+
+define void @imm14_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm14_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 14
+; CHECK-NEXT:    mvc 1(13,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 14, i64 14, i1 false)
+  ret void
+}
+
+define void @imm15(ptr %Dst) {
+; CHECK-LABEL: imm15:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 15
+; CHECK-NEXT:    mvc 1(14,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 15, i64 15, i1 false)
+  ret void
+}
+
+define void @imm15_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm15_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 15
+; CHECK-NEXT:    mvc 1(14,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 15, i64 15, i1 false)
+  ret void
+}
+
+define void @imm16(ptr %Dst) {
+; CHECK-LABEL: imm16:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 16
+; CHECK-NEXT:    mvc 1(15,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 16, i64 16, i1 false)
+  ret void
+}
+
+define void @imm16_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm16_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 16
+; CHECK-NEXT:    mvc 1(15,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 16, i64 16, i1 false)
+  ret void
+}
+
+define void @imm17(ptr %Dst) {
+; CHECK-LABEL: imm17:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 17
+; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 17, i64 17, i1 false)
+  ret void
+}
+
+define void @imm17_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm17_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 17
+; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 17, i64 17, i1 false)
+  ret void
+}
+
+define void @imm18(ptr %Dst) {
+; CHECK-LABEL: imm18:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 18
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    mvhhi 16(%r2), 4626
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 18, i64 18, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 18, i64 18, i1 false)
+  ret void
+}
+
+define void @imm19(ptr %Dst) {
+; CHECK-LABEL: imm19:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 19
+; CHECK-NEXT:    vstef %v0, 15(%r2), 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 19, i64 19, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 19, i64 19, i1 false)
+  ret void
+}
+
+define void @imm20(ptr %Dst) {
+; CHECK-LABEL: imm20:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 20
+; CHECK-NEXT:    vstef %v0, 16(%r2), 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 20, i64 20, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 20, i64 20, i1 false)
+  ret void
+}
+
+define void @imm20_localDst() {
+; CHECK-LABEL: imm20_localDst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    aghi %r15, -184
+; CHECK-NEXT:    .cfi_def_cfa_offset 344
+; CHECK-NEXT:    vrepib %v0, 20
+; CHECK-NEXT:    vstef %v0, 180(%r15), 0
+; CHECK-NEXT:    vst %v0, 164(%r15), 4
+; CHECK-NEXT:    aghi %r15, 184
+; CHECK-NEXT:    br %r14
+  %Dst = alloca [20 x i8]
+  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 20, i64 20, i1 false)
+  ret void
+}
+
+define void @imm21(ptr %Dst) {
+; CHECK-LABEL: imm21:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 21
+; CHECK-NEXT:    vsteg %v0, 13(%r2), 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 21, i64 21, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 21, i64 21, i1 false)
+  ret void
+}
+
+define void @imm22(ptr %Dst) {
+; CHECK-LABEL: imm22:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 22
+; CHECK-NEXT:    vsteg %v0, 14(%r2), 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 22, i64 22, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 22, i64 22, i1 false)
+  ret void
+}
+
+define void @imm23(ptr %Dst) {
+; CHECK-LABEL: imm23:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 23
+; CHECK-NEXT:    vsteg %v0, 15(%r2), 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 23, i64 23, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 23, i64 23, i1 false)
+  ret void
+}
+
+define void @imm24(ptr %Dst) {
+; CHECK-LABEL: imm24:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 24
+; CHECK-NEXT:    vsteg %v0, 16(%r2), 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 24, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 24, i64 24, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 25, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 25, i64 25, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 26, i64 26, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 26, i64 26, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 27, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 27, i64 27, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 28, i64 28, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 28, i64 28, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 29, i64 29, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 29, i64 29, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 30, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 30, i64 30, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 31, i64 31, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 31, i64 31, i1 false)
+  ret void
+}
+
+define void @imm32(ptr %Dst) {
+; CHECK-LABEL: imm32:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vrepib %v0, 32
+; CHECK-NEXT:    vst %v0, 16(%r2), 3
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 32, i64 32, i1 false)
+  ret void
+}
+
+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:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 32, i64 32, i1 false)
+  ret void
+}
+
+define void @imm33(ptr %Dst) {
+; CHECK-LABEL: imm33:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 33
+; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 33, i64 33, i1 false)
+  ret void
+}
+
+define void @imm33_unaligned(ptr %Dst) {
+; CHECK-LABEL: imm33_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 33
+; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 33, i64 33, i1 false)
+  ret void
+}
+
+;; zero
+
+define void @zero1(ptr %Dst) {
+; CHECK-LABEL: zero1:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 1, i1 false)
+  ret void
+}
+
+define void @zero1_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero1_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 1, i1 false)
+  ret void
+}
+
+define void @zero2(ptr %Dst) {
+; CHECK-LABEL: zero2:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvhhi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 2, i1 false)
+  ret void
+}
+
+define void @zero2_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero2_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvhhi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 2, i1 false)
+  ret void
+}
+
+define void @zero3(ptr %Dst) {
+; CHECK-LABEL: zero3:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 2(%r2), 0
+; CHECK-NEXT:    mvhhi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 3, i1 false)
+  ret void
+}
+
+define void @zero3_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero3_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvi 2(%r2), 0
+; CHECK-NEXT:    mvhhi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 3, i1 false)
+  ret void
+}
+
+define void @zero4(ptr %Dst) {
+; CHECK-LABEL: zero4:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvhi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 17, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 4, i1 false)
   ret void
 }
 
-define void @reg18(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg18:
+define void @zero4_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero4_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
-; CHECK-NEXT:    vsteh %v0, 16(%r2), 0
+; CHECK-NEXT:    mvhi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 18, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 4, i1 false)
   ret void
 }
 
-define void @reg19(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg19:
+define void @zero5(ptr %Dst) {
+; CHECK-LABEL: zero5:
 ; 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), 4
+; CHECK-NEXT:    mvi 4(%r2), 0
+; CHECK-NEXT:    mvhi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 19, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 5, i1 false)
   ret void
 }
 
-define void @reg20(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg20:
+define void @zero5_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero5_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), 4
+; CHECK-NEXT:    mvi 4(%r2), 0
+; CHECK-NEXT:    mvhi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 20, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 5, i1 false)
   ret void
 }
 
-define void @reg21(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg21:
+define void @zero6(ptr %Dst) {
+; CHECK-LABEL: zero6:
 ; 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), 4
+; CHECK-NEXT:    mvhhi 4(%r2), 0
+; CHECK-NEXT:    mvhi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 21, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 6, i1 false)
   ret void
 }
 
-define void @reg22(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg22:
+define void @zero6_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero6_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), 4
+; CHECK-NEXT:    mvhhi 4(%r2), 0
+; CHECK-NEXT:    mvhi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 22, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 6, i1 false)
   ret void
 }
 
-define void @reg23(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg23:
+define void @zero7(ptr %Dst) {
+; CHECK-LABEL: zero7:
 ; 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), 4
+; CHECK-NEXT:    xc 0(7,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 23, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 7, i1 false)
   ret void
 }
 
-define void @reg24(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg24:
+define void @zero7_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero7_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), 4
+; CHECK-NEXT:    xc 0(7,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 24, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 7, i1 false)
   ret void
 }
 
-define void @reg25(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg25:
+define void @zero8(ptr %Dst) {
+; CHECK-LABEL: zero8:
 ; 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), 4
+; CHECK-NEXT:    mvghi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 25, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 8, i1 false)
   ret void
 }
 
-define void @reg26(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg26:
+define void @zero8_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero8_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), 4
+; CHECK-NEXT:    mvi 0(%r2), 8
+; CHECK-NEXT:    mvc 1(7,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 26, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 8, i64 8, i1 false)
   ret void
 }
 
-define void @reg27(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg27:
+define void @zero9(ptr %Dst) {
+; CHECK-LABEL: zero9:
 ; 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), 4
+; CHECK-NEXT:    mvi 8(%r2), 0
+; CHECK-NEXT:    mvghi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 27, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 9, i1 false)
   ret void
 }
 
-define void @reg28(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg28:
+define void @zero9_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero9_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), 4
+; CHECK-NEXT:    mvi 8(%r2), 0
+; CHECK-NEXT:    mvghi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 28, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 9, i1 false)
   ret void
 }
 
-define void @reg29(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg29:
+define void @zero10(ptr %Dst) {
+; CHECK-LABEL: zero10:
 ; 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), 4
+; CHECK-NEXT:    mvhhi 8(%r2), 0
+; CHECK-NEXT:    mvghi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 29, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 10, i1 false)
   ret void
 }
 
-define void @reg30(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg30:
+define void @zero10_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero10_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), 4
+; CHECK-NEXT:    mvhhi 8(%r2), 0
+; CHECK-NEXT:    mvghi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 30, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 10, i1 false)
   ret void
 }
 
-define void @reg31(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg31:
+define void @zero11(ptr %Dst) {
+; CHECK-LABEL: zero11:
 ; 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), 4
+; CHECK-NEXT:    xc 0(11,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 31, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 11, i1 false)
   ret void
 }
 
-define void @reg32(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg32:
+define void @zero11_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero11_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vlvgp %v0, %r3, %r3
-; CHECK-NEXT:    vrepb %v0, %v0, 7
-; CHECK-NEXT:    vst %v0, 16(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(11,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 32, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 11, i1 false)
   ret void
 }
 
-define void @reg33(ptr %Dst, i8 %val) {
-; CHECK-LABEL: reg33:
+define void @zero12(ptr %Dst) {
+; CHECK-LABEL: zero12:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    stc %r3, 0(%r2)
-; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
+; CHECK-NEXT:    mvhi 8(%r2), 0
+; CHECK-NEXT:    mvghi 0(%r2), 0
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 33, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 12, i1 false)
   ret void
 }
 
-;; Immediate value
+define void @zero12_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero12_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    mvhi 8(%r2), 0
+; CHECK-NEXT:    mvghi 0(%r2), 0
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 12, i1 false)
+  ret void
+}
 
-define void @imm17(ptr %Dst) {
-; CHECK-LABEL: imm17:
+define void @zero13(ptr %Dst) {
+; CHECK-LABEL: zero13:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    mvi 0(%r2), 1
-; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
+; CHECK-NEXT:    xc 0(13,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 17, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 13, i1 false)
   ret void
 }
 
-define void @imm18(ptr %Dst) {
-; CHECK-LABEL: imm18:
+define void @zero13_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero13_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(13,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 13, i1 false)
+  ret void
+}
+
+define void @zero14(ptr %Dst) {
+; CHECK-LABEL: zero14:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(14,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 14, i1 false)
+  ret void
+}
+
+define void @zero14_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero14_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(14,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 14, i1 false)
+  ret void
+}
+
+define void @zero15(ptr %Dst) {
+; CHECK-LABEL: zero15:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(15,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 15, i1 false)
+  ret void
+}
+
+define void @zero15_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero15_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(15,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 15, i1 false)
+  ret void
+}
+
+define void @zero16(ptr %Dst) {
+; CHECK-LABEL: zero16:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vgbm %v0, 0
+; CHECK-NEXT:    vst %v0, 0(%r2), 3
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 16, i1 false)
+  ret void
+}
+
+define void @zero16_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero16_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vgbm %v0, 0
+; CHECK-NEXT:    vst %v0, 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 16, i1 false)
+  ret void
+}
+
+define void @zero17(ptr %Dst) {
+; CHECK-LABEL: zero17:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(17,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 17, i1 false)
+  ret void
+}
+
+define void @zero17_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero17_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
-; CHECK-NEXT:    mvhhi 16(%r2), -1
+; CHECK-NEXT:    xc 0(17,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 18, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 17, i1 false)
   ret void
 }
 
@@ -233,95 +1771,155 @@ define void @zero18(ptr %Dst) {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    xc 0(18,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 18, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 18, i1 false)
   ret void
 }
 
-define void @imm19(ptr %Dst) {
-; CHECK-LABEL: imm19:
+define void @zero18_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero18_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vstef %v0, 15(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(18,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 19, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 18, i1 false)
   ret void
 }
 
-define void @imm20(ptr %Dst) {
-; CHECK-LABEL: imm20:
+define void @zero19(ptr %Dst) {
+; CHECK-LABEL: zero19:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
-; CHECK-NEXT:    mvhi 16(%r2), -1
+; CHECK-NEXT:    xc 0(19,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 20, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 19, i1 false)
   ret void
 }
 
-define void @imm21(ptr %Dst) {
-; CHECK-LABEL: imm21:
+define void @zero19_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero19_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vsteg %v0, 13(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(19,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 21, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 19, i1 false)
   ret void
 }
 
-define void @imm22(ptr %Dst) {
-; CHECK-LABEL: imm22:
+define void @zero20(ptr %Dst) {
+; CHECK-LABEL: zero20:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
-; CHECK-NEXT:    mvghi 14(%r2), -1
+; CHECK-NEXT:    xc 0(20,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 22, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 20, i1 false)
   ret void
 }
 
-define void @imm23(ptr %Dst) {
-; CHECK-LABEL: imm23:
+define void @zero20_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero20_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vsteg %v0, 15(%r2), 0
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(20,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 23, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 20, i1 false)
   ret void
 }
 
-define void @imm24(ptr %Dst) {
-; CHECK-LABEL: imm24:
+define void @zero20_localDst() {
+; CHECK-LABEL: zero20_localDst:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
-; CHECK-NEXT:    mvghi 16(%r2), -1
+; CHECK-NEXT:    aghi %r15, -184
+; CHECK-NEXT:    .cfi_def_cfa_offset 344
+; CHECK-NEXT:    xc 164(20,%r15), 164(%r15)
+; CHECK-NEXT:    aghi %r15, 184
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 24, i1 false)
+  %Dst = alloca [20 x i8]
+  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 20, i1 false)
   ret void
 }
 
-define void @imm25(ptr %Dst) {
-; CHECK-LABEL: imm25:
+define void @zero21(ptr %Dst) {
+; CHECK-LABEL: zero21:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vst %v0, 9(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(21,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 25, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 21, i1 false)
   ret void
 }
 
-define void @imm26(ptr %Dst) {
-; CHECK-LABEL: imm26:
+define void @zero21_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero21_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 10(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(21,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 21, i1 false)
+  ret void
+}
+
+define void @zero22(ptr %Dst) {
+; CHECK-LABEL: zero22:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(22,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 22, i1 false)
+  ret void
+}
+
+define void @zero22_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero22_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(22,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 22, i1 false)
+  ret void
+}
+
+define void @zero23(ptr %Dst) {
+; CHECK-LABEL: zero23:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(23,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 23, i1 false)
+  ret void
+}
+
+define void @zero23_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero23_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(23,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 23, i1 false)
+  ret void
+}
+
+define void @zero24(ptr %Dst) {
+; CHECK-LABEL: zero24:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(24,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 24, i1 false)
+  ret void
+}
+
+define void @zero24_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero24_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(24,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 24, i1 false)
+  ret void
+}
+
+define void @zero25(ptr %Dst) {
+; CHECK-LABEL: zero25:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(25,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 25, i1 false)
+  ret void
+}
+
+define void @zero25_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero25_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(25,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 26, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 25, i1 false)
   ret void
 }
 
@@ -330,73 +1928,106 @@ define void @zero26(ptr %Dst) {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    xc 0(26,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 26, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 26, i1 false)
   ret void
 }
 
-define void @imm27(ptr %Dst) {
-; CHECK-LABEL: imm27:
+define void @zero26_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero26_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vst %v0, 11(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(26,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 27, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 26, i1 false)
   ret void
 }
 
-define void @imm28(ptr %Dst) {
-; CHECK-LABEL: imm28:
+define void @zero27(ptr %Dst) {
+; CHECK-LABEL: zero27:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 12(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(27,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 28, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 27, i1 false)
   ret void
 }
 
-define void @imm29(ptr %Dst) {
-; CHECK-LABEL: imm29:
+define void @zero27_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero27_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vst %v0, 13(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(27,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 29, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 27, i1 false)
   ret void
 }
 
-define void @imm30(ptr %Dst) {
-; CHECK-LABEL: imm30:
+define void @zero28(ptr %Dst) {
+; CHECK-LABEL: zero28:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 14(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(28,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 30, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 28, i1 false)
   ret void
 }
 
-define void @imm31(ptr %Dst) {
-; CHECK-LABEL: imm31:
+define void @zero28_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero28_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vrepib %v0, 1
-; CHECK-NEXT:    vst %v0, 15(%r2)
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(28,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 31, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 28, i1 false)
   ret void
 }
 
-define void @imm32(ptr %Dst) {
-; CHECK-LABEL: imm32:
+define void @zero29(ptr %Dst) {
+; CHECK-LABEL: zero29:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(29,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 29, i1 false)
+  ret void
+}
+
+define void @zero29_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero29_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(29,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 29, i1 false)
+  ret void
+}
+
+define void @zero30(ptr %Dst) {
+; CHECK-LABEL: zero30:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(30,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 30, i1 false)
+  ret void
+}
+
+define void @zero30_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero30_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(30,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 30, i1 false)
+  ret void
+}
+
+define void @zero31(ptr %Dst) {
+; CHECK-LABEL: zero31:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(31,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 31, i1 false)
+  ret void
+}
+
+define void @zero31_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero31_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vgbm %v0, 65535
-; CHECK-NEXT:    vst %v0, 16(%r2), 4
-; CHECK-NEXT:    vst %v0, 0(%r2), 4
+; CHECK-NEXT:    xc 0(31,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 32, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 31, i1 false)
   ret void
 }
 
@@ -405,16 +2036,33 @@ define void @zero32(ptr %Dst) {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    xc 0(32,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 32, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 32, i1 false)
   ret void
 }
 
-define void @imm33(ptr %Dst) {
-; CHECK-LABEL: imm33:
+define void @zero32_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero32_unaligned:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    mvi 0(%r2), 1
-; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
+; CHECK-NEXT:    xc 0(32,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 32, i1 false)
+  ret void
+}
+
+define void @zero33(ptr %Dst) {
+; CHECK-LABEL: zero33:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(33,%r2), 0(%r2)
+; CHECK-NEXT:    br %r14
+  call void @llvm.memset.p0.i64(ptr align 8 %Dst, i8 0, i64 33, i1 false)
+  ret void
+}
+
+define void @zero33_unaligned(ptr %Dst) {
+; CHECK-LABEL: zero33_unaligned:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    xc 0(33,%r2), 0(%r2)
 ; CHECK-NEXT:    br %r14
-  call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 33, i1 false)
+  call void @llvm.memset.p0.i64(ptr align 1 %Dst, i8 0, i64 33, i1 false)
   ret void
 }

>From 4b05fe24e47d89f6f203823a0e33edf832c7c9d5 Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Mon, 4 May 2026 17:49:56 +0200
Subject: [PATCH 2/4] [SystemZ] Avoid unaligned VL/VST:s with
 memcpy/memmove/memset. (#187100)

Also limit the number of stores per memmove to 2, like for memcpy.
---
 .../Target/SystemZ/SystemZISelLowering.cpp    |  26 +-
 llvm/test/CodeGen/SystemZ/memcpy-03.ll        | 125 ++-----
 llvm/test/CodeGen/SystemZ/memmove-01.ll       | 328 ++++++++++++------
 llvm/test/CodeGen/SystemZ/memset-08.ll        | 242 +++++--------
 4 files changed, 346 insertions(+), 375 deletions(-)

diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
index f9a41cbeec004..4c8f70503df4a 100644
--- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
@@ -830,6 +830,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
@@ -1473,17 +1477,21 @@ bool SystemZTargetLowering::findOptimalMemOpLowering(
     LLVMContext &Context, std::vector<EVT> &MemOps, unsigned Limit,
     const MemOp &Op, unsigned DstAS, unsigned SrcAS,
     const AttributeList &FuncAttributes) 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);
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

>From 1b64f08998308b2e0dd8bb2c09a46ca090dcfb1c Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Wed, 6 May 2026 10:25:52 +0200
Subject: [PATCH 3/4] [SystemZ] Remove superfluous args in tests. (#196022)

The third %val argument only makes sense for memset, so remove from
memcpy/memmove tests.
---
 llvm/test/CodeGen/SystemZ/memcpy-03.ll  | 138 ++++++++++++------------
 llvm/test/CodeGen/SystemZ/memmove-01.ll | 138 ++++++++++++------------
 2 files changed, 138 insertions(+), 138 deletions(-)

diff --git a/llvm/test/CodeGen/SystemZ/memcpy-03.ll b/llvm/test/CodeGen/SystemZ/memcpy-03.ll
index ef0da0c87b4d6..213764e79ffb2 100644
--- a/llvm/test/CodeGen/SystemZ/memcpy-03.ll
+++ b/llvm/test/CodeGen/SystemZ/memcpy-03.ll
@@ -6,7 +6,7 @@
 
 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
 
-define void @fun1(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun1(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun1:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(1,%r2), 0(%r3)
@@ -15,7 +15,7 @@ define void @fun1(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun1_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun1_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun1_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(1,%r2), 0(%r3)
@@ -24,7 +24,7 @@ define void @fun1_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun2(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun2(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun2:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(2,%r2), 0(%r3)
@@ -33,7 +33,7 @@ define void @fun2(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun2_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun2_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun2_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(2,%r2), 0(%r3)
@@ -42,7 +42,7 @@ define void @fun2_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun3(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun3(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun3:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(3,%r2), 0(%r3)
@@ -51,7 +51,7 @@ define void @fun3(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun3_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun3_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun3_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(3,%r2), 0(%r3)
@@ -60,7 +60,7 @@ define void @fun3_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun4(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun4(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun4:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(4,%r2), 0(%r3)
@@ -69,7 +69,7 @@ define void @fun4(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun4_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun4_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun4_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(4,%r2), 0(%r3)
@@ -78,7 +78,7 @@ define void @fun4_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun5(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun5(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun5:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(5,%r2), 0(%r3)
@@ -87,7 +87,7 @@ define void @fun5(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun5_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun5_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun5_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(5,%r2), 0(%r3)
@@ -96,7 +96,7 @@ define void @fun5_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun6(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun6(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun6:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(6,%r2), 0(%r3)
@@ -105,7 +105,7 @@ define void @fun6(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun6_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun6_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun6_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(6,%r2), 0(%r3)
@@ -114,7 +114,7 @@ define void @fun6_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun7(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun7(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun7:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(7,%r2), 0(%r3)
@@ -123,7 +123,7 @@ define void @fun7(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun7_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun7_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun7_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(7,%r2), 0(%r3)
@@ -132,7 +132,7 @@ define void @fun7_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun8(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun8(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun8:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(8,%r2), 0(%r3)
@@ -141,7 +141,7 @@ define void @fun8(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun8_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun8_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun8_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(8,%r2), 0(%r3)
@@ -150,7 +150,7 @@ define void @fun8_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun9(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun9(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun9:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(9,%r2), 0(%r3)
@@ -159,7 +159,7 @@ define void @fun9(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun9_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun9_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun9_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(9,%r2), 0(%r3)
@@ -168,7 +168,7 @@ define void @fun9_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun10(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun10(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun10:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(10,%r2), 0(%r3)
@@ -177,7 +177,7 @@ define void @fun10(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun10_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun10_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun10_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(10,%r2), 0(%r3)
@@ -186,7 +186,7 @@ define void @fun10_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun11(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun11(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun11:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(11,%r2), 0(%r3)
@@ -195,7 +195,7 @@ define void @fun11(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun11_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun11_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun11_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(11,%r2), 0(%r3)
@@ -204,7 +204,7 @@ define void @fun11_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun12(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun12(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun12:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(12,%r2), 0(%r3)
@@ -213,7 +213,7 @@ define void @fun12(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun12_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun12_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun12_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(12,%r2), 0(%r3)
@@ -222,7 +222,7 @@ define void @fun12_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun13(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun13(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun13:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(13,%r2), 0(%r3)
@@ -231,7 +231,7 @@ define void @fun13(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun13_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun13_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun13_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(13,%r2), 0(%r3)
@@ -240,7 +240,7 @@ define void @fun13_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun14(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun14(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun14:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(14,%r2), 0(%r3)
@@ -249,7 +249,7 @@ define void @fun14(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun14_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun14_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun14_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(14,%r2), 0(%r3)
@@ -258,7 +258,7 @@ define void @fun14_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun15(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun15(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun15:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(15,%r2), 0(%r3)
@@ -267,7 +267,7 @@ define void @fun15(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun15_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun15_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun15_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(15,%r2), 0(%r3)
@@ -276,7 +276,7 @@ define void @fun15_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun16(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun16(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun16:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(16,%r2), 0(%r3)
@@ -285,7 +285,7 @@ define void @fun16(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun16_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun16_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun16_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(16,%r2), 0(%r3)
@@ -294,7 +294,7 @@ define void @fun16_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun17(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun17:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lb %r0, 16(%r3)
@@ -306,7 +306,7 @@ define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun17_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun17_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(17,%r2), 0(%r3)
@@ -315,7 +315,7 @@ define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun17_unalignedSrc(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun17_unalignedSrc(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun17_unalignedSrc:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(17,%r2), 0(%r3)
@@ -324,7 +324,7 @@ define void @fun17_unalignedSrc(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun18(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun18:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lh %r0, 16(%r3)
@@ -336,7 +336,7 @@ define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun18_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun18_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(18,%r2), 0(%r3)
@@ -345,7 +345,7 @@ define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun18_unalignedDst(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun18_unalignedDst(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun18_unalignedDst:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(18,%r2), 0(%r3)
@@ -354,7 +354,7 @@ define void @fun18_unalignedDst(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun19(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun19:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    l %r0, 15(%r3)
@@ -366,7 +366,7 @@ define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun19_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun19_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun19_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(19,%r2), 0(%r3)
@@ -375,7 +375,7 @@ define void @fun19_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun20(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun20:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    l %r0, 16(%r3)
@@ -387,7 +387,7 @@ define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun20_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun20_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun20_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(20,%r2), 0(%r3)
@@ -396,7 +396,7 @@ define void @fun20_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun20_localDst(ptr %Src, i8 %val) {
+define void @fun20_localDst(ptr %Src) {
 ; CHECK-LABEL: fun20_localDst:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    aghi %r15, -184
@@ -411,7 +411,7 @@ define void @fun20_localDst(ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun21(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun21:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lg %r0, 13(%r3)
@@ -423,7 +423,7 @@ define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun21_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun21_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun21_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(21,%r2), 0(%r3)
@@ -432,7 +432,7 @@ define void @fun21_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun22(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun22:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lg %r0, 14(%r3)
@@ -444,7 +444,7 @@ define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun22_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun22_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun22_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(22,%r2), 0(%r3)
@@ -453,7 +453,7 @@ define void @fun22_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun23(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun23:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lg %r0, 15(%r3)
@@ -465,7 +465,7 @@ define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun23_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun23_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun23_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(23,%r2), 0(%r3)
@@ -474,7 +474,7 @@ define void @fun23_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun24(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun24:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lg %r0, 16(%r3)
@@ -486,7 +486,7 @@ define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun24_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun24_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(24,%r2), 0(%r3)
@@ -495,7 +495,7 @@ define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun25(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun25:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(25,%r2), 0(%r3)
@@ -504,7 +504,7 @@ define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun25_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun25_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(25,%r2), 0(%r3)
@@ -513,7 +513,7 @@ define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun26(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun26:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(26,%r2), 0(%r3)
@@ -522,7 +522,7 @@ define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun26_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun26_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(26,%r2), 0(%r3)
@@ -531,7 +531,7 @@ define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun27(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun27:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(27,%r2), 0(%r3)
@@ -540,7 +540,7 @@ define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun27_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun27_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(27,%r2), 0(%r3)
@@ -549,7 +549,7 @@ define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun28(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun28:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(28,%r2), 0(%r3)
@@ -558,7 +558,7 @@ define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun28_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun28_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(28,%r2), 0(%r3)
@@ -567,7 +567,7 @@ define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun29(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun29:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(29,%r2), 0(%r3)
@@ -576,7 +576,7 @@ define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun29_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun29_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(29,%r2), 0(%r3)
@@ -585,7 +585,7 @@ define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun30(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun30:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(30,%r2), 0(%r3)
@@ -594,7 +594,7 @@ define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun30_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun30_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(30,%r2), 0(%r3)
@@ -603,7 +603,7 @@ define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun31(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun31:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(31,%r2), 0(%r3)
@@ -612,7 +612,7 @@ define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun31_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun31_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun31_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(31,%r2), 0(%r3)
@@ -621,7 +621,7 @@ define void @fun31_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun32(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun32:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 16(%r3), 3
@@ -633,7 +633,7 @@ define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun32_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun32_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(32,%r2), 0(%r3)
@@ -642,7 +642,7 @@ define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun33(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun33:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(33,%r2), 0(%r3)
@@ -651,7 +651,7 @@ define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun33_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun33_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun33_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    mvc 0(33,%r2), 0(%r3)
diff --git a/llvm/test/CodeGen/SystemZ/memmove-01.ll b/llvm/test/CodeGen/SystemZ/memmove-01.ll
index 2beb5d7577851..62459ccf487c8 100644
--- a/llvm/test/CodeGen/SystemZ/memmove-01.ll
+++ b/llvm/test/CodeGen/SystemZ/memmove-01.ll
@@ -6,7 +6,7 @@
 
 declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
 
-define void @fun1(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun1(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun1:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -22,7 +22,7 @@ define void @fun1(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun1_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun1_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun1_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -38,7 +38,7 @@ define void @fun1_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun2(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun2(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun2:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -54,7 +54,7 @@ define void @fun2(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun2_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun2_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun2_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -70,7 +70,7 @@ define void @fun2_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun3(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun3(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun3:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -86,7 +86,7 @@ define void @fun3(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun3_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun3_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun3_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -102,7 +102,7 @@ define void @fun3_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun4(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun4(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun4:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -118,7 +118,7 @@ define void @fun4(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun4_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun4_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun4_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -134,7 +134,7 @@ define void @fun4_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun5(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun5(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun5:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -150,7 +150,7 @@ define void @fun5(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun5_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun5_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun5_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -166,7 +166,7 @@ define void @fun5_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun6(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun6(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun6:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -182,7 +182,7 @@ define void @fun6(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun6_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun6_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun6_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -198,7 +198,7 @@ define void @fun6_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun7(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun7(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun7:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -214,7 +214,7 @@ define void @fun7(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun7_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun7_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun7_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -230,7 +230,7 @@ define void @fun7_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun8(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun8(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun8:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -246,7 +246,7 @@ define void @fun8(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun8_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun8_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun8_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -262,7 +262,7 @@ define void @fun8_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun9(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun9(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun9:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -278,7 +278,7 @@ define void @fun9(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun9_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun9_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun9_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -294,7 +294,7 @@ define void @fun9_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun10(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun10(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun10:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -310,7 +310,7 @@ define void @fun10(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun10_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun10_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun10_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -326,7 +326,7 @@ define void @fun10_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun11(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun11(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun11:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -342,7 +342,7 @@ define void @fun11(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun11_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun11_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun11_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -358,7 +358,7 @@ define void @fun11_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun12(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun12(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun12:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -374,7 +374,7 @@ define void @fun12(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun12_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun12_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun12_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -390,7 +390,7 @@ define void @fun12_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun13(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun13(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun13:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -406,7 +406,7 @@ define void @fun13(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun13_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun13_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun13_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -422,7 +422,7 @@ define void @fun13_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun14(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun14(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun14:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -438,7 +438,7 @@ define void @fun14(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun14_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun14_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun14_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -454,7 +454,7 @@ define void @fun14_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun15(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun15(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun15:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -470,7 +470,7 @@ define void @fun15(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun15_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun15_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun15_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -486,7 +486,7 @@ define void @fun15_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun16(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun16(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun16:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -502,7 +502,7 @@ define void @fun16(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun16_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun16_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun16_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -518,7 +518,7 @@ define void @fun16_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun17(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun17:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lb %r0, 16(%r3)
@@ -530,7 +530,7 @@ define void @fun17(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun17_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun17_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -546,7 +546,7 @@ define void @fun17_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun17_unalignedSrc(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun17_unalignedSrc(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun17_unalignedSrc:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -562,7 +562,7 @@ define void @fun17_unalignedSrc(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun18(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun18:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    lh %r0, 16(%r3)
@@ -574,7 +574,7 @@ define void @fun18(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun18_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun18_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -590,7 +590,7 @@ define void @fun18_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun18_unalignedDst(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun18_unalignedDst(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun18_unalignedDst:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -606,7 +606,7 @@ define void @fun18_unalignedDst(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun19(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun19:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -618,7 +618,7 @@ define void @fun19(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun19_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun19_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun19_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -634,7 +634,7 @@ define void @fun19_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun20(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun20:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -646,7 +646,7 @@ define void @fun20(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun20_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun20_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun20_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -662,7 +662,7 @@ define void @fun20_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun20_localDst(ptr %Src, i8 %val) {
+define void @fun20_localDst(ptr %Src) {
 ; CHECK-LABEL: fun20_localDst:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    aghi %r15, -184
@@ -677,7 +677,7 @@ define void @fun20_localDst(ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun21(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun21:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -689,7 +689,7 @@ define void @fun21(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun21_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun21_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun21_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -705,7 +705,7 @@ define void @fun21_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun22(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun22:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -717,7 +717,7 @@ define void @fun22(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun22_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun22_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun22_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -733,7 +733,7 @@ define void @fun22_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun23(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun23:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -745,7 +745,7 @@ define void @fun23(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun23_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun23_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun23_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -761,7 +761,7 @@ define void @fun23_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun24(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun24:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -773,7 +773,7 @@ define void @fun24(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun24_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun24_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -789,7 +789,7 @@ define void @fun24_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun25(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun25:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -805,7 +805,7 @@ define void @fun25(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun25_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun25_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -821,7 +821,7 @@ define void @fun25_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun26(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun26:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -837,7 +837,7 @@ define void @fun26(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun26_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun26_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -853,7 +853,7 @@ define void @fun26_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun27(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun27:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -869,7 +869,7 @@ define void @fun27(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun27_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun27_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -885,7 +885,7 @@ define void @fun27_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun28(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun28:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -901,7 +901,7 @@ define void @fun28(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun28_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun28_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -917,7 +917,7 @@ define void @fun28_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun29(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun29:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -933,7 +933,7 @@ define void @fun29(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun29_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun29_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -949,7 +949,7 @@ define void @fun29_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun30(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun30:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -965,7 +965,7 @@ define void @fun30(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun30_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun30_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -981,7 +981,7 @@ define void @fun30_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun31(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun31:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -997,7 +997,7 @@ define void @fun31(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun31_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun31_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun31_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -1013,7 +1013,7 @@ define void @fun31_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun32(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun32:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vl %v0, 0(%r3), 3
@@ -1025,7 +1025,7 @@ define void @fun32(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun32_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun32_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -1041,7 +1041,7 @@ define void @fun32_unaligned(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun33(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun33:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)
@@ -1057,7 +1057,7 @@ define void @fun33(ptr %Dst, ptr %Src, i8 %val) {
   ret void
 }
 
-define void @fun33_unaligned(ptr %Dst, ptr %Src, i8 %val) {
+define void @fun33_unaligned(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun33_unaligned:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    stmg %r14, %r15, 112(%r15)

>From c62c371382cec5b754b4674a5288a813aa962950 Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Thu, 7 May 2026 14:53:46 +0200
Subject: [PATCH 4/4] Fix memmove-01.ll test (to use libcalls in some cases).

---
 llvm/test/CodeGen/SystemZ/memmove-01.ll | 48 ++++++++++++++++---------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/llvm/test/CodeGen/SystemZ/memmove-01.ll b/llvm/test/CodeGen/SystemZ/memmove-01.ll
index 62459ccf487c8..b9c60fbe59a77 100644
--- a/llvm/test/CodeGen/SystemZ/memmove-01.ll
+++ b/llvm/test/CodeGen/SystemZ/memmove-01.ll
@@ -609,10 +609,14 @@ define void @fun18_unalignedDst(ptr %Dst, ptr %Src) {
 define void @fun19(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun19:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    l %r0, 15(%r3)
-; CHECK-NEXT:    st %r0, 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, 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 8 %Dst, ptr align 8 %Src, i64 19, i1 false)
   ret void
@@ -680,10 +684,14 @@ define void @fun20_localDst(ptr %Src) {
 define void @fun21(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun21:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    lg %r0, 13(%r3)
-; CHECK-NEXT:    stg %r0, 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, 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 8 %Dst, ptr align 8 %Src, i64 21, i1 false)
   ret void
@@ -708,10 +716,14 @@ define void @fun21_unaligned(ptr %Dst, ptr %Src) {
 define void @fun22(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun22:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    lg %r0, 14(%r3)
-; CHECK-NEXT:    stg %r0, 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, 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 8 %Dst, ptr align 8 %Src, i64 22, i1 false)
   ret void
@@ -736,10 +748,14 @@ define void @fun22_unaligned(ptr %Dst, ptr %Src) {
 define void @fun23(ptr %Dst, ptr %Src) {
 ; CHECK-LABEL: fun23:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vl %v0, 0(%r3), 3
-; CHECK-NEXT:    lg %r0, 15(%r3)
-; CHECK-NEXT:    stg %r0, 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, 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 8 %Dst, ptr align 8 %Src, i64 23, i1 false)
   ret void



More information about the llvm-branch-commits mailing list