merge a test into ipsccp-basic. running llvm-ld to get one pass is... bad.
[oota-llvm.git] / test / Transforms / SCCP / ipsccp-basic.ll
1 ; RUN: opt < %s -ipsccp -S | FileCheck %s
2 ; XFAIL: *
3
4 ;;======================== test1
5
6 define internal i32 @test1a(i32 %A) {
7         %X = add i32 1, 2
8         ret i32 %A
9 }
10 ; CHECK: define internal i32 @test1a
11 ; CHECK: ret i32 undef
12
13 define i32 @test1b() {
14         %X = call i32 @test1a( i32 17 )
15         ret i32 %X
16
17 ; CHECK: define i32 @test1b
18 ; CHECK: ret i32 17
19 }
20
21
22
23 ;;======================== test2
24
25 define internal i32 @test2a(i32 %A) {
26         %C = icmp eq i32 %A, 0  
27         br i1 %C, label %T, label %F
28 T:
29         %B = call i32 @test2a( i32 0 )
30         ret i32 0
31 F:
32         %C.upgrd.1 = call i32 @test2a(i32 1)
33         ret i32 %C.upgrd.1
34 }
35 ; CHECK: define internal i32 @test2a
36 ; CHECK-NEXT: br label %T
37 ; CHECK: ret i32 undef
38
39
40 define i32 @test2b() {
41         %X = call i32 @test2a(i32 0)
42         ret i32 %X
43 }
44 ; CHECK: define i32 @test2b
45 ; CHECK-NEXT: %X = call i32 @test2a(i32 0)
46 ; CHECK-NEXT: ret i32 0
47
48
49 ;;======================== test3
50
51 @G = internal global i32 undef
52
53 define void @test3a() {
54         %X = load i32* @G
55         store i32 %X, i32* @G
56         ret void
57 }
58 ; CHECK: define void @test3a
59 ; CHECK-NEXT: ret void
60
61
62 define i32 @test3b() {
63         %V = load i32* @G
64         %C = icmp eq i32 %V, 17
65         br i1 %C, label %T, label %F
66 T:
67         store i32 17, i32* @G
68         ret i32 %V
69 F:      
70         store i32 123, i32* @G
71         ret i32 0
72 }
73 ; CHECK: define i32 @test3b
74 ; CHECK-NOT: store
75 ; CHECK: ret i32 0
76
77
78 ;;======================== test4
79
80 define internal {i64,i64} @test4a() {
81   %a = insertvalue {i64,i64} undef, i64 4, 1
82   %b = insertvalue {i64,i64} %a, i64 5, 0
83   ret {i64,i64} %b
84 }
85
86 define i64 @test4b() {
87   %a = invoke {i64,i64} @test4a()
88           to label %A unwind label %B
89 A:
90   %b = extractvalue {i64,i64} %a, 0
91   %c = call i64 @test4c(i64 %b)
92   ret i64 %c
93 B:
94   ret i64 0
95 }
96 ; CHECK: define i64 @test4b()
97 ; CHECK:   %c = call i64 @test4c(i64 5)
98 ; CHECK-NEXT:  ret i64 5
99
100
101 define internal i64 @test4c(i64 %a) {
102   ret i64 %a
103 }
104 ; CHECK: define internal i64 @test4c
105 ; CHECK: ret i64 undef
106
107
108
109 ;;======================== test5
110
111 ; PR4313
112 define internal {i64,i64} @test5a() {
113   %a = insertvalue {i64,i64} undef, i64 4, 1
114   %b = insertvalue {i64,i64} %a, i64 5, 0
115   ret {i64,i64} %b
116 }
117
118 define i64 @test5b() {
119   %a = invoke {i64,i64} @test5a()
120           to label %A unwind label %B
121 A:
122   %c = call i64 @test5c({i64,i64} %a)
123   ret i64 %c
124 B:
125   ret i64 0
126 }
127
128 ; CHECK: define i64 @test5b()
129 ; CHECK:     A:
130 ; CHECK-NEXT:  %c = call i64 @test5c(%0 %a)
131 ; CHECK-NEXT:  ret i64 %c
132
133 define internal i64 @test5c({i64,i64} %a) {
134   %b = extractvalue {i64,i64} %a, 0
135   ret i64 %b
136 }
137
138
139 ;;======================== test6
140
141 define i64 @test6a() {
142   ret i64 0
143 }
144
145 define i64 @test6b() {
146   %a = call i64 @test6a()
147   ret i64 %a
148 }
149 ; CHECK: define i64 @test6b
150 ; CHECK: ret i64 0
151
152 ;;======================== test7
153
154
155 %T = type {i32,i32}
156
157 define internal {i32, i32} @test7a(i32 %A) {
158   %X = add i32 1, %A
159   %mrv0 = insertvalue %T undef, i32 %X, 0
160   %mrv1 = insertvalue %T %mrv0, i32 %A, 1
161   ret %T %mrv1
162 ; CHECK: @test7a
163 ; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0
164 ; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
165 }
166
167 define i32 @test7b() {
168         %X = call {i32, i32} @test7a(i32 17)
169         %Y = extractvalue {i32, i32} %X, 0
170         %Z = add i32 %Y, %Y
171         ret i32 %Z
172 ; CHECK: define i32 @test7b
173 ; CHECK-NEXT: call %T @test7a(i32 17)
174 ; CHECK-NEXT: ret i32 36
175 }
176
177 ;;======================== test8
178
179
180 define internal {} @test8a(i32 %A, i32* %P) {
181   store i32 %A, i32* %P
182   ret {} {}
183 ; CHECK: @test8a
184 ; CHECK-NEXT: store i32 5, 
185 ; CHECK-NEXT: ret 
186 }
187
188 define void @test8b(i32* %P) {
189     %X = call {} @test8a(i32 5, i32* %P)
190     ret void
191 ; CHECK: define void @test8b
192 ; CHECK-NEXT: call { } @test8a
193 ; CHECK-NEXT: ret void
194 }
195
196 ;;======================== test9
197
198 @test9g = internal global {  } zeroinitializer
199
200 define void @test9() {
201 entry:
202         %local_foo = alloca {  }
203         load {  }* @current_foo
204         store {  } %0, {  }* %local_foo
205         ret void
206 }
207