intrinsic.ll 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250
  1. ; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
  2. 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"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. ;CHECK-LABEL: @sqrt_f32(
  5. ;CHECK: llvm.sqrt.v4f32
  6. ;CHECK: ret void
  7. define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  8. entry:
  9. %cmp6 = icmp sgt i32 %n, 0
  10. br i1 %cmp6, label %for.body, label %for.end
  11. for.body: ; preds = %entry, %for.body
  12. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  13. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  14. %0 = load float, float* %arrayidx, align 4
  15. %call = tail call float @llvm.sqrt.f32(float %0) nounwind readnone
  16. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  17. store float %call, float* %arrayidx2, align 4
  18. %indvars.iv.next = add i64 %indvars.iv, 1
  19. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  20. %exitcond = icmp eq i32 %lftr.wideiv, %n
  21. br i1 %exitcond, label %for.end, label %for.body
  22. for.end: ; preds = %for.body, %entry
  23. ret void
  24. }
  25. declare float @llvm.sqrt.f32(float) nounwind readnone
  26. ;CHECK-LABEL: @sqrt_f64(
  27. ;CHECK: llvm.sqrt.v4f64
  28. ;CHECK: ret void
  29. define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  30. entry:
  31. %cmp6 = icmp sgt i32 %n, 0
  32. br i1 %cmp6, label %for.body, label %for.end
  33. for.body: ; preds = %entry, %for.body
  34. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  35. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  36. %0 = load double, double* %arrayidx, align 8
  37. %call = tail call double @llvm.sqrt.f64(double %0) nounwind readnone
  38. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  39. store double %call, double* %arrayidx2, align 8
  40. %indvars.iv.next = add i64 %indvars.iv, 1
  41. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  42. %exitcond = icmp eq i32 %lftr.wideiv, %n
  43. br i1 %exitcond, label %for.end, label %for.body
  44. for.end: ; preds = %for.body, %entry
  45. ret void
  46. }
  47. declare double @llvm.sqrt.f64(double) nounwind readnone
  48. ;CHECK-LABEL: @sin_f32(
  49. ;CHECK: llvm.sin.v4f32
  50. ;CHECK: ret void
  51. define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  52. entry:
  53. %cmp6 = icmp sgt i32 %n, 0
  54. br i1 %cmp6, label %for.body, label %for.end
  55. for.body: ; preds = %entry, %for.body
  56. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  57. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  58. %0 = load float, float* %arrayidx, align 4
  59. %call = tail call float @llvm.sin.f32(float %0) nounwind readnone
  60. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  61. store float %call, float* %arrayidx2, align 4
  62. %indvars.iv.next = add i64 %indvars.iv, 1
  63. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  64. %exitcond = icmp eq i32 %lftr.wideiv, %n
  65. br i1 %exitcond, label %for.end, label %for.body
  66. for.end: ; preds = %for.body, %entry
  67. ret void
  68. }
  69. declare float @llvm.sin.f32(float) nounwind readnone
  70. ;CHECK-LABEL: @sin_f64(
  71. ;CHECK: llvm.sin.v4f64
  72. ;CHECK: ret void
  73. define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  74. entry:
  75. %cmp6 = icmp sgt i32 %n, 0
  76. br i1 %cmp6, label %for.body, label %for.end
  77. for.body: ; preds = %entry, %for.body
  78. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  79. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  80. %0 = load double, double* %arrayidx, align 8
  81. %call = tail call double @llvm.sin.f64(double %0) nounwind readnone
  82. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  83. store double %call, double* %arrayidx2, align 8
  84. %indvars.iv.next = add i64 %indvars.iv, 1
  85. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  86. %exitcond = icmp eq i32 %lftr.wideiv, %n
  87. br i1 %exitcond, label %for.end, label %for.body
  88. for.end: ; preds = %for.body, %entry
  89. ret void
  90. }
  91. declare double @llvm.sin.f64(double) nounwind readnone
  92. ;CHECK-LABEL: @cos_f32(
  93. ;CHECK: llvm.cos.v4f32
  94. ;CHECK: ret void
  95. define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  96. entry:
  97. %cmp6 = icmp sgt i32 %n, 0
  98. br i1 %cmp6, label %for.body, label %for.end
  99. for.body: ; preds = %entry, %for.body
  100. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  101. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  102. %0 = load float, float* %arrayidx, align 4
  103. %call = tail call float @llvm.cos.f32(float %0) nounwind readnone
  104. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  105. store float %call, float* %arrayidx2, align 4
  106. %indvars.iv.next = add i64 %indvars.iv, 1
  107. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  108. %exitcond = icmp eq i32 %lftr.wideiv, %n
  109. br i1 %exitcond, label %for.end, label %for.body
  110. for.end: ; preds = %for.body, %entry
  111. ret void
  112. }
  113. declare float @llvm.cos.f32(float) nounwind readnone
  114. ;CHECK-LABEL: @cos_f64(
  115. ;CHECK: llvm.cos.v4f64
  116. ;CHECK: ret void
  117. define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  118. entry:
  119. %cmp6 = icmp sgt i32 %n, 0
  120. br i1 %cmp6, label %for.body, label %for.end
  121. for.body: ; preds = %entry, %for.body
  122. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  123. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  124. %0 = load double, double* %arrayidx, align 8
  125. %call = tail call double @llvm.cos.f64(double %0) nounwind readnone
  126. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  127. store double %call, double* %arrayidx2, align 8
  128. %indvars.iv.next = add i64 %indvars.iv, 1
  129. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  130. %exitcond = icmp eq i32 %lftr.wideiv, %n
  131. br i1 %exitcond, label %for.end, label %for.body
  132. for.end: ; preds = %for.body, %entry
  133. ret void
  134. }
  135. declare double @llvm.cos.f64(double) nounwind readnone
  136. ;CHECK-LABEL: @exp_f32(
  137. ;CHECK: llvm.exp.v4f32
  138. ;CHECK: ret void
  139. define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  140. entry:
  141. %cmp6 = icmp sgt i32 %n, 0
  142. br i1 %cmp6, label %for.body, label %for.end
  143. for.body: ; preds = %entry, %for.body
  144. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  145. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  146. %0 = load float, float* %arrayidx, align 4
  147. %call = tail call float @llvm.exp.f32(float %0) nounwind readnone
  148. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  149. store float %call, float* %arrayidx2, align 4
  150. %indvars.iv.next = add i64 %indvars.iv, 1
  151. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  152. %exitcond = icmp eq i32 %lftr.wideiv, %n
  153. br i1 %exitcond, label %for.end, label %for.body
  154. for.end: ; preds = %for.body, %entry
  155. ret void
  156. }
  157. declare float @llvm.exp.f32(float) nounwind readnone
  158. ;CHECK-LABEL: @exp_f64(
  159. ;CHECK: llvm.exp.v4f64
  160. ;CHECK: ret void
  161. define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  162. entry:
  163. %cmp6 = icmp sgt i32 %n, 0
  164. br i1 %cmp6, label %for.body, label %for.end
  165. for.body: ; preds = %entry, %for.body
  166. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  167. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  168. %0 = load double, double* %arrayidx, align 8
  169. %call = tail call double @llvm.exp.f64(double %0) nounwind readnone
  170. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  171. store double %call, double* %arrayidx2, align 8
  172. %indvars.iv.next = add i64 %indvars.iv, 1
  173. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  174. %exitcond = icmp eq i32 %lftr.wideiv, %n
  175. br i1 %exitcond, label %for.end, label %for.body
  176. for.end: ; preds = %for.body, %entry
  177. ret void
  178. }
  179. declare double @llvm.exp.f64(double) nounwind readnone
  180. ;CHECK-LABEL: @exp2_f32(
  181. ;CHECK: llvm.exp2.v4f32
  182. ;CHECK: ret void
  183. define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  184. entry:
  185. %cmp6 = icmp sgt i32 %n, 0
  186. br i1 %cmp6, label %for.body, label %for.end
  187. for.body: ; preds = %entry, %for.body
  188. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  189. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  190. %0 = load float, float* %arrayidx, align 4
  191. %call = tail call float @llvm.exp2.f32(float %0) nounwind readnone
  192. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  193. store float %call, float* %arrayidx2, align 4
  194. %indvars.iv.next = add i64 %indvars.iv, 1
  195. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  196. %exitcond = icmp eq i32 %lftr.wideiv, %n
  197. br i1 %exitcond, label %for.end, label %for.body
  198. for.end: ; preds = %for.body, %entry
  199. ret void
  200. }
  201. declare float @llvm.exp2.f32(float) nounwind readnone
  202. ;CHECK-LABEL: @exp2_f64(
  203. ;CHECK: llvm.exp2.v4f64
  204. ;CHECK: ret void
  205. define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  206. entry:
  207. %cmp6 = icmp sgt i32 %n, 0
  208. br i1 %cmp6, label %for.body, label %for.end
  209. for.body: ; preds = %entry, %for.body
  210. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  211. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  212. %0 = load double, double* %arrayidx, align 8
  213. %call = tail call double @llvm.exp2.f64(double %0) nounwind readnone
  214. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  215. store double %call, double* %arrayidx2, align 8
  216. %indvars.iv.next = add i64 %indvars.iv, 1
  217. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  218. %exitcond = icmp eq i32 %lftr.wideiv, %n
  219. br i1 %exitcond, label %for.end, label %for.body
  220. for.end: ; preds = %for.body, %entry
  221. ret void
  222. }
  223. declare double @llvm.exp2.f64(double) nounwind readnone
  224. ;CHECK-LABEL: @log_f32(
  225. ;CHECK: llvm.log.v4f32
  226. ;CHECK: ret void
  227. define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  228. entry:
  229. %cmp6 = icmp sgt i32 %n, 0
  230. br i1 %cmp6, label %for.body, label %for.end
  231. for.body: ; preds = %entry, %for.body
  232. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  233. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  234. %0 = load float, float* %arrayidx, align 4
  235. %call = tail call float @llvm.log.f32(float %0) nounwind readnone
  236. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  237. store float %call, float* %arrayidx2, align 4
  238. %indvars.iv.next = add i64 %indvars.iv, 1
  239. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  240. %exitcond = icmp eq i32 %lftr.wideiv, %n
  241. br i1 %exitcond, label %for.end, label %for.body
  242. for.end: ; preds = %for.body, %entry
  243. ret void
  244. }
  245. declare float @llvm.log.f32(float) nounwind readnone
  246. ;CHECK-LABEL: @log_f64(
  247. ;CHECK: llvm.log.v4f64
  248. ;CHECK: ret void
  249. define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  250. entry:
  251. %cmp6 = icmp sgt i32 %n, 0
  252. br i1 %cmp6, label %for.body, label %for.end
  253. for.body: ; preds = %entry, %for.body
  254. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  255. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  256. %0 = load double, double* %arrayidx, align 8
  257. %call = tail call double @llvm.log.f64(double %0) nounwind readnone
  258. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  259. store double %call, double* %arrayidx2, align 8
  260. %indvars.iv.next = add i64 %indvars.iv, 1
  261. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  262. %exitcond = icmp eq i32 %lftr.wideiv, %n
  263. br i1 %exitcond, label %for.end, label %for.body
  264. for.end: ; preds = %for.body, %entry
  265. ret void
  266. }
  267. declare double @llvm.log.f64(double) nounwind readnone
  268. ;CHECK-LABEL: @log10_f32(
  269. ;CHECK: llvm.log10.v4f32
  270. ;CHECK: ret void
  271. define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  272. entry:
  273. %cmp6 = icmp sgt i32 %n, 0
  274. br i1 %cmp6, label %for.body, label %for.end
  275. for.body: ; preds = %entry, %for.body
  276. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  277. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  278. %0 = load float, float* %arrayidx, align 4
  279. %call = tail call float @llvm.log10.f32(float %0) nounwind readnone
  280. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  281. store float %call, float* %arrayidx2, align 4
  282. %indvars.iv.next = add i64 %indvars.iv, 1
  283. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  284. %exitcond = icmp eq i32 %lftr.wideiv, %n
  285. br i1 %exitcond, label %for.end, label %for.body
  286. for.end: ; preds = %for.body, %entry
  287. ret void
  288. }
  289. declare float @llvm.log10.f32(float) nounwind readnone
  290. ;CHECK-LABEL: @log10_f64(
  291. ;CHECK: llvm.log10.v4f64
  292. ;CHECK: ret void
  293. define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  294. entry:
  295. %cmp6 = icmp sgt i32 %n, 0
  296. br i1 %cmp6, label %for.body, label %for.end
  297. for.body: ; preds = %entry, %for.body
  298. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  299. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  300. %0 = load double, double* %arrayidx, align 8
  301. %call = tail call double @llvm.log10.f64(double %0) nounwind readnone
  302. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  303. store double %call, double* %arrayidx2, align 8
  304. %indvars.iv.next = add i64 %indvars.iv, 1
  305. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  306. %exitcond = icmp eq i32 %lftr.wideiv, %n
  307. br i1 %exitcond, label %for.end, label %for.body
  308. for.end: ; preds = %for.body, %entry
  309. ret void
  310. }
  311. declare double @llvm.log10.f64(double) nounwind readnone
  312. ;CHECK-LABEL: @log2_f32(
  313. ;CHECK: llvm.log2.v4f32
  314. ;CHECK: ret void
  315. define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  316. entry:
  317. %cmp6 = icmp sgt i32 %n, 0
  318. br i1 %cmp6, label %for.body, label %for.end
  319. for.body: ; preds = %entry, %for.body
  320. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  321. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  322. %0 = load float, float* %arrayidx, align 4
  323. %call = tail call float @llvm.log2.f32(float %0) nounwind readnone
  324. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  325. store float %call, float* %arrayidx2, align 4
  326. %indvars.iv.next = add i64 %indvars.iv, 1
  327. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  328. %exitcond = icmp eq i32 %lftr.wideiv, %n
  329. br i1 %exitcond, label %for.end, label %for.body
  330. for.end: ; preds = %for.body, %entry
  331. ret void
  332. }
  333. declare float @llvm.log2.f32(float) nounwind readnone
  334. ;CHECK-LABEL: @log2_f64(
  335. ;CHECK: llvm.log2.v4f64
  336. ;CHECK: ret void
  337. define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  338. entry:
  339. %cmp6 = icmp sgt i32 %n, 0
  340. br i1 %cmp6, label %for.body, label %for.end
  341. for.body: ; preds = %entry, %for.body
  342. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  343. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  344. %0 = load double, double* %arrayidx, align 8
  345. %call = tail call double @llvm.log2.f64(double %0) nounwind readnone
  346. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  347. store double %call, double* %arrayidx2, align 8
  348. %indvars.iv.next = add i64 %indvars.iv, 1
  349. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  350. %exitcond = icmp eq i32 %lftr.wideiv, %n
  351. br i1 %exitcond, label %for.end, label %for.body
  352. for.end: ; preds = %for.body, %entry
  353. ret void
  354. }
  355. declare double @llvm.log2.f64(double) nounwind readnone
  356. ;CHECK-LABEL: @fabs_f32(
  357. ;CHECK: llvm.fabs.v4f32
  358. ;CHECK: ret void
  359. define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  360. entry:
  361. %cmp6 = icmp sgt i32 %n, 0
  362. br i1 %cmp6, label %for.body, label %for.end
  363. for.body: ; preds = %entry, %for.body
  364. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  365. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  366. %0 = load float, float* %arrayidx, align 4
  367. %call = tail call float @llvm.fabs.f32(float %0) nounwind readnone
  368. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  369. store float %call, float* %arrayidx2, align 4
  370. %indvars.iv.next = add i64 %indvars.iv, 1
  371. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  372. %exitcond = icmp eq i32 %lftr.wideiv, %n
  373. br i1 %exitcond, label %for.end, label %for.body
  374. for.end: ; preds = %for.body, %entry
  375. ret void
  376. }
  377. declare float @llvm.fabs.f32(float) nounwind readnone
  378. define void @fabs_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  379. entry:
  380. %cmp6 = icmp sgt i32 %n, 0
  381. br i1 %cmp6, label %for.body, label %for.end
  382. for.body: ; preds = %entry, %for.body
  383. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  384. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  385. %0 = load double, double* %arrayidx, align 8
  386. %call = tail call double @llvm.fabs(double %0) nounwind readnone
  387. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  388. store double %call, double* %arrayidx2, align 8
  389. %indvars.iv.next = add i64 %indvars.iv, 1
  390. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  391. %exitcond = icmp eq i32 %lftr.wideiv, %n
  392. br i1 %exitcond, label %for.end, label %for.body
  393. for.end: ; preds = %for.body, %entry
  394. ret void
  395. }
  396. declare double @llvm.fabs(double) nounwind readnone
  397. ;CHECK-LABEL: @copysign_f32(
  398. ;CHECK: llvm.copysign.v4f32
  399. ;CHECK: ret void
  400. define void @copysign_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
  401. entry:
  402. %cmp6 = icmp sgt i32 %n, 0
  403. br i1 %cmp6, label %for.body, label %for.end
  404. for.body: ; preds = %entry, %for.body
  405. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  406. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  407. %0 = load float, float* %arrayidx, align 4
  408. %arrayidx1 = getelementptr inbounds float, float* %z, i64 %indvars.iv
  409. %1 = load float, float* %arrayidx1, align 4
  410. %call = tail call float @llvm.copysign.f32(float %0, float %1) nounwind readnone
  411. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  412. store float %call, float* %arrayidx2, align 4
  413. %indvars.iv.next = add i64 %indvars.iv, 1
  414. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  415. %exitcond = icmp eq i32 %lftr.wideiv, %n
  416. br i1 %exitcond, label %for.end, label %for.body
  417. for.end: ; preds = %for.body, %entry
  418. ret void
  419. }
  420. declare float @llvm.copysign.f32(float, float) nounwind readnone
  421. define void @copysign_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
  422. entry:
  423. %cmp6 = icmp sgt i32 %n, 0
  424. br i1 %cmp6, label %for.body, label %for.end
  425. for.body: ; preds = %entry, %for.body
  426. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  427. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  428. %0 = load double, double* %arrayidx, align 8
  429. %arrayidx1 = getelementptr inbounds double, double* %z, i64 %indvars.iv
  430. %1 = load double, double* %arrayidx, align 8
  431. %call = tail call double @llvm.copysign(double %0, double %1) nounwind readnone
  432. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  433. store double %call, double* %arrayidx2, align 8
  434. %indvars.iv.next = add i64 %indvars.iv, 1
  435. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  436. %exitcond = icmp eq i32 %lftr.wideiv, %n
  437. br i1 %exitcond, label %for.end, label %for.body
  438. for.end: ; preds = %for.body, %entry
  439. ret void
  440. }
  441. declare double @llvm.copysign(double, double) nounwind readnone
  442. ;CHECK-LABEL: @floor_f32(
  443. ;CHECK: llvm.floor.v4f32
  444. ;CHECK: ret void
  445. define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  446. entry:
  447. %cmp6 = icmp sgt i32 %n, 0
  448. br i1 %cmp6, label %for.body, label %for.end
  449. for.body: ; preds = %entry, %for.body
  450. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  451. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  452. %0 = load float, float* %arrayidx, align 4
  453. %call = tail call float @llvm.floor.f32(float %0) nounwind readnone
  454. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  455. store float %call, float* %arrayidx2, align 4
  456. %indvars.iv.next = add i64 %indvars.iv, 1
  457. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  458. %exitcond = icmp eq i32 %lftr.wideiv, %n
  459. br i1 %exitcond, label %for.end, label %for.body
  460. for.end: ; preds = %for.body, %entry
  461. ret void
  462. }
  463. declare float @llvm.floor.f32(float) nounwind readnone
  464. ;CHECK-LABEL: @floor_f64(
  465. ;CHECK: llvm.floor.v4f64
  466. ;CHECK: ret void
  467. define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  468. entry:
  469. %cmp6 = icmp sgt i32 %n, 0
  470. br i1 %cmp6, label %for.body, label %for.end
  471. for.body: ; preds = %entry, %for.body
  472. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  473. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  474. %0 = load double, double* %arrayidx, align 8
  475. %call = tail call double @llvm.floor.f64(double %0) nounwind readnone
  476. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  477. store double %call, double* %arrayidx2, align 8
  478. %indvars.iv.next = add i64 %indvars.iv, 1
  479. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  480. %exitcond = icmp eq i32 %lftr.wideiv, %n
  481. br i1 %exitcond, label %for.end, label %for.body
  482. for.end: ; preds = %for.body, %entry
  483. ret void
  484. }
  485. declare double @llvm.floor.f64(double) nounwind readnone
  486. ;CHECK-LABEL: @ceil_f32(
  487. ;CHECK: llvm.ceil.v4f32
  488. ;CHECK: ret void
  489. define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  490. entry:
  491. %cmp6 = icmp sgt i32 %n, 0
  492. br i1 %cmp6, label %for.body, label %for.end
  493. for.body: ; preds = %entry, %for.body
  494. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  495. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  496. %0 = load float, float* %arrayidx, align 4
  497. %call = tail call float @llvm.ceil.f32(float %0) nounwind readnone
  498. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  499. store float %call, float* %arrayidx2, align 4
  500. %indvars.iv.next = add i64 %indvars.iv, 1
  501. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  502. %exitcond = icmp eq i32 %lftr.wideiv, %n
  503. br i1 %exitcond, label %for.end, label %for.body
  504. for.end: ; preds = %for.body, %entry
  505. ret void
  506. }
  507. declare float @llvm.ceil.f32(float) nounwind readnone
  508. ;CHECK-LABEL: @ceil_f64(
  509. ;CHECK: llvm.ceil.v4f64
  510. ;CHECK: ret void
  511. define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  512. entry:
  513. %cmp6 = icmp sgt i32 %n, 0
  514. br i1 %cmp6, label %for.body, label %for.end
  515. for.body: ; preds = %entry, %for.body
  516. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  517. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  518. %0 = load double, double* %arrayidx, align 8
  519. %call = tail call double @llvm.ceil.f64(double %0) nounwind readnone
  520. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  521. store double %call, double* %arrayidx2, align 8
  522. %indvars.iv.next = add i64 %indvars.iv, 1
  523. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  524. %exitcond = icmp eq i32 %lftr.wideiv, %n
  525. br i1 %exitcond, label %for.end, label %for.body
  526. for.end: ; preds = %for.body, %entry
  527. ret void
  528. }
  529. declare double @llvm.ceil.f64(double) nounwind readnone
  530. ;CHECK-LABEL: @trunc_f32(
  531. ;CHECK: llvm.trunc.v4f32
  532. ;CHECK: ret void
  533. define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  534. entry:
  535. %cmp6 = icmp sgt i32 %n, 0
  536. br i1 %cmp6, label %for.body, label %for.end
  537. for.body: ; preds = %entry, %for.body
  538. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  539. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  540. %0 = load float, float* %arrayidx, align 4
  541. %call = tail call float @llvm.trunc.f32(float %0) nounwind readnone
  542. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  543. store float %call, float* %arrayidx2, align 4
  544. %indvars.iv.next = add i64 %indvars.iv, 1
  545. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  546. %exitcond = icmp eq i32 %lftr.wideiv, %n
  547. br i1 %exitcond, label %for.end, label %for.body
  548. for.end: ; preds = %for.body, %entry
  549. ret void
  550. }
  551. declare float @llvm.trunc.f32(float) nounwind readnone
  552. ;CHECK-LABEL: @trunc_f64(
  553. ;CHECK: llvm.trunc.v4f64
  554. ;CHECK: ret void
  555. define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  556. entry:
  557. %cmp6 = icmp sgt i32 %n, 0
  558. br i1 %cmp6, label %for.body, label %for.end
  559. for.body: ; preds = %entry, %for.body
  560. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  561. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  562. %0 = load double, double* %arrayidx, align 8
  563. %call = tail call double @llvm.trunc.f64(double %0) nounwind readnone
  564. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  565. store double %call, double* %arrayidx2, align 8
  566. %indvars.iv.next = add i64 %indvars.iv, 1
  567. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  568. %exitcond = icmp eq i32 %lftr.wideiv, %n
  569. br i1 %exitcond, label %for.end, label %for.body
  570. for.end: ; preds = %for.body, %entry
  571. ret void
  572. }
  573. declare double @llvm.trunc.f64(double) nounwind readnone
  574. ;CHECK-LABEL: @rint_f32(
  575. ;CHECK: llvm.rint.v4f32
  576. ;CHECK: ret void
  577. define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  578. entry:
  579. %cmp6 = icmp sgt i32 %n, 0
  580. br i1 %cmp6, label %for.body, label %for.end
  581. for.body: ; preds = %entry, %for.body
  582. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  583. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  584. %0 = load float, float* %arrayidx, align 4
  585. %call = tail call float @llvm.rint.f32(float %0) nounwind readnone
  586. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  587. store float %call, float* %arrayidx2, align 4
  588. %indvars.iv.next = add i64 %indvars.iv, 1
  589. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  590. %exitcond = icmp eq i32 %lftr.wideiv, %n
  591. br i1 %exitcond, label %for.end, label %for.body
  592. for.end: ; preds = %for.body, %entry
  593. ret void
  594. }
  595. declare float @llvm.rint.f32(float) nounwind readnone
  596. ;CHECK-LABEL: @rint_f64(
  597. ;CHECK: llvm.rint.v4f64
  598. ;CHECK: ret void
  599. define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  600. entry:
  601. %cmp6 = icmp sgt i32 %n, 0
  602. br i1 %cmp6, label %for.body, label %for.end
  603. for.body: ; preds = %entry, %for.body
  604. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  605. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  606. %0 = load double, double* %arrayidx, align 8
  607. %call = tail call double @llvm.rint.f64(double %0) nounwind readnone
  608. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  609. store double %call, double* %arrayidx2, align 8
  610. %indvars.iv.next = add i64 %indvars.iv, 1
  611. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  612. %exitcond = icmp eq i32 %lftr.wideiv, %n
  613. br i1 %exitcond, label %for.end, label %for.body
  614. for.end: ; preds = %for.body, %entry
  615. ret void
  616. }
  617. declare double @llvm.rint.f64(double) nounwind readnone
  618. ;CHECK-LABEL: @nearbyint_f32(
  619. ;CHECK: llvm.nearbyint.v4f32
  620. ;CHECK: ret void
  621. define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  622. entry:
  623. %cmp6 = icmp sgt i32 %n, 0
  624. br i1 %cmp6, label %for.body, label %for.end
  625. for.body: ; preds = %entry, %for.body
  626. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  627. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  628. %0 = load float, float* %arrayidx, align 4
  629. %call = tail call float @llvm.nearbyint.f32(float %0) nounwind readnone
  630. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  631. store float %call, float* %arrayidx2, align 4
  632. %indvars.iv.next = add i64 %indvars.iv, 1
  633. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  634. %exitcond = icmp eq i32 %lftr.wideiv, %n
  635. br i1 %exitcond, label %for.end, label %for.body
  636. for.end: ; preds = %for.body, %entry
  637. ret void
  638. }
  639. declare float @llvm.nearbyint.f32(float) nounwind readnone
  640. ;CHECK-LABEL: @nearbyint_f64(
  641. ;CHECK: llvm.nearbyint.v4f64
  642. ;CHECK: ret void
  643. define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  644. entry:
  645. %cmp6 = icmp sgt i32 %n, 0
  646. br i1 %cmp6, label %for.body, label %for.end
  647. for.body: ; preds = %entry, %for.body
  648. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  649. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  650. %0 = load double, double* %arrayidx, align 8
  651. %call = tail call double @llvm.nearbyint.f64(double %0) nounwind readnone
  652. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  653. store double %call, double* %arrayidx2, align 8
  654. %indvars.iv.next = add i64 %indvars.iv, 1
  655. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  656. %exitcond = icmp eq i32 %lftr.wideiv, %n
  657. br i1 %exitcond, label %for.end, label %for.body
  658. for.end: ; preds = %for.body, %entry
  659. ret void
  660. }
  661. declare double @llvm.nearbyint.f64(double) nounwind readnone
  662. ;CHECK-LABEL: @round_f32(
  663. ;CHECK: llvm.round.v4f32
  664. ;CHECK: ret void
  665. define void @round_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
  666. entry:
  667. %cmp6 = icmp sgt i32 %n, 0
  668. br i1 %cmp6, label %for.body, label %for.end
  669. for.body: ; preds = %entry, %for.body
  670. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  671. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  672. %0 = load float, float* %arrayidx, align 4
  673. %call = tail call float @llvm.round.f32(float %0) nounwind readnone
  674. %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  675. store float %call, float* %arrayidx2, align 4
  676. %indvars.iv.next = add i64 %indvars.iv, 1
  677. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  678. %exitcond = icmp eq i32 %lftr.wideiv, %n
  679. br i1 %exitcond, label %for.end, label %for.body
  680. for.end: ; preds = %for.body, %entry
  681. ret void
  682. }
  683. declare float @llvm.round.f32(float) nounwind readnone
  684. ;CHECK-LABEL: @round_f64(
  685. ;CHECK: llvm.round.v4f64
  686. ;CHECK: ret void
  687. define void @round_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  688. entry:
  689. %cmp6 = icmp sgt i32 %n, 0
  690. br i1 %cmp6, label %for.body, label %for.end
  691. for.body: ; preds = %entry, %for.body
  692. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  693. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  694. %0 = load double, double* %arrayidx, align 8
  695. %call = tail call double @llvm.round.f64(double %0) nounwind readnone
  696. %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  697. store double %call, double* %arrayidx2, align 8
  698. %indvars.iv.next = add i64 %indvars.iv, 1
  699. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  700. %exitcond = icmp eq i32 %lftr.wideiv, %n
  701. br i1 %exitcond, label %for.end, label %for.body
  702. for.end: ; preds = %for.body, %entry
  703. ret void
  704. }
  705. declare double @llvm.round.f64(double) nounwind readnone
  706. ;CHECK-LABEL: @fma_f32(
  707. ;CHECK: llvm.fma.v4f32
  708. ;CHECK: ret void
  709. define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
  710. entry:
  711. %cmp12 = icmp sgt i32 %n, 0
  712. br i1 %cmp12, label %for.body, label %for.end
  713. for.body: ; preds = %entry, %for.body
  714. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  715. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  716. %0 = load float, float* %arrayidx, align 4
  717. %arrayidx2 = getelementptr inbounds float, float* %w, i64 %indvars.iv
  718. %1 = load float, float* %arrayidx2, align 4
  719. %arrayidx4 = getelementptr inbounds float, float* %z, i64 %indvars.iv
  720. %2 = load float, float* %arrayidx4, align 4
  721. %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
  722. %arrayidx6 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  723. store float %3, float* %arrayidx6, align 4
  724. %indvars.iv.next = add i64 %indvars.iv, 1
  725. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  726. %exitcond = icmp eq i32 %lftr.wideiv, %n
  727. br i1 %exitcond, label %for.end, label %for.body
  728. for.end: ; preds = %for.body, %entry
  729. ret void
  730. }
  731. declare float @llvm.fma.f32(float, float, float) nounwind readnone
  732. ;CHECK-LABEL: @fma_f64(
  733. ;CHECK: llvm.fma.v4f64
  734. ;CHECK: ret void
  735. define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
  736. entry:
  737. %cmp12 = icmp sgt i32 %n, 0
  738. br i1 %cmp12, label %for.body, label %for.end
  739. for.body: ; preds = %entry, %for.body
  740. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  741. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  742. %0 = load double, double* %arrayidx, align 8
  743. %arrayidx2 = getelementptr inbounds double, double* %w, i64 %indvars.iv
  744. %1 = load double, double* %arrayidx2, align 8
  745. %arrayidx4 = getelementptr inbounds double, double* %z, i64 %indvars.iv
  746. %2 = load double, double* %arrayidx4, align 8
  747. %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
  748. %arrayidx6 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  749. store double %3, double* %arrayidx6, align 8
  750. %indvars.iv.next = add i64 %indvars.iv, 1
  751. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  752. %exitcond = icmp eq i32 %lftr.wideiv, %n
  753. br i1 %exitcond, label %for.end, label %for.body
  754. for.end: ; preds = %for.body, %entry
  755. ret void
  756. }
  757. declare double @llvm.fma.f64(double, double, double) nounwind readnone
  758. ;CHECK-LABEL: @fmuladd_f32(
  759. ;CHECK: llvm.fmuladd.v4f32
  760. ;CHECK: ret void
  761. define void @fmuladd_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
  762. entry:
  763. %cmp12 = icmp sgt i32 %n, 0
  764. br i1 %cmp12, label %for.body, label %for.end
  765. for.body: ; preds = %entry, %for.body
  766. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  767. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  768. %0 = load float, float* %arrayidx, align 4
  769. %arrayidx2 = getelementptr inbounds float, float* %w, i64 %indvars.iv
  770. %1 = load float, float* %arrayidx2, align 4
  771. %arrayidx4 = getelementptr inbounds float, float* %z, i64 %indvars.iv
  772. %2 = load float, float* %arrayidx4, align 4
  773. %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)
  774. %arrayidx6 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  775. store float %3, float* %arrayidx6, align 4
  776. %indvars.iv.next = add i64 %indvars.iv, 1
  777. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  778. %exitcond = icmp eq i32 %lftr.wideiv, %n
  779. br i1 %exitcond, label %for.end, label %for.body
  780. for.end: ; preds = %for.body, %entry
  781. ret void
  782. }
  783. declare float @llvm.fmuladd.f32(float, float, float) nounwind readnone
  784. ;CHECK-LABEL: @fmuladd_f64(
  785. ;CHECK: llvm.fmuladd.v4f64
  786. ;CHECK: ret void
  787. define void @fmuladd_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
  788. entry:
  789. %cmp12 = icmp sgt i32 %n, 0
  790. br i1 %cmp12, label %for.body, label %for.end
  791. for.body: ; preds = %entry, %for.body
  792. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  793. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  794. %0 = load double, double* %arrayidx, align 8
  795. %arrayidx2 = getelementptr inbounds double, double* %w, i64 %indvars.iv
  796. %1 = load double, double* %arrayidx2, align 8
  797. %arrayidx4 = getelementptr inbounds double, double* %z, i64 %indvars.iv
  798. %2 = load double, double* %arrayidx4, align 8
  799. %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)
  800. %arrayidx6 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  801. store double %3, double* %arrayidx6, align 8
  802. %indvars.iv.next = add i64 %indvars.iv, 1
  803. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  804. %exitcond = icmp eq i32 %lftr.wideiv, %n
  805. br i1 %exitcond, label %for.end, label %for.body
  806. for.end: ; preds = %for.body, %entry
  807. ret void
  808. }
  809. declare double @llvm.fmuladd.f64(double, double, double) nounwind readnone
  810. ;CHECK-LABEL: @pow_f32(
  811. ;CHECK: llvm.pow.v4f32
  812. ;CHECK: ret void
  813. define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
  814. entry:
  815. %cmp9 = icmp sgt i32 %n, 0
  816. br i1 %cmp9, label %for.body, label %for.end
  817. for.body: ; preds = %entry, %for.body
  818. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  819. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  820. %0 = load float, float* %arrayidx, align 4
  821. %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
  822. %1 = load float, float* %arrayidx2, align 4
  823. %call = tail call float @llvm.pow.f32(float %0, float %1) nounwind readnone
  824. %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  825. store float %call, float* %arrayidx4, align 4
  826. %indvars.iv.next = add i64 %indvars.iv, 1
  827. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  828. %exitcond = icmp eq i32 %lftr.wideiv, %n
  829. br i1 %exitcond, label %for.end, label %for.body
  830. for.end: ; preds = %for.body, %entry
  831. ret void
  832. }
  833. declare float @llvm.pow.f32(float, float) nounwind readnone
  834. ;CHECK-LABEL: @pow_f64(
  835. ;CHECK: llvm.pow.v4f64
  836. ;CHECK: ret void
  837. define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
  838. entry:
  839. %cmp9 = icmp sgt i32 %n, 0
  840. br i1 %cmp9, label %for.body, label %for.end
  841. for.body: ; preds = %entry, %for.body
  842. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  843. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  844. %0 = load double, double* %arrayidx, align 8
  845. %arrayidx2 = getelementptr inbounds double, double* %z, i64 %indvars.iv
  846. %1 = load double, double* %arrayidx2, align 8
  847. %call = tail call double @llvm.pow.f64(double %0, double %1) nounwind readnone
  848. %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  849. store double %call, double* %arrayidx4, align 8
  850. %indvars.iv.next = add i64 %indvars.iv, 1
  851. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  852. %exitcond = icmp eq i32 %lftr.wideiv, %n
  853. br i1 %exitcond, label %for.end, label %for.body
  854. for.end: ; preds = %for.body, %entry
  855. ret void
  856. }
  857. ; CHECK: fabs_libm
  858. ; CHECK: call <4 x float> @llvm.fabs.v4f32
  859. ; CHECK: ret void
  860. define void @fabs_libm(float* nocapture %x) nounwind {
  861. entry:
  862. br label %for.body
  863. for.body: ; preds = %entry, %for.body
  864. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  865. %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
  866. %0 = load float, float* %arrayidx, align 4
  867. %call = tail call float @fabsf(float %0) nounwind readnone
  868. store float %call, float* %arrayidx, align 4
  869. %indvars.iv.next = add i64 %indvars.iv, 1
  870. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  871. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  872. br i1 %exitcond, label %for.end, label %for.body
  873. for.end: ; preds = %for.body
  874. ret void
  875. }
  876. declare float @fabsf(float) nounwind readnone
  877. declare double @llvm.pow.f64(double, double) nounwind readnone
  878. ; Make sure we don't replace calls to functions with standard library function
  879. ; signatures but defined with internal linkage.
  880. define internal float @roundf(float %x) nounwind readnone {
  881. ret float 0.00000000
  882. }
  883. ; CHECK-LABEL: internal_round
  884. ; CHECK-NOT: load <4 x float>
  885. define void @internal_round(float* nocapture %x) nounwind {
  886. entry:
  887. br label %for.body
  888. for.body: ; preds = %entry, %for.body
  889. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  890. %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
  891. %0 = load float, float* %arrayidx, align 4
  892. %call = tail call float @roundf(float %0) nounwind readnone
  893. store float %call, float* %arrayidx, align 4
  894. %indvars.iv.next = add i64 %indvars.iv, 1
  895. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  896. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  897. br i1 %exitcond, label %for.end, label %for.body
  898. for.end: ; preds = %for.body
  899. ret void
  900. }
  901. ; Make sure we don't replace calls to functions with standard library names but
  902. ; different signatures.
  903. declare void @round(double %f)
  904. ; CHECK-LABEL: wrong_signature
  905. ; CHECK-NOT: load <4 x double>
  906. define void @wrong_signature(double* nocapture %x) nounwind {
  907. entry:
  908. br label %for.body
  909. for.body: ; preds = %entry, %for.body
  910. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  911. %arrayidx = getelementptr inbounds double, double* %x, i64 %indvars.iv
  912. %0 = load double, double* %arrayidx, align 4
  913. store double %0, double* %arrayidx, align 4
  914. tail call void @round(double %0) nounwind readnone
  915. %indvars.iv.next = add i64 %indvars.iv, 1
  916. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  917. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  918. br i1 %exitcond, label %for.end, label %for.body
  919. for.end: ; preds = %for.body
  920. ret void
  921. }
  922. declare double @llvm.powi.f64(double %Val, i32 %power) nounwind readnone
  923. ;CHECK-LABEL: @powi_f64(
  924. ;CHECK: llvm.powi.v4f64
  925. ;CHECK: ret void
  926. define void @powi_f64(i32 %n, double* noalias %y, double* noalias %x, i32 %P) nounwind uwtable {
  927. entry:
  928. %cmp9 = icmp sgt i32 %n, 0
  929. br i1 %cmp9, label %for.body, label %for.end
  930. for.body: ; preds = %entry, %for.body
  931. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  932. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  933. %0 = load double, double* %arrayidx, align 8
  934. %call = tail call double @llvm.powi.f64(double %0, i32 %P) nounwind readnone
  935. %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  936. store double %call, double* %arrayidx4, align 8
  937. %indvars.iv.next = add i64 %indvars.iv, 1
  938. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  939. %exitcond = icmp eq i32 %lftr.wideiv, %n
  940. br i1 %exitcond, label %for.end, label %for.body
  941. for.end: ; preds = %for.body, %entry
  942. ret void
  943. }
  944. ;CHECK-LABEL: @powi_f64_neg(
  945. ;CHECK-NOT: llvm.powi.v4f64
  946. ;CHECK: ret void
  947. define void @powi_f64_neg(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
  948. entry:
  949. %cmp9 = icmp sgt i32 %n, 0
  950. br i1 %cmp9, label %for.body, label %for.end
  951. for.body: ; preds = %entry, %for.body
  952. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  953. %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
  954. %0 = load double, double* %arrayidx, align 8
  955. %1 = trunc i64 %indvars.iv to i32
  956. %call = tail call double @llvm.powi.f64(double %0, i32 %1) nounwind readnone
  957. %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
  958. store double %call, double* %arrayidx4, align 8
  959. %indvars.iv.next = add i64 %indvars.iv, 1
  960. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  961. %exitcond = icmp eq i32 %lftr.wideiv, %n
  962. br i1 %exitcond, label %for.end, label %for.body
  963. for.end: ; preds = %for.body, %entry
  964. ret void
  965. }
  966. declare i64 @llvm.cttz.i64 (i64, i1) nounwind readnone
  967. ;CHECK-LABEL: @cttz_f64(
  968. ;CHECK: llvm.cttz.v4i64
  969. ;CHECK: ret void
  970. define void @cttz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
  971. entry:
  972. %cmp9 = icmp sgt i32 %n, 0
  973. br i1 %cmp9, label %for.body, label %for.end
  974. for.body: ; preds = %entry, %for.body
  975. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  976. %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
  977. %0 = load i64, i64* %arrayidx, align 8
  978. %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true) nounwind readnone
  979. %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
  980. store i64 %call, i64* %arrayidx4, align 8
  981. %indvars.iv.next = add i64 %indvars.iv, 1
  982. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  983. %exitcond = icmp eq i32 %lftr.wideiv, %n
  984. br i1 %exitcond, label %for.end, label %for.body
  985. for.end: ; preds = %for.body, %entry
  986. ret void
  987. }
  988. declare i64 @llvm.ctlz.i64 (i64, i1) nounwind readnone
  989. ;CHECK-LABEL: @ctlz_f64(
  990. ;CHECK: llvm.ctlz.v4i64
  991. ;CHECK: ret void
  992. define void @ctlz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
  993. entry:
  994. %cmp9 = icmp sgt i32 %n, 0
  995. br i1 %cmp9, label %for.body, label %for.end
  996. for.body: ; preds = %entry, %for.body
  997. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  998. %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
  999. %0 = load i64, i64* %arrayidx, align 8
  1000. %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true) nounwind readnone
  1001. %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
  1002. store i64 %call, i64* %arrayidx4, align 8
  1003. %indvars.iv.next = add i64 %indvars.iv, 1
  1004. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  1005. %exitcond = icmp eq i32 %lftr.wideiv, %n
  1006. br i1 %exitcond, label %for.end, label %for.body
  1007. for.end: ; preds = %for.body, %entry
  1008. ret void
  1009. }
  1010. declare float @llvm.minnum.f32(float, float) nounwind readnone
  1011. ;CHECK-LABEL: @minnum_f32(
  1012. ;CHECK: llvm.minnum.v4f32
  1013. ;CHECK: ret void
  1014. define void @minnum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
  1015. entry:
  1016. %cmp9 = icmp sgt i32 %n, 0
  1017. br i1 %cmp9, label %for.body, label %for.end
  1018. for.body: ; preds = %entry, %for.body
  1019. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  1020. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  1021. %0 = load float, float* %arrayidx, align 4
  1022. %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
  1023. %1 = load float, float* %arrayidx2, align 4
  1024. %call = tail call float @llvm.minnum.f32(float %0, float %1) nounwind readnone
  1025. %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  1026. store float %call, float* %arrayidx4, align 4
  1027. %indvars.iv.next = add i64 %indvars.iv, 1
  1028. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  1029. %exitcond = icmp eq i32 %lftr.wideiv, %n
  1030. br i1 %exitcond, label %for.end, label %for.body
  1031. for.end: ; preds = %for.body, %entry
  1032. ret void
  1033. }
  1034. declare float @llvm.maxnum.f32(float, float) nounwind readnone
  1035. ;CHECK-LABEL: @maxnum_f32(
  1036. ;CHECK: llvm.maxnum.v4f32
  1037. ;CHECK: ret void
  1038. define void @maxnum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
  1039. entry:
  1040. %cmp9 = icmp sgt i32 %n, 0
  1041. br i1 %cmp9, label %for.body, label %for.end
  1042. for.body: ; preds = %entry, %for.body
  1043. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  1044. %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
  1045. %0 = load float, float* %arrayidx, align 4
  1046. %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
  1047. %1 = load float, float* %arrayidx2, align 4
  1048. %call = tail call float @llvm.maxnum.f32(float %0, float %1) nounwind readnone
  1049. %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
  1050. store float %call, float* %arrayidx4, align 4
  1051. %indvars.iv.next = add i64 %indvars.iv, 1
  1052. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  1053. %exitcond = icmp eq i32 %lftr.wideiv, %n
  1054. br i1 %exitcond, label %for.end, label %for.body
  1055. for.end: ; preds = %for.body, %entry
  1056. ret void
  1057. }