blob: 7f1667a45559b5cf549e19660b8e5ebb7787f919 [file] [log] [blame]
Dan Gohmanc1be92f2010-10-18 18:04:47 +00001; RUN: opt < %s -basicaa -memcpyopt -S | FileCheck %s
Chris Lattnerf41eaac2009-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 Lattnerb85e4eb2011-06-18 06:05:24 +00007declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
Chris Lattnerf41eaac2009-09-01 17:56:32 +00008
9define i8* @test1(i8* nocapture %src) nounwind {
10entry:
11; CHECK: @test1
12; CHECK: call void @llvm.memcpy
13
Chris Lattner26b00002011-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 Lattnerb85e4eb2011-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 Lattnerf41eaac2009-09-01 17:56:32 +000018 ret i8* %call3.sub
19}
Chris Lattner26b00002011-06-17 03:14:27 +000020declare noalias i8* @malloc(i32)
21
Chris Lattnerf41eaac2009-09-01 17:56:32 +000022
23define void @test2(i8* %P) nounwind {
24entry:
25; CHECK: @test2
26; CHECK: call void @llvm.memcpy
Chris Lattnerb85e4eb2011-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 Lattnerf41eaac2009-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:
35; CHECK: @test3
36; CHECK: call void @llvm.memmove
Chris Lattnerb85e4eb2011-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 Lattnerf41eaac2009-09-01 17:56:32 +000039 ret void
40}