disable-simplify-libcalls.ll 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. ; Test that -disable-simplify-libcalls is wired up correctly.
  2. ;
  3. ; RUN: opt < %s -instcombine -disable-simplify-libcalls -S | FileCheck %s
  4. 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"
  5. @.str = constant [1 x i8] zeroinitializer, align 1
  6. @.str1 = constant [13 x i8] c"hello, world\00", align 1
  7. @.str2 = constant [4 x i8] c"foo\00", align 1
  8. @.str3 = constant [4 x i8] c"bar\00", align 1
  9. @.str4 = constant [6 x i8] c"123.4\00", align 1
  10. @.str5 = constant [5 x i8] c"1234\00", align 1
  11. @empty = constant [1 x i8] c"\00", align 1
  12. declare double @ceil(double)
  13. declare double @copysign(double, double)
  14. declare double @cos(double)
  15. declare double @fabs(double)
  16. declare double @floor(double)
  17. declare i8* @strcat(i8*, i8*)
  18. declare i8* @strncat(i8*, i8*, i32)
  19. declare i8* @strchr(i8*, i32)
  20. declare i8* @strrchr(i8*, i32)
  21. declare i32 @strcmp(i8*, i8*)
  22. declare i32 @strncmp(i8*, i8*, i64)
  23. declare i8* @strcpy(i8*, i8*)
  24. declare i8* @stpcpy(i8*, i8*)
  25. declare i8* @strncpy(i8*, i8*, i64)
  26. declare i64 @strlen(i8*)
  27. declare i8* @strpbrk(i8*, i8*)
  28. declare i64 @strspn(i8*, i8*)
  29. declare double @strtod(i8*, i8**)
  30. declare float @strtof(i8*, i8**)
  31. declare x86_fp80 @strtold(i8*, i8**)
  32. declare i64 @strtol(i8*, i8**, i32)
  33. declare i64 @strtoll(i8*, i8**, i32)
  34. declare i64 @strtoul(i8*, i8**, i32)
  35. declare i64 @strtoull(i8*, i8**, i32)
  36. declare i64 @strcspn(i8*, i8*)
  37. declare i32 @abs(i32)
  38. declare i32 @ffs(i32)
  39. declare i32 @ffsl(i64)
  40. declare i32 @ffsll(i64)
  41. declare i32 @fprintf(i8*, i8*)
  42. declare i32 @isascii(i32)
  43. declare i32 @isdigit(i32)
  44. declare i32 @toascii(i32)
  45. declare i64 @labs(i64)
  46. declare i64 @llabs(i64)
  47. declare i32 @printf(i8*)
  48. declare i32 @sprintf(i8*, i8*)
  49. define double @t1(double %x) {
  50. ; CHECK-LABEL: @t1(
  51. %ret = call double @ceil(double %x)
  52. ret double %ret
  53. ; CHECK: call double @ceil
  54. }
  55. define double @t2(double %x, double %y) {
  56. ; CHECK-LABEL: @t2(
  57. %ret = call double @copysign(double %x, double %y)
  58. ret double %ret
  59. ; CHECK: call double @copysign
  60. }
  61. define double @t3(double %x) {
  62. ; CHECK-LABEL: @t3(
  63. %call = call double @cos(double %x)
  64. ret double %call
  65. ; CHECK: call double @cos
  66. }
  67. define double @t4(double %x) {
  68. ; CHECK-LABEL: @t4(
  69. %ret = call double @fabs(double %x)
  70. ret double %ret
  71. ; CHECK: call double @fabs
  72. }
  73. define double @t5(double %x) {
  74. ; CHECK-LABEL: @t5(
  75. %ret = call double @floor(double %x)
  76. ret double %ret
  77. ; CHECK: call double @floor
  78. }
  79. define i8* @t6(i8* %x) {
  80. ; CHECK-LABEL: @t6(
  81. %empty = getelementptr [1 x i8], [1 x i8]* @empty, i32 0, i32 0
  82. %ret = call i8* @strcat(i8* %x, i8* %empty)
  83. ret i8* %ret
  84. ; CHECK: call i8* @strcat
  85. }
  86. define i8* @t7(i8* %x) {
  87. ; CHECK-LABEL: @t7(
  88. %empty = getelementptr [1 x i8], [1 x i8]* @empty, i32 0, i32 0
  89. %ret = call i8* @strncat(i8* %x, i8* %empty, i32 1)
  90. ret i8* %ret
  91. ; CHECK: call i8* @strncat
  92. }
  93. define i8* @t8() {
  94. ; CHECK-LABEL: @t8(
  95. %x = getelementptr inbounds [13 x i8], [13 x i8]* @.str1, i32 0, i32 0
  96. %ret = call i8* @strchr(i8* %x, i32 119)
  97. ret i8* %ret
  98. ; CHECK: call i8* @strchr
  99. }
  100. define i8* @t9() {
  101. ; CHECK-LABEL: @t9(
  102. %x = getelementptr inbounds [13 x i8], [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. define i32 @t10() {
  108. ; CHECK-LABEL: @t10(
  109. %x = getelementptr inbounds [4 x i8], [4 x i8]* @.str2, i32 0, i32 0
  110. %y = getelementptr inbounds [4 x i8], [4 x i8]* @.str3, i32 0, i32 0
  111. %ret = call i32 @strcmp(i8* %x, i8* %y)
  112. ret i32 %ret
  113. ; CHECK: call i32 @strcmp
  114. }
  115. define i32 @t11() {
  116. ; CHECK-LABEL: @t11(
  117. %x = getelementptr inbounds [4 x i8], [4 x i8]* @.str2, i32 0, i32 0
  118. %y = getelementptr inbounds [4 x i8], [4 x i8]* @.str3, i32 0, i32 0
  119. %ret = call i32 @strncmp(i8* %x, i8* %y, i64 3)
  120. ret i32 %ret
  121. ; CHECK: call i32 @strncmp
  122. }
  123. define i8* @t12(i8* %x) {
  124. ; CHECK-LABEL: @t12(
  125. %y = getelementptr inbounds [4 x i8], [4 x i8]* @.str2, i32 0, i32 0
  126. %ret = call i8* @strcpy(i8* %x, i8* %y)
  127. ret i8* %ret
  128. ; CHECK: call i8* @strcpy
  129. }
  130. define i8* @t13(i8* %x) {
  131. ; CHECK-LABEL: @t13(
  132. %y = getelementptr inbounds [4 x i8], [4 x i8]* @.str2, i32 0, i32 0
  133. %ret = call i8* @stpcpy(i8* %x, i8* %y)
  134. ret i8* %ret
  135. ; CHECK: call i8* @stpcpy
  136. }
  137. define i8* @t14(i8* %x) {
  138. ; CHECK-LABEL: @t14(
  139. %y = getelementptr inbounds [4 x i8], [4 x i8]* @.str2, i32 0, i32 0
  140. %ret = call i8* @strncpy(i8* %x, i8* %y, i64 3)
  141. ret i8* %ret
  142. ; CHECK: call i8* @strncpy
  143. }
  144. define i64 @t15() {
  145. ; CHECK-LABEL: @t15(
  146. %x = getelementptr inbounds [4 x i8], [4 x i8]* @.str2, i32 0, i32 0
  147. %ret = call i64 @strlen(i8* %x)
  148. ret i64 %ret
  149. ; CHECK: call i64 @strlen
  150. }
  151. define i8* @t16(i8* %x) {
  152. ; CHECK-LABEL: @t16(
  153. %y = getelementptr inbounds [1 x i8], [1 x i8]* @.str, i32 0, i32 0
  154. %ret = call i8* @strpbrk(i8* %x, i8* %y)
  155. ret i8* %ret
  156. ; CHECK: call i8* @strpbrk
  157. }
  158. define i64 @t17(i8* %x) {
  159. ; CHECK-LABEL: @t17(
  160. %y = getelementptr inbounds [1 x i8], [1 x i8]* @.str, i32 0, i32 0
  161. %ret = call i64 @strspn(i8* %x, i8* %y)
  162. ret i64 %ret
  163. ; CHECK: call i64 @strspn
  164. }
  165. define double @t18(i8** %y) {
  166. ; CHECK-LABEL: @t18(
  167. %x = getelementptr inbounds [6 x i8], [6 x i8]* @.str4, i64 0, i64 0
  168. %ret = call double @strtod(i8* %x, i8** %y)
  169. ret double %ret
  170. ; CHECK: call double @strtod
  171. }
  172. define float @t19(i8** %y) {
  173. ; CHECK-LABEL: @t19(
  174. %x = getelementptr inbounds [6 x i8], [6 x i8]* @.str4, i64 0, i64 0
  175. %ret = call float @strtof(i8* %x, i8** %y)
  176. ret float %ret
  177. ; CHECK: call float @strtof
  178. }
  179. define x86_fp80 @t20(i8** %y) {
  180. ; CHECK-LABEL: @t20(
  181. %x = getelementptr inbounds [6 x i8], [6 x i8]* @.str4, i64 0, i64 0
  182. %ret = call x86_fp80 @strtold(i8* %x, i8** %y)
  183. ret x86_fp80 %ret
  184. ; CHECK: call x86_fp80 @strtold
  185. }
  186. define i64 @t21(i8** %y) {
  187. ; CHECK-LABEL: @t21(
  188. %x = getelementptr inbounds [5 x i8], [5 x i8]* @.str5, i64 0, i64 0
  189. %ret = call i64 @strtol(i8* %x, i8** %y, i32 10)
  190. ret i64 %ret
  191. ; CHECK: call i64 @strtol
  192. }
  193. define i64 @t22(i8** %y) {
  194. ; CHECK-LABEL: @t22(
  195. %x = getelementptr inbounds [5 x i8], [5 x i8]* @.str5, i64 0, i64 0
  196. %ret = call i64 @strtoll(i8* %x, i8** %y, i32 10)
  197. ret i64 %ret
  198. ; CHECK: call i64 @strtoll
  199. }
  200. define i64 @t23(i8** %y) {
  201. ; CHECK-LABEL: @t23(
  202. %x = getelementptr inbounds [5 x i8], [5 x i8]* @.str5, i64 0, i64 0
  203. %ret = call i64 @strtoul(i8* %x, i8** %y, i32 10)
  204. ret i64 %ret
  205. ; CHECK: call i64 @strtoul
  206. }
  207. define i64 @t24(i8** %y) {
  208. ; CHECK-LABEL: @t24(
  209. %x = getelementptr inbounds [5 x i8], [5 x i8]* @.str5, i64 0, i64 0
  210. %ret = call i64 @strtoull(i8* %x, i8** %y, i32 10)
  211. ret i64 %ret
  212. ; CHECK: call i64 @strtoull
  213. }
  214. define i64 @t25(i8* %y) {
  215. ; CHECK-LABEL: @t25(
  216. %x = getelementptr [1 x i8], [1 x i8]* @empty, i32 0, i32 0
  217. %ret = call i64 @strcspn(i8* %x, i8* %y)
  218. ret i64 %ret
  219. ; CHECK: call i64 @strcspn
  220. }
  221. define i32 @t26(i32 %y) {
  222. ; CHECK-LABEL: @t26(
  223. %ret = call i32 @abs(i32 %y)
  224. ret i32 %ret
  225. ; CHECK: call i32 @abs
  226. }
  227. define i32 @t27(i32 %y) {
  228. ; CHECK-LABEL: @t27(
  229. %ret = call i32 @ffs(i32 %y)
  230. ret i32 %ret
  231. ; CHECK: call i32 @ffs
  232. }
  233. define i32 @t28(i64 %y) {
  234. ; CHECK-LABEL: @t28(
  235. %ret = call i32 @ffsl(i64 %y)
  236. ret i32 %ret
  237. ; CHECK: call i32 @ffsl
  238. }
  239. define i32 @t29(i64 %y) {
  240. ; CHECK-LABEL: @t29(
  241. %ret = call i32 @ffsll(i64 %y)
  242. ret i32 %ret
  243. ; CHECK: call i32 @ffsll
  244. }
  245. define void @t30() {
  246. ; CHECK-LABEL: @t30(
  247. %x = getelementptr inbounds [13 x i8], [13 x i8]* @.str1, i32 0, i32 0
  248. call i32 @fprintf(i8* null, i8* %x)
  249. ret void
  250. ; CHECK: call i32 @fprintf
  251. }
  252. define i32 @t31(i32 %y) {
  253. ; CHECK-LABEL: @t31(
  254. %ret = call i32 @isascii(i32 %y)
  255. ret i32 %ret
  256. ; CHECK: call i32 @isascii
  257. }
  258. define i32 @t32(i32 %y) {
  259. ; CHECK-LABEL: @t32(
  260. %ret = call i32 @isdigit(i32 %y)
  261. ret i32 %ret
  262. ; CHECK: call i32 @isdigit
  263. }
  264. define i32 @t33(i32 %y) {
  265. ; CHECK-LABEL: @t33(
  266. %ret = call i32 @toascii(i32 %y)
  267. ret i32 %ret
  268. ; CHECK: call i32 @toascii
  269. }
  270. define i64 @t34(i64 %y) {
  271. ; CHECK-LABEL: @t34(
  272. %ret = call i64 @labs(i64 %y)
  273. ret i64 %ret
  274. ; CHECK: call i64 @labs
  275. }
  276. define i64 @t35(i64 %y) {
  277. ; CHECK-LABEL: @t35(
  278. %ret = call i64 @llabs(i64 %y)
  279. ret i64 %ret
  280. ; CHECK: call i64 @llabs
  281. }
  282. define void @t36() {
  283. ; CHECK-LABEL: @t36(
  284. %x = getelementptr inbounds [1 x i8], [1 x i8]* @empty, i32 0, i32 0
  285. call i32 @printf(i8* %x)
  286. ret void
  287. ; CHECK: call i32 @printf
  288. }
  289. define void @t37(i8* %x) {
  290. ; CHECK-LABEL: @t37(
  291. %y = getelementptr inbounds [13 x i8], [13 x i8]* @.str1, i32 0, i32 0
  292. call i32 @sprintf(i8* %x, i8* %y)
  293. ret void
  294. ; CHECK: call i32 @sprintf
  295. }