fe8bbe9ad03f065dee69f681d51ad33e228259b8
[oota-llvm.git] / test / Transforms / TailCallElim / basic.ll
1 ; RUN: opt < %s -tailcallelim -S | FileCheck %s
2
3 declare void @noarg()
4 declare void @use(i32*)
5 declare void @use_nocapture(i32* nocapture)
6 declare void @use2_nocapture(i32* nocapture, i32* nocapture)
7
8 ; Trivial case. Mark @noarg with tail call.
9 define void @test0() {
10 ; CHECK: tail call void @noarg()
11         call void @noarg()
12         ret void
13 }
14
15 ; PR615. Make sure that we do not move the alloca so that it interferes with the tail call.
16 define i32 @test1() {
17 ; CHECK: i32 @test1()
18 ; CHECK-NEXT: alloca
19         %A = alloca i32         ; <i32*> [#uses=2]
20         store i32 5, i32* %A
21         call void @use(i32* %A)
22 ; CHECK: tail call i32 @test1
23         %X = tail call i32 @test1()             ; <i32> [#uses=1]
24         ret i32 %X
25 }
26
27 ; This function contains intervening instructions which should be moved out of the way
28 define i32 @test2(i32 %X) {
29 ; CHECK: i32 @test2
30 ; CHECK-NOT: call
31 ; CHECK: ret i32
32 entry:
33         %tmp.1 = icmp eq i32 %X, 0              ; <i1> [#uses=1]
34         br i1 %tmp.1, label %then.0, label %endif.0
35 then.0:         ; preds = %entry
36         %tmp.4 = add i32 %X, 1          ; <i32> [#uses=1]
37         ret i32 %tmp.4
38 endif.0:                ; preds = %entry
39         %tmp.10 = add i32 %X, -1                ; <i32> [#uses=1]
40         %tmp.8 = call i32 @test2(i32 %tmp.10)           ; <i32> [#uses=1]
41         %DUMMY = add i32 %X, 1          ; <i32> [#uses=0]
42         ret i32 %tmp.8
43 }
44
45 ; Though this case seems to be fairly unlikely to occur in the wild, someone
46 ; plunked it into the demo script, so maybe they care about it.
47 define i32 @test3(i32 %c) {
48 ; CHECK: i32 @test3
49 ; CHECK-NOT: call
50 ; CHECK: ret i32 0
51 entry:
52         %tmp.1 = icmp eq i32 %c, 0              ; <i1> [#uses=1]
53         br i1 %tmp.1, label %return, label %else
54 else:           ; preds = %entry
55         %tmp.5 = add i32 %c, -1         ; <i32> [#uses=1]
56         %tmp.3 = call i32 @test3(i32 %tmp.5)            ; <i32> [#uses=0]
57         ret i32 0
58 return:         ; preds = %entry
59         ret i32 0
60 }
61
62 ; Make sure that a nocapture pointer does not stop adding a tail call marker to
63 ; an unrelated call and additionally that we do not mark the nocapture call with
64 ; a tail call.
65 ;
66 ; rdar://14324281
67 define void @test4() {
68 ; CHECK: void @test4
69 ; CHECK-NOT: tail call void @use_nocapture
70 ; CHECK: tail call void @noarg()
71 ; CHECK: ret void
72   %a = alloca i32
73   call void @use_nocapture(i32* %a)
74   call void @noarg()
75   ret void
76 }
77
78 ; Make sure that we do not perform TRE even with a nocapture use. This is due to
79 ; bad codegen caused by PR962.
80 ;
81 ; rdar://14324281.
82 define i32* @test5(i32* nocapture %A, i1 %cond) {
83 ; CHECK: i32* @test5
84 ; CHECK-NOT: tailrecurse:
85 ; CHECK: ret i32* null
86   %B = alloca i32
87   br i1 %cond, label %cond_true, label %cond_false
88 cond_true:
89   call i32* @test5(i32* %B, i1 false)
90   ret i32* null
91 cond_false:
92   call void @use2_nocapture(i32* %A, i32* %B)
93   call void @noarg()
94   ret i32* null
95 }
96
97 ; PR14143: Make sure that we do not mark functions with nocapture allocas with tail.
98 ;
99 ; rdar://14324281.
100 define void @test6(i32* %a, i32* %b) {
101 ; CHECK-LABEL: @test6(
102 ; CHECK-NOT: tail call
103 ; CHECK: ret void
104   %c = alloca [100 x i8], align 16
105   %tmp = bitcast [100 x i8]* %c to i32*
106   call void @use2_nocapture(i32* %b, i32* %tmp)
107   ret void
108 }
109
110 ; PR14143: Make sure that we do not mark functions with nocapture allocas with tail.
111 ;
112 ; rdar://14324281
113 define void @test7(i32* %a, i32* %b) nounwind uwtable {
114 entry:
115 ; CHECK-LABEL: @test7(
116 ; CHECK-NOT: tail call
117 ; CHECK: ret void
118   %c = alloca [100 x i8], align 16
119   %0 = bitcast [100 x i8]* %c to i32*
120   call void @use2_nocapture(i32* %0, i32* %a)
121   call void @use2_nocapture(i32* %b, i32* %0)
122   ret void
123 }
124
125 ; If we have a mix of escaping captured/non-captured allocas, ensure that we do
126 ; not do anything including marking callsites with the tail call marker.
127 ;
128 ; rdar://14324281.
129 define i32* @test8(i32* nocapture %A, i1 %cond) {
130 ; CHECK: i32* @test8
131 ; CHECK-NOT: tailrecurse:
132 ; CHECK-NOT: tail call
133 ; CHECK: ret i32* null
134   %B = alloca i32
135   %B2 = alloca i32
136   br i1 %cond, label %cond_true, label %cond_false
137 cond_true:
138   call void @use(i32* %B2)
139   call i32* @test8(i32* %B, i1 false)
140   ret i32* null
141 cond_false:
142   call void @use2_nocapture(i32* %A, i32* %B)
143   call void @noarg()
144   ret i32* null
145 }
146
147 ; Don't tail call if a byval arg is captured.
148 define void @test9(i32* byval %a) {
149 ; CHECK-LABEL: define void @test9(
150 ; CHECK: {{^ *}}call void @use(
151   call void @use(i32* %a)
152   ret void
153 }
154
155 %struct.X = type { i8* }
156
157 declare void @ctor(%struct.X*)
158 define void @test10(%struct.X* noalias sret %agg.result, i1 zeroext %b) {
159 ; CHECK-LABEL: @test10
160 entry:
161   %x = alloca %struct.X, align 8
162   br i1 %b, label %if.then, label %if.end
163
164 if.then:                                          ; preds = %entry
165   call void @ctor(%struct.X* %agg.result)
166 ; CHECK: tail call void @ctor
167   br label %return
168
169 if.end:
170   call void @ctor(%struct.X* %x)
171 ; CHECK: call void @ctor
172   br label %return
173
174 return:
175   ret void
176 }
177
178 declare void @test11_helper1(i8** nocapture, i8*)
179 declare void @test11_helper2(i8*)
180 define void @test11() {
181 ; CHECK-LABEL: @test11
182 ; CHECK-NOT: tail
183   %a = alloca i8*
184   %b = alloca i8
185   call void @test11_helper1(i8** %a, i8* %b)  ; a = &b
186   %c = load i8*, i8** %a
187   call void @test11_helper2(i8* %c)
188 ; CHECK: call void @test11_helper2
189   ret void
190 }