blob: 4a616364b00bcc13587ceaae02530b423c57eeed [file] [log] [blame]
Nick Lewycky15d3c052009-10-18 04:41:36 +00001; RUN: opt < %s -basicaa -gvn -dse -S | FileCheck %s
Kenneth Uildriksb908f8a2009-11-03 15:29:06 +00002target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
Reid Spencer1faa5492006-11-18 05:52:18 +00003
Chris Lattnera22922d2009-10-17 23:59:51 +00004declare void @llvm.memset.i32(i8*, i8, i32, i32)
Nick Lewycky15d3c052009-10-18 04:41:36 +00005declare void @llvm.memset.i8(i8*, i8, i8, i32)
6declare void @llvm.memcpy.i8(i8*, i8*, i8, i32)
Chris Lattner4b7d0d92009-11-26 02:16:28 +00007declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)
Nick Lewycky15d3c052009-10-18 04:41:36 +00008declare void @llvm.lifetime.end(i64, i8* nocapture)
Chris Lattnera22922d2009-10-17 23:59:51 +00009
10declare void @external(i32*)
11
12define i32 @test0(i8* %P) {
13 %A = alloca i32
14 call void @external(i32* %A)
15
16 store i32 0, i32* %A
17
18 call void @llvm.memset.i32(i8* %P, i8 0, i32 42, i32 1)
19
20 %B = load i32* %A
21 ret i32 %B
22
23; CHECK: @test0
24; CHECK: ret i32 0
Reid Spencer1faa5492006-11-18 05:52:18 +000025}
26
Nick Lewycky15d3c052009-10-18 04:41:36 +000027declare void @llvm.memcpy.i8(i8*, i8*, i8, i32)
28
29define i8 @test1() {
30; CHECK: @test1
31 %A = alloca i8
32 %B = alloca i8
33
34 store i8 2, i8* %B ;; Not written to by memcpy
35
36 call void @llvm.memcpy.i8(i8* %A, i8* %B, i8 -1, i32 0)
37
38 %C = load i8* %B
39 ret i8 %C
40; CHECK: ret i8 2
41}
42
43define i8 @test2(i8* %P) {
44; CHECK: @test2
Chris Lattner6e85d912009-10-18 04:50:18 +000045 %P2 = getelementptr i8* %P, i32 127
Nick Lewycky15d3c052009-10-18 04:41:36 +000046 store i8 1, i8* %P2 ;; Not dead across memset
47 call void @llvm.memset.i8(i8* %P, i8 2, i8 127, i32 0)
48 %A = load i8* %P2
49 ret i8 %A
50; CHECK: ret i8 1
51}
52
Chris Lattner6e85d912009-10-18 04:50:18 +000053define i8 @test2a(i8* %P) {
54; CHECK: @test2
55 %P2 = getelementptr i8* %P, i32 126
Chris Lattnere62b2632009-10-18 04:55:26 +000056
57 ;; FIXME: DSE isn't zapping this dead store.
Chris Lattner6e85d912009-10-18 04:50:18 +000058 store i8 1, i8* %P2 ;; Dead, clobbered by memset.
Chris Lattnere62b2632009-10-18 04:55:26 +000059
Chris Lattner6e85d912009-10-18 04:50:18 +000060 call void @llvm.memset.i8(i8* %P, i8 2, i8 127, i32 0)
61 %A = load i8* %P2
62 ret i8 %A
Chris Lattner0fce29b2009-12-06 04:16:05 +000063; CHECK-NOT: load
64; CHECK: ret i8 2
Chris Lattner6e85d912009-10-18 04:50:18 +000065}
66
Chris Lattnere62b2632009-10-18 04:55:26 +000067define void @test3(i8* %P, i8 %X) {
Nick Lewycky15d3c052009-10-18 04:41:36 +000068; CHECK: @test3
Chris Lattnere62b2632009-10-18 04:55:26 +000069; CHECK-NOT: store
70; CHECK-NOT: %Y
71 %Y = add i8 %X, 1 ;; Dead, because the only use (the store) is dead.
72
Nick Lewycky15d3c052009-10-18 04:41:36 +000073 %P2 = getelementptr i8* %P, i32 2
Chris Lattnere62b2632009-10-18 04:55:26 +000074 store i8 %Y, i8* %P2 ;; Not read by lifetime.end, should be removed.
75; CHECK: store i8 2, i8* %P2
Nick Lewycky15d3c052009-10-18 04:41:36 +000076 call void @llvm.lifetime.end(i64 1, i8* %P)
77 store i8 2, i8* %P2
78; CHECK-NOT: store
79 ret void
80; CHECK: ret void
Chris Lattnere62b2632009-10-18 04:55:26 +000081}
82
83define void @test3a(i8* %P, i8 %X) {
84; CHECK: @test3a
85 %Y = add i8 %X, 1 ;; Dead, because the only use (the store) is dead.
86
87 %P2 = getelementptr i8* %P, i32 2
88 store i8 %Y, i8* %P2 ;; FIXME: Killed by llvm.lifetime.end, should be zapped.
Chris Lattnerec63ad62009-10-18 05:03:00 +000089; CHECK: store i8 %Y, i8* %P2
Chris Lattnere62b2632009-10-18 04:55:26 +000090 call void @llvm.lifetime.end(i64 10, i8* %P)
91 ret void
92; CHECK: ret void
Kenneth Uildriksb908f8a2009-11-03 15:29:06 +000093}
Chris Lattner47233032009-11-22 16:15:59 +000094
95@G1 = external global i32
96@G2 = external global [4000 x i32]
97
Chris Lattner4b7d0d92009-11-26 02:16:28 +000098define i32 @test4(i8* %P) {
Chris Lattner47233032009-11-22 16:15:59 +000099 %tmp = load i32* @G1
100 call void @llvm.memset.i32(i8* bitcast ([4000 x i32]* @G2 to i8*), i8 0, i32 4000, i32 1)
101 %tmp2 = load i32* @G1
102 %sub = sub i32 %tmp2, %tmp
103 ret i32 %sub
104; CHECK: @test4
105; CHECK: load i32* @G
106; CHECK: memset.i32
107; CHECK-NOT: load
108; CHECK: sub i32 %tmp, %tmp
109}
110
Chris Lattner4b7d0d92009-11-26 02:16:28 +0000111; Verify that basicaa is handling variable length memcpy, knowing it doesn't
112; write to G1.
113define i32 @test5(i8* %P, i32 %Len) {
114 %tmp = load i32* @G1
115 call void @llvm.memcpy.i32(i8* bitcast ([4000 x i32]* @G2 to i8*), i8* bitcast (i32* @G1 to i8*), i32 %Len, i32 1)
116 %tmp2 = load i32* @G1
117 %sub = sub i32 %tmp2, %tmp
118 ret i32 %sub
119; CHECK: @test5
120; CHECK: load i32* @G
121; CHECK: memcpy.i32
122; CHECK-NOT: load
123; CHECK: sub i32 %tmp, %tmp
124}
125