| Dan Gohman | 02538ac | 2010-10-18 18:04:47 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -basicaa -memcpyopt -S | FileCheck %s | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 2 | ; These memmoves should get optimized to memcpys. | 
|  | 3 |  | 
|  | 4 | target 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" | 
|  | 5 | target triple = "x86_64-apple-darwin9.0" | 
|  | 6 |  | 
| Pete Cooper | 72bc23e | 2015-11-18 22:17:24 +0000 | [diff] [blame^] | 7 | declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i1) nounwind | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 8 |  | 
|  | 9 | define i8* @test1(i8* nocapture %src) nounwind { | 
|  | 10 | entry: | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 11 | ; CHECK-LABEL: @test1( | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 12 | ; CHECK: call void @llvm.memcpy | 
|  | 13 |  | 
| David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 14 | %malloccall = tail call i8* @malloc(i32 trunc (i64 mul nuw (i64 ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64), i64 13) to i32)) | 
| Chris Lattner | b90ed22 | 2011-06-17 03:14:27 +0000 | [diff] [blame] | 15 | %call3 = bitcast i8* %malloccall to [13 x i8]* | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 16 | %call3.sub = getelementptr inbounds [13 x i8], [13 x i8]* %call3, i64 0, i64 0 | 
| Pete Cooper | 72bc23e | 2015-11-18 22:17:24 +0000 | [diff] [blame^] | 17 | tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %call3.sub, i8* %src, i64 13, i1 false) | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 18 | ret i8* %call3.sub | 
|  | 19 | } | 
| Chris Lattner | b90ed22 | 2011-06-17 03:14:27 +0000 | [diff] [blame] | 20 | declare noalias i8* @malloc(i32) | 
|  | 21 |  | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 22 |  | 
|  | 23 | define void @test2(i8* %P) nounwind { | 
|  | 24 | entry: | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 25 | ; CHECK-LABEL: @test2( | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 26 | ; CHECK: call void @llvm.memcpy | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 27 | %add.ptr = getelementptr i8, i8* %P, i64 16 | 
| Pete Cooper | 72bc23e | 2015-11-18 22:17:24 +0000 | [diff] [blame^] | 28 | tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %add.ptr, i64 16, i1 false) | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 29 | ret void | 
|  | 30 | } | 
|  | 31 |  | 
|  | 32 | ; This cannot be optimize because the src/dst really do overlap. | 
|  | 33 | define void @test3(i8* %P) nounwind { | 
|  | 34 | entry: | 
| Stephen Lin | c1c7a13 | 2013-07-14 01:42:54 +0000 | [diff] [blame] | 35 | ; CHECK-LABEL: @test3( | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 36 | ; CHECK: call void @llvm.memmove | 
| David Blaikie | 79e6c74 | 2015-02-27 19:29:02 +0000 | [diff] [blame] | 37 | %add.ptr = getelementptr i8, i8* %P, i64 16 | 
| Pete Cooper | 72bc23e | 2015-11-18 22:17:24 +0000 | [diff] [blame^] | 38 | tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %P, i8* %add.ptr, i64 17, i1 false) | 
| Chris Lattner | 1145e33 | 2009-09-01 17:56:32 +0000 | [diff] [blame] | 39 | ret void | 
|  | 40 | } |