Make opt default to not adding a target data string and update tests that depend...
[oota-llvm.git] / test / Analysis / BasicAA / modref.ll
1 ; RUN: opt < %s -basicaa -gvn -dse -S | FileCheck %s
2 target 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"
3
4 declare void @llvm.memset.i32(i8*, i8, i32, i32)
5 declare void @llvm.memset.i8(i8*, i8, i8, i32)
6 declare void @llvm.memcpy.i8(i8*, i8*, i8, i32)
7 declare void @llvm.lifetime.end(i64, i8* nocapture)
8
9 declare void @external(i32*) 
10
11 define i32 @test0(i8* %P) {
12   %A = alloca i32
13   call void @external(i32* %A)
14   
15   store i32 0, i32* %A
16   
17   call void @llvm.memset.i32(i8* %P, i8 0, i32 42, i32 1)
18   
19   %B = load i32* %A
20   ret i32 %B
21   
22 ; CHECK: @test0
23 ; CHECK: ret i32 0
24 }
25
26 declare void @llvm.memcpy.i8(i8*, i8*, i8, i32)
27
28 define i8 @test1() {
29 ; CHECK: @test1
30   %A = alloca i8
31   %B = alloca i8
32
33   store i8 2, i8* %B  ;; Not written to by memcpy
34
35   call void @llvm.memcpy.i8(i8* %A, i8* %B, i8 -1, i32 0)
36
37   %C = load i8* %B
38   ret i8 %C
39 ; CHECK: ret i8 2
40 }
41
42 define i8 @test2(i8* %P) {
43 ; CHECK: @test2
44   %P2 = getelementptr i8* %P, i32 127
45   store i8 1, i8* %P2  ;; Not dead across memset
46   call void @llvm.memset.i8(i8* %P, i8 2, i8 127, i32 0)
47   %A = load i8* %P2
48   ret i8 %A
49 ; CHECK: ret i8 1
50 }
51
52 define i8 @test2a(i8* %P) {
53 ; CHECK: @test2
54   %P2 = getelementptr i8* %P, i32 126
55   
56   ;; FIXME: DSE isn't zapping this dead store.
57   store i8 1, i8* %P2  ;; Dead, clobbered by memset.
58   
59   call void @llvm.memset.i8(i8* %P, i8 2, i8 127, i32 0)
60   %A = load i8* %P2
61   ret i8 %A
62 ; CHECK: %A = load i8* %P2
63 ; CHECK: ret i8 %A
64 }
65
66 define void @test3(i8* %P, i8 %X) {
67 ; CHECK: @test3
68 ; CHECK-NOT: store
69 ; CHECK-NOT: %Y
70   %Y = add i8 %X, 1     ;; Dead, because the only use (the store) is dead.
71   
72   %P2 = getelementptr i8* %P, i32 2
73   store i8 %Y, i8* %P2  ;; Not read by lifetime.end, should be removed.
74 ; CHECK: store i8 2, i8* %P2
75   call void @llvm.lifetime.end(i64 1, i8* %P)
76   store i8 2, i8* %P2
77 ; CHECK-NOT: store
78   ret void
79 ; CHECK: ret void
80 }
81
82 define void @test3a(i8* %P, i8 %X) {
83 ; CHECK: @test3a
84   %Y = add i8 %X, 1     ;; Dead, because the only use (the store) is dead.
85   
86   %P2 = getelementptr i8* %P, i32 2
87   store i8 %Y, i8* %P2  ;; FIXME: Killed by llvm.lifetime.end, should be zapped.
88 ; CHECK: store i8 %Y, i8* %P2
89   call void @llvm.lifetime.end(i64 10, i8* %P)
90   ret void
91 ; CHECK: ret void
92 }