When removing a function from the function set and adding it to deferred, we
[llvm.git] / test / Transforms / SCCP / ipsccp-basic.ll
bloba3c7637f986bc2b297f30d4f89d6c78ae5b132a2
1 ; RUN: opt < %s -ipsccp -S | FileCheck %s
3 ;;======================== test1
5 define internal i32 @test1a(i32 %A) {
6         %X = add i32 1, 2
7         ret i32 %A
9 ; CHECK: define internal i32 @test1a
10 ; CHECK: ret i32 undef
12 define i32 @test1b() {
13         %X = call i32 @test1a( i32 17 )
14         ret i32 %X
16 ; CHECK: define i32 @test1b
17 ; CHECK: ret i32 17
22 ;;======================== test2
24 define internal i32 @test2a(i32 %A) {
25         %C = icmp eq i32 %A, 0  
26         br i1 %C, label %T, label %F
28         %B = call i32 @test2a( i32 0 )
29         ret i32 0
31         %C.upgrd.1 = call i32 @test2a(i32 1)
32         ret i32 %C.upgrd.1
34 ; CHECK: define internal i32 @test2a
35 ; CHECK-NEXT: br label %T
36 ; CHECK: ret i32 undef
39 define i32 @test2b() {
40         %X = call i32 @test2a(i32 0)
41         ret i32 %X
43 ; CHECK: define i32 @test2b
44 ; CHECK-NEXT: %X = call i32 @test2a(i32 0)
45 ; CHECK-NEXT: ret i32 0
48 ;;======================== test3
50 @G = internal global i32 undef
52 define void @test3a() {
53         %X = load i32* @G
54         store i32 %X, i32* @G
55         ret void
57 ; CHECK: define void @test3a
58 ; CHECK-NEXT: ret void
61 define i32 @test3b() {
62         %V = load i32* @G
63         %C = icmp eq i32 %V, 17
64         br i1 %C, label %T, label %F
66         store i32 17, i32* @G
67         ret i32 %V
68 F:      
69         store i32 123, i32* @G
70         ret i32 0
72 ; CHECK: define i32 @test3b
73 ; CHECK-NOT: store
74 ; CHECK: ret i32 0
77 ;;======================== test4
79 define internal {i64,i64} @test4a() {
80   %a = insertvalue {i64,i64} undef, i64 4, 1
81   %b = insertvalue {i64,i64} %a, i64 5, 0
82   ret {i64,i64} %b
85 define i64 @test4b() {
86   %a = invoke {i64,i64} @test4a()
87           to label %A unwind label %B
89   %b = extractvalue {i64,i64} %a, 0
90   %c = call i64 @test4c(i64 %b)
91   ret i64 %c
93   ret i64 0
95 ; CHECK: define i64 @test4b()
96 ; CHECK:   %c = call i64 @test4c(i64 5)
97 ; CHECK-NEXT:  ret i64 5
100 define internal i64 @test4c(i64 %a) {
101   ret i64 %a
103 ; CHECK: define internal i64 @test4c
104 ; CHECK: ret i64 undef
108 ;;======================== test5
110 ; PR4313
111 define internal {i64,i64} @test5a() {
112   %a = insertvalue {i64,i64} undef, i64 4, 1
113   %b = insertvalue {i64,i64} %a, i64 5, 0
114   ret {i64,i64} %b
117 define i64 @test5b() {
118   %a = invoke {i64,i64} @test5a()
119           to label %A unwind label %B
121   %c = call i64 @test5c({i64,i64} %a)
122   ret i64 %c
124   ret i64 0
127 ; CHECK: define i64 @test5b()
128 ; CHECK:     A:
129 ; CHECK-NEXT:  %c = call i64 @test5c(%0 %a)
130 ; CHECK-NEXT:  ret i64 5
132 define internal i64 @test5c({i64,i64} %a) {
133   %b = extractvalue {i64,i64} %a, 0
134   ret i64 %b
138 ;;======================== test6
140 define i64 @test6a() {
141   ret i64 0
144 define i64 @test6b() {
145   %a = call i64 @test6a()
146   ret i64 %a
148 ; CHECK: define i64 @test6b
149 ; CHECK: ret i64 0
151 ;;======================== test7
154 %T = type {i32,i32}
156 define internal {i32, i32} @test7a(i32 %A) {
157   %X = add i32 1, %A
158   %mrv0 = insertvalue %T undef, i32 %X, 0
159   %mrv1 = insertvalue %T %mrv0, i32 %A, 1
160   ret %T %mrv1
161 ; CHECK: @test7a
162 ; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0
163 ; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
166 define i32 @test7b() {
167         %X = call {i32, i32} @test7a(i32 17)
168         %Y = extractvalue {i32, i32} %X, 0
169         %Z = add i32 %Y, %Y
170         ret i32 %Z
171 ; CHECK: define i32 @test7b
172 ; CHECK-NEXT: call %T @test7a(i32 17)
173 ; CHECK-NEXT: ret i32 36
176 ;;======================== test8
179 define internal {} @test8a(i32 %A, i32* %P) {
180   store i32 %A, i32* %P
181   ret {} {}
182 ; CHECK: @test8a
183 ; CHECK-NEXT: store i32 5, 
184 ; CHECK-NEXT: ret 
187 define void @test8b(i32* %P) {
188     %X = call {} @test8a(i32 5, i32* %P)
189     ret void
190 ; CHECK: define void @test8b
191 ; CHECK-NEXT: call {} @test8a
192 ; CHECK-NEXT: ret void
195 ;;======================== test9
197 @test9g = internal global {  } zeroinitializer
199 define void @test9() {
200 entry:
201         %local_foo = alloca {  }
202         load {  }* @test9g
203         store {  } %0, {  }* %local_foo
204         ret void