d81e9ae5bd732584f38508b91ce41599637e9e29
[oota-llvm.git] / test / Transforms / InstCombine / disable-simplify-libcalls.ll
1 ; Test that -disable-simplify-libcalls is wired up correctly.
2 ;
3 ; RUN: opt < %s -instcombine -disable-simplify-libcalls -S | FileCheck %s
4
5 target 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-S128"
6
7 @.str  = constant [1 x i8] zeroinitializer, align 1
8 @.str1 = constant [13 x i8] c"hello, world\00", align 1
9 @.str2 = constant [4 x i8] c"foo\00", align 1
10 @.str3 = constant [4 x i8] c"bar\00", align 1
11 @.str4 = constant [6 x i8] c"123.4\00", align 1
12 @.str5 = constant [5 x i8] c"1234\00", align 1
13 @empty = constant [1 x i8] c"\00", align 1
14
15 declare double @ceil(double)
16 declare double @copysign(double, double)
17 declare double @cos(double)
18 declare double @fabs(double)
19 declare double @floor(double)
20 declare i8* @strcat(i8*, i8*)
21 declare i8* @strncat(i8*, i8*, i32)
22 declare i8* @strchr(i8*, i32)
23 declare i8* @strrchr(i8*, i32)
24 declare i32 @strcmp(i8*, i8*)
25 declare i32 @strncmp(i8*, i8*, i64)
26 declare i8* @strcpy(i8*, i8*)
27 declare i8* @stpcpy(i8*, i8*)
28 declare i8* @strncpy(i8*, i8*, i64)
29 declare i64 @strlen(i8*)
30 declare i8* @strpbrk(i8*, i8*)
31 declare i64 @strspn(i8*, i8*)
32 declare double @strtod(i8*, i8**)
33 declare float @strtof(i8*, i8**)
34 declare x86_fp80 @strtold(i8*, i8**)
35 declare i64 @strtol(i8*, i8**, i32)
36 declare i64 @strtoll(i8*, i8**, i32)
37 declare i64 @strtoul(i8*, i8**, i32)
38 declare i64 @strtoull(i8*, i8**, i32)
39 declare i64 @strcspn(i8*, i8*)
40
41 define double @t1(double %x) {
42 ; CHECK: @t1
43   %ret = call double @ceil(double %x)
44   ret double %ret
45 ; CHECK: call double @ceil
46 }
47
48 define double @t2(double %x, double %y) {
49 ; CHECK: @t2
50   %ret = call double @copysign(double %x, double %y)
51   ret double %ret
52 ; CHECK: call double @copysign
53 }
54
55 define double @t3(double %x) {
56 ; CHECK: @t3
57   %call = call double @cos(double %x)
58   ret double %call
59 ; CHECK: call double @cos
60 }
61
62 define double @t4(double %x) {
63 ; CHECK: @t4
64   %ret = call double @fabs(double %x)
65   ret double %ret
66 ; CHECK: call double @fabs
67 }
68
69 define double @t5(double %x) {
70 ; CHECK: @t5
71   %ret = call double @floor(double %x)
72   ret double %ret
73 ; CHECK: call double @floor
74 }
75
76 define i8* @t6(i8* %x) {
77 ; CHECK: @t6
78   %empty = getelementptr [1 x i8]* @empty, i32 0, i32 0
79   %ret = call i8* @strcat(i8* %x, i8* %empty)
80   ret i8* %ret
81 ; CHECK: call i8* @strcat
82 }
83
84 define i8* @t7(i8* %x) {
85 ; CHECK: @t7
86   %empty = getelementptr [1 x i8]* @empty, i32 0, i32 0
87   %ret = call i8* @strncat(i8* %x, i8* %empty, i32 1)
88   ret i8* %ret
89 ; CHECK: call i8* @strncat
90 }
91
92 define i8* @t8() {
93 ; CHECK: @t8
94   %x = getelementptr inbounds [13 x i8]* @.str1, i32 0, i32 0
95   %ret = call i8* @strchr(i8* %x, i32 119)
96   ret i8* %ret
97 ; CHECK: call i8* @strchr
98 }
99
100 define i8* @t9() {
101 ; CHECK: @t9
102   %x = getelementptr inbounds [13 x i8]* @.str1, i32 0, i32 0
103   %ret = call i8* @strrchr(i8* %x, i32 119)
104   ret i8* %ret
105 ; CHECK: call i8* @strrchr
106 }
107
108 define i32 @t10() {
109 ; CHECK: @t10
110   %x = getelementptr inbounds [4 x i8]* @.str2, i32 0, i32 0
111   %y = getelementptr inbounds [4 x i8]* @.str3, i32 0, i32 0
112   %ret = call i32 @strcmp(i8* %x, i8* %y)
113   ret i32 %ret
114 ; CHECK: call i32 @strcmp
115 }
116
117 define i32 @t11() {
118 ; CHECK: @t11
119   %x = getelementptr inbounds [4 x i8]* @.str2, i32 0, i32 0
120   %y = getelementptr inbounds [4 x i8]* @.str3, i32 0, i32 0
121   %ret = call i32 @strncmp(i8* %x, i8* %y, i64 3)
122   ret i32 %ret
123 ; CHECK: call i32 @strncmp
124 }
125
126 define i8* @t12(i8* %x) {
127 ; CHECK: @t12
128   %y = getelementptr inbounds [4 x i8]* @.str2, i32 0, i32 0
129   %ret = call i8* @strcpy(i8* %x, i8* %y)
130   ret i8* %ret
131 ; CHECK: call i8* @strcpy
132 }
133
134 define i8* @t13(i8* %x) {
135 ; CHECK: @t13
136   %y = getelementptr inbounds [4 x i8]* @.str2, i32 0, i32 0
137   %ret = call i8* @stpcpy(i8* %x, i8* %y)
138   ret i8* %ret
139 ; CHECK: call i8* @stpcpy
140 }
141
142 define i8* @t14(i8* %x) {
143 ; CHECK: @t14
144   %y = getelementptr inbounds [4 x i8]* @.str2, i32 0, i32 0
145   %ret = call i8* @strncpy(i8* %x, i8* %y, i64 3)
146   ret i8* %ret
147 ; CHECK: call i8* @strncpy
148 }
149
150 define i64 @t15() {
151 ; CHECK: @t15
152   %x = getelementptr inbounds [4 x i8]* @.str2, i32 0, i32 0
153   %ret = call i64 @strlen(i8* %x)
154   ret i64 %ret
155 ; CHECK: call i64 @strlen
156 }
157
158 define i8* @t16(i8* %x) {
159 ; CHECK: @t16
160   %y = getelementptr inbounds [1 x i8]* @.str, i32 0, i32 0
161   %ret = call i8* @strpbrk(i8* %x, i8* %y)
162   ret i8* %ret
163 ; CHECK: call i8* @strpbrk
164 }
165
166 define i64 @t17(i8* %x) {
167 ; CHECK: @t17
168   %y = getelementptr inbounds [1 x i8]* @.str, i32 0, i32 0
169   %ret = call i64 @strspn(i8* %x, i8* %y)
170   ret i64 %ret
171 ; CHECK: call i64 @strspn
172 }
173
174 define double @t18(i8** %y) {
175 ; CHECK: @t18
176   %x = getelementptr inbounds [6 x i8]* @.str4, i64 0, i64 0
177   %ret = call double @strtod(i8* %x, i8** %y)
178   ret double %ret
179 ; CHECK: call double @strtod
180 }
181
182 define float @t19(i8** %y) {
183 ; CHECK: @t19
184   %x = getelementptr inbounds [6 x i8]* @.str4, i64 0, i64 0
185   %ret = call float @strtof(i8* %x, i8** %y)
186   ret float %ret
187 ; CHECK: call float @strtof
188 }
189
190 define x86_fp80 @t20(i8** %y) {
191 ; CHECK: @t20
192   %x = getelementptr inbounds [6 x i8]* @.str4, i64 0, i64 0
193   %ret = call x86_fp80 @strtold(i8* %x, i8** %y)
194   ret x86_fp80 %ret
195 ; CHECK: call x86_fp80 @strtold
196 }
197
198 define i64 @t21(i8** %y) {
199 ; CHECK: @t21
200   %x = getelementptr inbounds [5 x i8]* @.str5, i64 0, i64 0
201   %ret = call i64 @strtol(i8* %x, i8** %y, i32 10)
202   ret i64 %ret
203 ; CHECK: call i64 @strtol
204 }
205
206 define i64 @t22(i8** %y) {
207 ; CHECK: @t22
208   %x = getelementptr inbounds [5 x i8]* @.str5, i64 0, i64 0
209   %ret = call i64 @strtoll(i8* %x, i8** %y, i32 10)
210   ret i64 %ret
211 ; CHECK: call i64 @strtoll
212 }
213
214 define i64 @t23(i8** %y) {
215 ; CHECK: @t23
216   %x = getelementptr inbounds [5 x i8]* @.str5, i64 0, i64 0
217   %ret = call i64 @strtoul(i8* %x, i8** %y, i32 10)
218   ret i64 %ret
219 ; CHECK: call i64 @strtoul
220 }
221
222 define i64 @t24(i8** %y) {
223 ; CHECK: @t24
224   %x = getelementptr inbounds [5 x i8]* @.str5, i64 0, i64 0
225   %ret = call i64 @strtoull(i8* %x, i8** %y, i32 10)
226   ret i64 %ret
227 ; CHECK: call i64 @strtoull
228 }
229
230 define i64 @t25(i8* %y) {
231 ; CHECK: @t25
232   %x = getelementptr [1 x i8]* @empty, i32 0, i32 0
233   %ret = call i64 @strcspn(i8* %x, i8* %y)
234   ret i64 %ret
235 ; CHECK: call i64 @strcspn
236 }