blob: 3f558a1c3737c90abc269c76b39a5013533212d3 [file] [log] [blame]
Nick Lewycky5a1cb642011-07-25 23:14:22 +00001; RUN: opt -scalarrepl -S < %s | FileCheck %s
2
3target 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-n8:16:32:64"
4target triple = "x86_64-unknown-linux-gnu"
5
6declare void @llvm.lifetime.start(i64, i8*)
7declare void @llvm.lifetime.end(i64, i8*)
8
9%t1 = type {i32, i32, i32}
10
11define void @test1() {
12; CHECK: @test1
13 %A = alloca %t1
14 %A1 = getelementptr %t1* %A, i32 0, i32 0
15 %A2 = getelementptr %t1* %A, i32 0, i32 1
16 %A3 = getelementptr %t1* %A, i32 0, i32 2
17 %B = bitcast i32* %A1 to i8*
18 store i32 0, i32* %A1
19 call void @llvm.lifetime.start(i64 -1, i8* %B)
20 ret void
21; CHECK-NEXT: ret void
22}
23
24define void @test2() {
25; CHECK: @test2
26 %A = alloca %t1
27 %A1 = getelementptr %t1* %A, i32 0, i32 0
28 %A2 = getelementptr %t1* %A, i32 0, i32 1
29 %A3 = getelementptr %t1* %A, i32 0, i32 2
30 %B = bitcast i32* %A2 to i8*
31 store i32 0, i32* %A2
32 call void @llvm.lifetime.start(i64 -1, i8* %B)
33 %C = load i32* %A2
34 ret void
35; CHECK: ret void
36}
37
38define void @test3() {
39; CHECK: @test3
40 %A = alloca %t1
41 %A1 = getelementptr %t1* %A, i32 0, i32 0
42 %A2 = getelementptr %t1* %A, i32 0, i32 1
43 %A3 = getelementptr %t1* %A, i32 0, i32 2
44 %B = bitcast i32* %A2 to i8*
45 store i32 0, i32* %A2
46 call void @llvm.lifetime.start(i64 6, i8* %B)
47 %C = load i32* %A2
48 ret void
49; CHECK-NEXT: ret void
50}
51
52define void @test4() {
53; CHECK: @test4
54 %A = alloca %t1
55 %A1 = getelementptr %t1* %A, i32 0, i32 0
56 %A2 = getelementptr %t1* %A, i32 0, i32 1
57 %A3 = getelementptr %t1* %A, i32 0, i32 2
58 %B = bitcast i32* %A2 to i8*
59 store i32 0, i32* %A2
60 call void @llvm.lifetime.start(i64 1, i8* %B)
61 %C = load i32* %A2
62 ret void
63; CHECK-NEXT: ret void
64}
65
66%t2 = type {i32, [4 x i8], i32}
67
68define void @test5() {
69; CHECK: @test5
70 %A = alloca %t2
71; CHECK: alloca{{.*}}i8
72; CHECK: alloca{{.*}}i8
73; CHECK: alloca{{.*}}i8
74
75 %A21 = getelementptr %t2* %A, i32 0, i32 1, i32 0
76 %A22 = getelementptr %t2* %A, i32 0, i32 1, i32 1
77 %A23 = getelementptr %t2* %A, i32 0, i32 1, i32 2
78 %A24 = getelementptr %t2* %A, i32 0, i32 1, i32 3
79; CHECK-NOT: store i8 1
80 store i8 1, i8* %A21
81 store i8 2, i8* %A22
82 store i8 3, i8* %A23
83 store i8 4, i8* %A24
84
85 %A1 = getelementptr %t2* %A, i32 0, i32 0
86 %A2 = getelementptr %t2* %A, i32 0, i32 1, i32 1
87 %A3 = getelementptr %t2* %A, i32 0, i32 2
88 store i8 0, i8* %A2
89 call void @llvm.lifetime.start(i64 5, i8* %A2)
90; CHECK: llvm.lifetime{{.*}}i64 1
91; CHECK: llvm.lifetime{{.*}}i64 1
92; CHECK: llvm.lifetime{{.*}}i64 1
93 %C = load i8* %A2
94 ret void
95}
96
97%t3 = type {[4 x i16], [4 x i8]}
98
99define void @test6() {
100; CHECK: @test6
101 %A = alloca %t3
102; CHECK: alloca i8
103; CHECK: alloca i8
104; CHECK: alloca i8
105
106 %A11 = getelementptr %t3* %A, i32 0, i32 0, i32 0
107 %A12 = getelementptr %t3* %A, i32 0, i32 0, i32 1
108 %A13 = getelementptr %t3* %A, i32 0, i32 0, i32 2
109 %A14 = getelementptr %t3* %A, i32 0, i32 0, i32 3
110 store i16 11, i16* %A11
111 store i16 12, i16* %A12
112 store i16 13, i16* %A13
113 store i16 14, i16* %A14
114; CHECK-NOT: store i16 11
115; CHECK-NOT: store i16 12
116; CHECK-NOT: store i16 13
117; CHECK-NOT: store i16 14
118
119 %A21 = getelementptr %t3* %A, i32 0, i32 1, i32 0
120 %A22 = getelementptr %t3* %A, i32 0, i32 1, i32 1
121 %A23 = getelementptr %t3* %A, i32 0, i32 1, i32 2
122 %A24 = getelementptr %t3* %A, i32 0, i32 1, i32 3
123 store i8 21, i8* %A21
124 store i8 22, i8* %A22
125 store i8 23, i8* %A23
126 store i8 24, i8* %A24
127; CHECK: store i8 21
128; CHECK: store i8 22
129; CHECK: store i8 23
130; CHECK-NOT: store i8 24
131
132 %B = bitcast i16* %A13 to i8*
133 call void @llvm.lifetime.start(i64 7, i8* %B)
134; CHECK: lifetime.start{{.*}}i64 1
135; CHECK: lifetime.start{{.*}}i64 1
136; CHECK: lifetime.start{{.*}}i64 1
137
138 ret void
139}