| Nick Lewycky | fc243d5 | 2014-09-01 06:03:11 +0000 | [diff] [blame] | 1 | ; RUN: opt -basicaa -memcpyopt -instcombine -S < %s | FileCheck %s |
| 2 | |
| 3 | target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" |
| 4 | target triple = "x86_64-unknown-linux-gnu" |
| 5 | |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 6 | define void @foo([8 x i64]* noalias nocapture sret dereferenceable(64) %sret) { |
| Nick Lewycky | fc243d5 | 2014-09-01 06:03:11 +0000 | [diff] [blame] | 7 | entry-block: |
| 8 | %a = alloca [8 x i64], align 8 |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 9 | %a.cast = bitcast [8 x i64]* %a to i8* |
| 10 | call void @llvm.lifetime.start(i64 64, i8* %a.cast) |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 11 | call void @llvm.memset.p0i8.i64(i8* %a.cast, i8 0, i64 64, i32 8, i1 false) |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 12 | %sret.cast = bitcast [8 x i64]* %sret to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 13 | call void @llvm.memcpy.p0i8.p0i8.i64(i8* %sret.cast, i8* %a.cast, i64 64, i32 8, i1 false) |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 14 | call void @llvm.lifetime.end(i64 64, i8* %a.cast) |
| Nick Lewycky | fc243d5 | 2014-09-01 06:03:11 +0000 | [diff] [blame] | 15 | ret void |
| 16 | |
| 17 | ; CHECK-LABEL: @foo( |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 18 | ; CHECK: %[[sret_cast:[^=]+]] = bitcast [8 x i64]* %sret to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 19 | ; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %[[sret_cast]], i8 0, i64 64 |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 20 | ; CHECK-NOT: call void @llvm.memcpy |
| 21 | ; CHECK: ret void |
| 22 | } |
| 23 | |
| 24 | define void @bar([8 x i64]* noalias nocapture sret dereferenceable(64) %sret, [8 x i64]* noalias nocapture dereferenceable(64) %out) { |
| 25 | entry-block: |
| 26 | %a = alloca [8 x i64], align 8 |
| 27 | %a.cast = bitcast [8 x i64]* %a to i8* |
| 28 | call void @llvm.lifetime.start(i64 64, i8* %a.cast) |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 29 | call void @llvm.memset.p0i8.i64(i8* %a.cast, i8 0, i64 64, i32 8, i1 false) |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 30 | %sret.cast = bitcast [8 x i64]* %sret to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 31 | call void @llvm.memcpy.p0i8.p0i8.i64(i8* %sret.cast, i8* %a.cast, i64 64, i32 8, i1 false) |
| 32 | call void @llvm.memset.p0i8.i64(i8* %a.cast, i8 42, i64 32, i32 8, i1 false) |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 33 | %out.cast = bitcast [8 x i64]* %out to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 34 | call void @llvm.memcpy.p0i8.p0i8.i64(i8* %out.cast, i8* %a.cast, i64 64, i32 8, i1 false) |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 35 | call void @llvm.lifetime.end(i64 64, i8* %a.cast) |
| 36 | ret void |
| 37 | |
| 38 | ; CHECK-LABEL: @bar( |
| 39 | ; CHECK: %[[a:[^=]+]] = alloca [8 x i64] |
| 40 | ; CHECK: %[[a_cast:[^=]+]] = bitcast [8 x i64]* %[[a]] to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 41 | ; CHECK: call void @llvm.memset.p0i8.i64(i8* %[[a_cast]], i8 0, i64 64 |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 42 | ; CHECK: %[[sret_cast:[^=]+]] = bitcast [8 x i64]* %sret to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 43 | ; CHECK: call void @llvm.memset.p0i8.i64(i8* %[[sret_cast]], i8 0, i64 64 |
| 44 | ; CHECK: call void @llvm.memset.p0i8.i64(i8* %[[a_cast]], i8 42, i64 32 |
| Chandler Carruth | 18cee1d | 2014-09-01 10:09:18 +0000 | [diff] [blame] | 45 | ; CHECK: %[[out_cast:[^=]+]] = bitcast [8 x i64]* %out to i8* |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 46 | ; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* %[[out_cast]], i8* %[[a_cast]], i64 64 |
| Nick Lewycky | fc243d5 | 2014-09-01 06:03:11 +0000 | [diff] [blame] | 47 | ; CHECK-NOT: call void @llvm.memcpy |
| 48 | ; CHECK: ret void |
| 49 | } |
| 50 | |
| 51 | declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind |
| 52 | declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind |
| 53 | |
| Pete Cooper | 67cf9a7 | 2015-11-19 05:56:52 +0000 | [diff] [blame] | 54 | declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) nounwind |
| 55 | declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind |