xref: /llvm-project/llvm/test/Transforms/MemCpyOpt/pr102994.ll (revision 378daa6c6fd10d3704be449f2fe9c55df522a6e9)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -S -passes=memcpyopt < %s | FileCheck %s
3
4@g1 = external global i8
5@g2 = external global [64 x i8]
6@g3 = global i8 0, align 1
7
8define void @func() {
9; CHECK-LABEL: define void @func() {
10; CHECK-NEXT:  [[ENTRY:.*:]]
11; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g2, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g2, i64 16), i64 20, i1 false)
12; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr @g1, ptr getelementptr inbounds (i8, ptr @g2, i64 24), i64 1, i1 false)
13; CHECK-NEXT:    ret void
14;
15entry:
16  call void @llvm.memcpy.p0.p0.i64(ptr getelementptr inbounds (i8, ptr @g2, i64 16), ptr getelementptr inbounds nuw (i8, ptr @g2, i64 16), i64 20, i1 false)
17  call void @llvm.memcpy.p0.p0.i64(ptr @g1, ptr getelementptr inbounds (i8, ptr @g2, i64 24), i64 1, i1 false)
18  ret void
19}
20
21define void @func2(ptr %p) {
22; CHECK-LABEL: define void @func2(
23; CHECK-SAME: ptr [[P:%.*]]) {
24; CHECK-NEXT:  [[ENTRY:.*:]]
25; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 32
26; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[P]], i64 34
27; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr i8, ptr [[P]], i64 32
28; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[GEP1]], ptr [[GEP3]], i64 32, i1 false)
29; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr @g3, ptr [[GEP2]], i64 1, i1 false)
30; CHECK-NEXT:    ret void
31;
32entry:
33  %gep1 = getelementptr i8, ptr %p, i64 32
34  %gep2 = getelementptr i8, ptr %p, i64 34
35  %gep3 = getelementptr i8, ptr %p, i64 32
36  call void @llvm.memcpy.p0.p0.i64(ptr %gep1, ptr %gep3, i64 32, i1 false)
37  call void @llvm.memcpy.p0.p0.i64(ptr @g3, ptr %gep2, i64 1, i1 false)
38  ret void
39}
40