blob: 1c567042ce79214b546d3511725d995e74f2a10a [file] [log] [blame]
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +00001; RUN: opt -memcpyopt -S %s | FileCheck %s
2
3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4
5; CHECK-LABEL: define void @test(
Pete Cooper67cf9a72015-11-19 05:56:52 +00006; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
7; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst2, i8 %c, i64 128, i32 8, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +00008; CHECK-NEXT: ret void
9define void @test(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000010 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
11 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 128, i32 8, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000012 ret void
13}
14
15; CHECK-LABEL: define void @test_smaller_memcpy(
Pete Cooper67cf9a72015-11-19 05:56:52 +000016; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
17; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst2, i8 %c, i64 100, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000018; CHECK-NEXT: ret void
19define void @test_smaller_memcpy(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000020 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
21 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 100, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000022 ret void
23}
24
25; CHECK-LABEL: define void @test_smaller_memset(
Pete Cooper67cf9a72015-11-19 05:56:52 +000026; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 100, i32 1, i1 false)
27; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000028; CHECK-NEXT: ret void
29define void @test_smaller_memset(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000030 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 100, i32 1, i1 false)
31 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000032 ret void
33}
34
35; CHECK-LABEL: define void @test_align_memset(
Pete Cooper67cf9a72015-11-19 05:56:52 +000036; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 8, i1 false)
37; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst2, i8 %c, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000038; CHECK-NEXT: ret void
39define void @test_align_memset(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000040 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 8, i1 false)
41 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000042 ret void
43}
44
45; CHECK-LABEL: define void @test_different_types(
Pete Cooper67cf9a72015-11-19 05:56:52 +000046; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 8, i1 false)
47; CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* %dst2, i8 %c, i32 100, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000048; CHECK-NEXT: ret void
49define void @test_different_types(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000050 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 8, i1 false)
51 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst2, i8* %dst1, i32 100, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000052 ret void
53}
54
55; CHECK-LABEL: define void @test_different_types_2(
Pete Cooper67cf9a72015-11-19 05:56:52 +000056; CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* %dst1, i8 %c, i32 128, i32 8, i1 false)
57; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst2, i8 %c, i64 100, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000058; CHECK-NEXT: ret void
59define void @test_different_types_2(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000060 call void @llvm.memset.p0i8.i32(i8* %dst1, i8 %c, i32 128, i32 8, i1 false)
61 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 100, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000062 ret void
63}
64
65; CHECK-LABEL: define void @test_different_source_gep(
Pete Cooper67cf9a72015-11-19 05:56:52 +000066; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000067; CHECK-NEXT: %p = getelementptr i8, i8* %dst1, i64 64
Pete Cooper67cf9a72015-11-19 05:56:52 +000068; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %p, i64 64, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000069; CHECK-NEXT: ret void
70define void @test_different_source_gep(i8* %dst1, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000071 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000072 ; FIXME: We could optimize this as well.
73 %p = getelementptr i8, i8* %dst1, i64 64
Pete Cooper67cf9a72015-11-19 05:56:52 +000074 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %p, i64 64, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000075 ret void
76}
77
78; CHECK-LABEL: define void @test_variable_size_1(
Pete Cooper67cf9a72015-11-19 05:56:52 +000079; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 %dst1_size, i32 1, i1 false)
80; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000081; CHECK-NEXT: ret void
82define void @test_variable_size_1(i8* %dst1, i64 %dst1_size, i8* %dst2, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000083 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 %dst1_size, i32 1, i1 false)
84 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 128, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000085 ret void
86}
87
88; CHECK-LABEL: define void @test_variable_size_2(
Pete Cooper67cf9a72015-11-19 05:56:52 +000089; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
90; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 %dst2_size, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000091; CHECK-NEXT: ret void
92define void @test_variable_size_2(i8* %dst1, i8* %dst2, i64 %dst2_size, i8 %c) {
Pete Cooper67cf9a72015-11-19 05:56:52 +000093 call void @llvm.memset.p0i8.i64(i8* %dst1, i8 %c, i64 128, i32 1, i1 false)
94 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst2, i8* %dst1, i64 %dst2_size, i32 1, i1 false)
Ahmed Bougachaf8fa3b82015-05-16 01:32:26 +000095 ret void
96}
97
Pete Cooper67cf9a72015-11-19 05:56:52 +000098declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1)
99declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)
100declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1)
101declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1)