blob: 2057760efa014d54b8bccb39fcbe12870c5faa90 [file] [log] [blame]
Dan Gohman02538ac2010-10-18 18:04:47 +00001; RUN: opt < %s -basicaa -memcpyopt -S | FileCheck %s
Chris Lattner1145e332009-09-01 17:56:32 +00002; These memmoves should get optimized to memcpys.
3
4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
5target triple = "x86_64-apple-darwin9.0"
6
Chris Lattner80ed9dc2011-06-18 06:05:24 +00007declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
Chris Lattner1145e332009-09-01 17:56:32 +00008
9define i8* @test1(i8* nocapture %src) nounwind {
10entry:
Stephen Linc1c7a132013-07-14 01:42:54 +000011; CHECK-LABEL: @test1(
Chris Lattner1145e332009-09-01 17:56:32 +000012; CHECK: call void @llvm.memcpy
13
Chris Lattnerb90ed222011-06-17 03:14:27 +000014 %malloccall = tail call i8* @malloc(i32 trunc (i64 mul nuw (i64 ptrtoint (i8* getelementptr (i8* null, i32 1) to i64), i64 13) to i32))
15 %call3 = bitcast i8* %malloccall to [13 x i8]*
Chris Lattner80ed9dc2011-06-18 06:05:24 +000016 %call3.sub = getelementptr inbounds [13 x i8]* %call3, i64 0, i64 0
17 tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %call3.sub, i8* %src, i64 13, i32 1, i1 false)
Chris Lattner1145e332009-09-01 17:56:32 +000018 ret i8* %call3.sub
19}
Chris Lattnerb90ed222011-06-17 03:14:27 +000020declare noalias i8* @malloc(i32)
21
Chris Lattner1145e332009-09-01 17:56:32 +000022
23define void @test2(i8* %P) nounwind {
24entry:
Stephen Linc1c7a132013-07-14 01:42:54 +000025; CHECK-LABEL: @test2(
Chris Lattner1145e332009-09-01 17:56:32 +000026; CHECK: call void @llvm.memcpy
Chris Lattner80ed9dc2011-06-18 06:05:24 +000027 %add.ptr = getelementptr i8* %P, i64 16
28 tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %add.ptr, i64 16, i32 1, i1 false)
Chris Lattner1145e332009-09-01 17:56:32 +000029 ret void
30}
31
32; This cannot be optimize because the src/dst really do overlap.
33define void @test3(i8* %P) nounwind {
34entry:
Stephen Linc1c7a132013-07-14 01:42:54 +000035; CHECK-LABEL: @test3(
Chris Lattner1145e332009-09-01 17:56:32 +000036; CHECK: call void @llvm.memmove
Chris Lattner80ed9dc2011-06-18 06:05:24 +000037 %add.ptr = getelementptr i8* %P, i64 16
38 tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %add.ptr, i64 17, i32 1, i1 false)
Chris Lattner1145e332009-09-01 17:56:32 +000039 ret void
40}