gcc-examples.ll 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. ; RUN: opt < %s -basicaa -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -dce -instcombine -S | FileCheck %s
  2. ; RUN: opt < %s -basicaa -loop-vectorize -force-vector-width=4 -force-vector-interleave=4 -dce -instcombine -S | FileCheck %s -check-prefix=UNROLL
  3. 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"
  4. target triple = "x86_64-apple-macosx10.8.0"
  5. @b = common global [2048 x i32] zeroinitializer, align 16
  6. @c = common global [2048 x i32] zeroinitializer, align 16
  7. @a = common global [2048 x i32] zeroinitializer, align 16
  8. @G = common global [32 x [1024 x i32]] zeroinitializer, align 16
  9. @ub = common global [1024 x i32] zeroinitializer, align 16
  10. @uc = common global [1024 x i32] zeroinitializer, align 16
  11. @d = common global [2048 x i32] zeroinitializer, align 16
  12. @fa = common global [1024 x float] zeroinitializer, align 16
  13. @fb = common global [1024 x float] zeroinitializer, align 16
  14. @ic = common global [1024 x i32] zeroinitializer, align 16
  15. @da = common global [1024 x float] zeroinitializer, align 16
  16. @db = common global [1024 x float] zeroinitializer, align 16
  17. @dc = common global [1024 x float] zeroinitializer, align 16
  18. @dd = common global [1024 x float] zeroinitializer, align 16
  19. @dj = common global [1024 x i32] zeroinitializer, align 16
  20. ;CHECK-LABEL: @example1(
  21. ;CHECK: load <4 x i32>
  22. ;CHECK: add nsw <4 x i32>
  23. ;CHECK: store <4 x i32>
  24. ;CHECK: ret void
  25. ;UNROLL-LABEL: @example1(
  26. ;UNROLL: load <4 x i32>
  27. ;UNROLL: load <4 x i32>
  28. ;UNROLL: load <4 x i32>
  29. ;UNROLL: load <4 x i32>
  30. ;UNROLL: add nsw <4 x i32>
  31. ;UNROLL: add nsw <4 x i32>
  32. ;UNROLL: add nsw <4 x i32>
  33. ;UNROLL: add nsw <4 x i32>
  34. ;UNROLL: store <4 x i32>
  35. ;UNROLL: store <4 x i32>
  36. ;UNROLL: store <4 x i32>
  37. ;UNROLL: store <4 x i32>
  38. ;UNROLL: ret void
  39. define void @example1() nounwind uwtable ssp {
  40. br label %1
  41. ; <label>:1 ; preds = %1, %0
  42. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  43. %2 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv
  44. %3 = load i32, i32* %2, align 4
  45. %4 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %indvars.iv
  46. %5 = load i32, i32* %4, align 4
  47. %6 = add nsw i32 %5, %3
  48. %7 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
  49. store i32 %6, i32* %7, align 4
  50. %indvars.iv.next = add i64 %indvars.iv, 1
  51. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  52. %exitcond = icmp eq i32 %lftr.wideiv, 256
  53. br i1 %exitcond, label %8, label %1
  54. ; <label>:8 ; preds = %1
  55. ret void
  56. }
  57. ;CHECK-LABEL: @example2(
  58. ;CHECK: store <4 x i32>
  59. ;CHECK: ret void
  60. ;UNROLL-LABEL: @example2(
  61. ;UNROLL: store <4 x i32>
  62. ;UNROLL: store <4 x i32>
  63. ;UNROLL: store <4 x i32>
  64. ;UNROLL: store <4 x i32>
  65. ;UNROLL: ret void
  66. define void @example2(i32 %n, i32 %x) nounwind uwtable ssp {
  67. %1 = icmp sgt i32 %n, 0
  68. br i1 %1, label %.lr.ph5, label %.preheader
  69. ..preheader_crit_edge: ; preds = %.lr.ph5
  70. %phitmp = sext i32 %n to i64
  71. br label %.preheader
  72. .preheader: ; preds = %..preheader_crit_edge, %0
  73. %i.0.lcssa = phi i64 [ %phitmp, %..preheader_crit_edge ], [ 0, %0 ]
  74. %2 = icmp eq i32 %n, 0
  75. br i1 %2, label %._crit_edge, label %.lr.ph
  76. .lr.ph5: ; preds = %0, %.lr.ph5
  77. %indvars.iv6 = phi i64 [ %indvars.iv.next7, %.lr.ph5 ], [ 0, %0 ]
  78. %3 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv6
  79. store i32 %x, i32* %3, align 4
  80. %indvars.iv.next7 = add i64 %indvars.iv6, 1
  81. %lftr.wideiv = trunc i64 %indvars.iv.next7 to i32
  82. %exitcond = icmp eq i32 %lftr.wideiv, %n
  83. br i1 %exitcond, label %..preheader_crit_edge, label %.lr.ph5
  84. .lr.ph: ; preds = %.preheader, %.lr.ph
  85. %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %i.0.lcssa, %.preheader ]
  86. %.02 = phi i32 [ %4, %.lr.ph ], [ %n, %.preheader ]
  87. %4 = add nsw i32 %.02, -1
  88. %5 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv
  89. %6 = load i32, i32* %5, align 4
  90. %7 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %indvars.iv
  91. %8 = load i32, i32* %7, align 4
  92. %9 = and i32 %8, %6
  93. %10 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
  94. store i32 %9, i32* %10, align 4
  95. %indvars.iv.next = add i64 %indvars.iv, 1
  96. %11 = icmp eq i32 %4, 0
  97. br i1 %11, label %._crit_edge, label %.lr.ph
  98. ._crit_edge: ; preds = %.lr.ph, %.preheader
  99. ret void
  100. }
  101. ;CHECK-LABEL: @example3(
  102. ;CHECK: <4 x i32>
  103. ;CHECK: ret void
  104. ;UNROLL-LABEL: @example3(
  105. ;UNROLL: <4 x i32>
  106. ;UNROLL: <4 x i32>
  107. ;UNROLL: <4 x i32>
  108. ;UNROLL: <4 x i32>
  109. ;UNROLL: ret void
  110. define void @example3(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) nounwind uwtable ssp {
  111. %1 = icmp eq i32 %n, 0
  112. br i1 %1, label %._crit_edge, label %.lr.ph
  113. .lr.ph: ; preds = %0, %.lr.ph
  114. %.05 = phi i32 [ %2, %.lr.ph ], [ %n, %0 ]
  115. %.014 = phi i32* [ %5, %.lr.ph ], [ %p, %0 ]
  116. %.023 = phi i32* [ %3, %.lr.ph ], [ %q, %0 ]
  117. %2 = add nsw i32 %.05, -1
  118. %3 = getelementptr inbounds i32, i32* %.023, i64 1
  119. %4 = load i32, i32* %.023, align 16
  120. %5 = getelementptr inbounds i32, i32* %.014, i64 1
  121. store i32 %4, i32* %.014, align 16
  122. %6 = icmp eq i32 %2, 0
  123. br i1 %6, label %._crit_edge, label %.lr.ph
  124. ._crit_edge: ; preds = %.lr.ph, %0
  125. ret void
  126. }
  127. ;CHECK-LABEL: @example4(
  128. ;CHECK: load <4 x i32>
  129. ;CHECK: ret void
  130. ;UNROLL-LABEL: @example4(
  131. ;UNROLL: load <4 x i32>
  132. ;UNROLL: load <4 x i32>
  133. ;UNROLL: load <4 x i32>
  134. ;UNROLL: load <4 x i32>
  135. ;UNROLL: ret void
  136. define void @example4(i32 %n, i32* noalias nocapture %p, i32* noalias nocapture %q) nounwind uwtable ssp {
  137. %1 = add nsw i32 %n, -1
  138. %2 = icmp eq i32 %n, 0
  139. br i1 %2, label %.preheader4, label %.lr.ph10
  140. .preheader4: ; preds = %0
  141. %3 = icmp sgt i32 %1, 0
  142. br i1 %3, label %.lr.ph6, label %._crit_edge
  143. .lr.ph10: ; preds = %0, %.lr.ph10
  144. %4 = phi i32 [ %9, %.lr.ph10 ], [ %1, %0 ]
  145. %.018 = phi i32* [ %8, %.lr.ph10 ], [ %p, %0 ]
  146. %.027 = phi i32* [ %5, %.lr.ph10 ], [ %q, %0 ]
  147. %5 = getelementptr inbounds i32, i32* %.027, i64 1
  148. %6 = load i32, i32* %.027, align 16
  149. %7 = add nsw i32 %6, 5
  150. %8 = getelementptr inbounds i32, i32* %.018, i64 1
  151. store i32 %7, i32* %.018, align 16
  152. %9 = add nsw i32 %4, -1
  153. %10 = icmp eq i32 %4, 0
  154. br i1 %10, label %._crit_edge, label %.lr.ph10
  155. .preheader: ; preds = %.lr.ph6
  156. br i1 %3, label %.lr.ph, label %._crit_edge
  157. .lr.ph6: ; preds = %.preheader4, %.lr.ph6
  158. %indvars.iv11 = phi i64 [ %indvars.iv.next12, %.lr.ph6 ], [ 0, %.preheader4 ]
  159. %indvars.iv.next12 = add i64 %indvars.iv11, 1
  160. %11 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv.next12
  161. %12 = load i32, i32* %11, align 4
  162. %13 = add nsw i64 %indvars.iv11, 3
  163. %14 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %13
  164. %15 = load i32, i32* %14, align 4
  165. %16 = add nsw i32 %15, %12
  166. %17 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv11
  167. store i32 %16, i32* %17, align 4
  168. %lftr.wideiv13 = trunc i64 %indvars.iv.next12 to i32
  169. %exitcond14 = icmp eq i32 %lftr.wideiv13, %1
  170. br i1 %exitcond14, label %.preheader, label %.lr.ph6
  171. .lr.ph: ; preds = %.preheader, %.lr.ph
  172. %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %.preheader ]
  173. %18 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
  174. %19 = load i32, i32* %18, align 4
  175. %20 = icmp sgt i32 %19, 4
  176. %21 = select i1 %20, i32 4, i32 0
  177. %22 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %indvars.iv
  178. store i32 %21, i32* %22, align 4
  179. %indvars.iv.next = add i64 %indvars.iv, 1
  180. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  181. %exitcond = icmp eq i32 %lftr.wideiv, %1
  182. br i1 %exitcond, label %._crit_edge, label %.lr.ph
  183. ._crit_edge: ; preds = %.lr.ph10, %.preheader4, %.lr.ph, %.preheader
  184. ret void
  185. }
  186. ;CHECK-LABEL: @example8(
  187. ;CHECK: store <4 x i32>
  188. ;CHECK: ret void
  189. ;UNROLL-LABEL: @example8(
  190. ;UNROLL: store <4 x i32>
  191. ;UNROLL: store <4 x i32>
  192. ;UNROLL: store <4 x i32>
  193. ;UNROLL: store <4 x i32>
  194. ;UNROLL: ret void
  195. define void @example8(i32 %x) nounwind uwtable ssp {
  196. br label %.preheader
  197. .preheader: ; preds = %3, %0
  198. %indvars.iv3 = phi i64 [ 0, %0 ], [ %indvars.iv.next4, %3 ]
  199. br label %1
  200. ; <label>:1 ; preds = %1, %.preheader
  201. %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %1 ]
  202. %2 = getelementptr inbounds [32 x [1024 x i32]], [32 x [1024 x i32]]* @G, i64 0, i64 %indvars.iv3, i64 %indvars.iv
  203. store i32 %x, i32* %2, align 4
  204. %indvars.iv.next = add i64 %indvars.iv, 1
  205. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  206. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  207. br i1 %exitcond, label %3, label %1
  208. ; <label>:3 ; preds = %1
  209. %indvars.iv.next4 = add i64 %indvars.iv3, 1
  210. %lftr.wideiv5 = trunc i64 %indvars.iv.next4 to i32
  211. %exitcond6 = icmp eq i32 %lftr.wideiv5, 32
  212. br i1 %exitcond6, label %4, label %.preheader
  213. ; <label>:4 ; preds = %3
  214. ret void
  215. }
  216. ;CHECK-LABEL: @example9(
  217. ;CHECK: phi <4 x i32>
  218. ;CHECK: ret i32
  219. define i32 @example9() nounwind uwtable readonly ssp {
  220. br label %1
  221. ; <label>:1 ; preds = %1, %0
  222. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  223. %diff.01 = phi i32 [ 0, %0 ], [ %7, %1 ]
  224. %2 = getelementptr inbounds [1024 x i32], [1024 x i32]* @ub, i64 0, i64 %indvars.iv
  225. %3 = load i32, i32* %2, align 4
  226. %4 = getelementptr inbounds [1024 x i32], [1024 x i32]* @uc, i64 0, i64 %indvars.iv
  227. %5 = load i32, i32* %4, align 4
  228. %6 = add i32 %3, %diff.01
  229. %7 = sub i32 %6, %5
  230. %indvars.iv.next = add i64 %indvars.iv, 1
  231. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  232. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  233. br i1 %exitcond, label %8, label %1
  234. ; <label>:8 ; preds = %1
  235. ret i32 %7
  236. }
  237. ;CHECK-LABEL: @example10a(
  238. ;CHECK: load <4 x i32>
  239. ;CHECK: add nsw <4 x i32>
  240. ;CHECK: load <4 x i16>
  241. ;CHECK: add <4 x i16>
  242. ;CHECK: store <4 x i16>
  243. ;CHECK: ret void
  244. define void @example10a(i16* noalias nocapture %sa, i16* noalias nocapture %sb, i16* noalias nocapture %sc, i32* noalias nocapture %ia, i32* noalias nocapture %ib, i32* noalias nocapture %ic) nounwind uwtable ssp {
  245. br label %1
  246. ; <label>:1 ; preds = %1, %0
  247. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  248. %2 = getelementptr inbounds i32, i32* %ib, i64 %indvars.iv
  249. %3 = load i32, i32* %2, align 4
  250. %4 = getelementptr inbounds i32, i32* %ic, i64 %indvars.iv
  251. %5 = load i32, i32* %4, align 4
  252. %6 = add nsw i32 %5, %3
  253. %7 = getelementptr inbounds i32, i32* %ia, i64 %indvars.iv
  254. store i32 %6, i32* %7, align 4
  255. %8 = getelementptr inbounds i16, i16* %sb, i64 %indvars.iv
  256. %9 = load i16, i16* %8, align 2
  257. %10 = getelementptr inbounds i16, i16* %sc, i64 %indvars.iv
  258. %11 = load i16, i16* %10, align 2
  259. %12 = add i16 %11, %9
  260. %13 = getelementptr inbounds i16, i16* %sa, i64 %indvars.iv
  261. store i16 %12, i16* %13, align 2
  262. %indvars.iv.next = add i64 %indvars.iv, 1
  263. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  264. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  265. br i1 %exitcond, label %14, label %1
  266. ; <label>:14 ; preds = %1
  267. ret void
  268. }
  269. ;CHECK-LABEL: @example10b(
  270. ;CHECK: load <4 x i16>
  271. ;CHECK: sext <4 x i16>
  272. ;CHECK: store <4 x i32>
  273. ;CHECK: ret void
  274. define void @example10b(i16* noalias nocapture %sa, i16* noalias nocapture %sb, i16* noalias nocapture %sc, i32* noalias nocapture %ia, i32* noalias nocapture %ib, i32* noalias nocapture %ic) nounwind uwtable ssp {
  275. br label %1
  276. ; <label>:1 ; preds = %1, %0
  277. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  278. %2 = getelementptr inbounds i16, i16* %sb, i64 %indvars.iv
  279. %3 = load i16, i16* %2, align 2
  280. %4 = sext i16 %3 to i32
  281. %5 = getelementptr inbounds i32, i32* %ia, i64 %indvars.iv
  282. store i32 %4, i32* %5, align 4
  283. %indvars.iv.next = add i64 %indvars.iv, 1
  284. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  285. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  286. br i1 %exitcond, label %6, label %1
  287. ; <label>:6 ; preds = %1
  288. ret void
  289. }
  290. ;CHECK-LABEL: @example11(
  291. ;CHECK: load i32
  292. ;CHECK: load i32
  293. ;CHECK: load i32
  294. ;CHECK: load i32
  295. ;CHECK: insertelement
  296. ;CHECK: insertelement
  297. ;CHECK: insertelement
  298. ;CHECK: insertelement
  299. ;CHECK: ret void
  300. define void @example11() nounwind uwtable ssp {
  301. br label %1
  302. ; <label>:1 ; preds = %1, %0
  303. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  304. %2 = shl nsw i64 %indvars.iv, 1
  305. %3 = or i64 %2, 1
  306. %4 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %3
  307. %5 = load i32, i32* %4, align 4
  308. %6 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %3
  309. %7 = load i32, i32* %6, align 4
  310. %8 = mul nsw i32 %7, %5
  311. %9 = getelementptr inbounds [2048 x i32], [2048 x i32]* @b, i64 0, i64 %2
  312. %10 = load i32, i32* %9, align 8
  313. %11 = getelementptr inbounds [2048 x i32], [2048 x i32]* @c, i64 0, i64 %2
  314. %12 = load i32, i32* %11, align 8
  315. %13 = mul nsw i32 %12, %10
  316. %14 = sub nsw i32 %8, %13
  317. %15 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
  318. store i32 %14, i32* %15, align 4
  319. %16 = mul nsw i32 %7, %10
  320. %17 = mul nsw i32 %12, %5
  321. %18 = add nsw i32 %17, %16
  322. %19 = getelementptr inbounds [2048 x i32], [2048 x i32]* @d, i64 0, i64 %indvars.iv
  323. store i32 %18, i32* %19, align 4
  324. %indvars.iv.next = add i64 %indvars.iv, 1
  325. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  326. %exitcond = icmp eq i32 %lftr.wideiv, 512
  327. br i1 %exitcond, label %20, label %1
  328. ; <label>:20 ; preds = %1
  329. ret void
  330. }
  331. ;CHECK-LABEL: @example12(
  332. ;CHECK: trunc i64
  333. ;CHECK: store <4 x i32>
  334. ;CHECK: ret void
  335. define void @example12() nounwind uwtable ssp {
  336. br label %1
  337. ; <label>:1 ; preds = %1, %0
  338. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  339. %2 = getelementptr inbounds [2048 x i32], [2048 x i32]* @a, i64 0, i64 %indvars.iv
  340. %3 = trunc i64 %indvars.iv to i32
  341. store i32 %3, i32* %2, align 4
  342. %indvars.iv.next = add i64 %indvars.iv, 1
  343. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  344. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  345. br i1 %exitcond, label %4, label %1
  346. ; <label>:4 ; preds = %1
  347. ret void
  348. }
  349. ;CHECK-LABEL: @example13(
  350. ;CHECK: <4 x i32>
  351. ;CHECK: ret void
  352. define void @example13(i32** nocapture %A, i32** nocapture %B, i32* nocapture %out) nounwind uwtable ssp {
  353. br label %.preheader
  354. .preheader: ; preds = %14, %0
  355. %indvars.iv4 = phi i64 [ 0, %0 ], [ %indvars.iv.next5, %14 ]
  356. %1 = getelementptr inbounds i32*, i32** %A, i64 %indvars.iv4
  357. %2 = load i32*, i32** %1, align 8
  358. %3 = getelementptr inbounds i32*, i32** %B, i64 %indvars.iv4
  359. %4 = load i32*, i32** %3, align 8
  360. br label %5
  361. ; <label>:5 ; preds = %.preheader, %5
  362. %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %5 ]
  363. %diff.02 = phi i32 [ 0, %.preheader ], [ %11, %5 ]
  364. %6 = getelementptr inbounds i32, i32* %2, i64 %indvars.iv
  365. %7 = load i32, i32* %6, align 4
  366. %8 = getelementptr inbounds i32, i32* %4, i64 %indvars.iv
  367. %9 = load i32, i32* %8, align 4
  368. %10 = add i32 %7, %diff.02
  369. %11 = sub i32 %10, %9
  370. %indvars.iv.next = add i64 %indvars.iv, 8
  371. %12 = trunc i64 %indvars.iv.next to i32
  372. %13 = icmp slt i32 %12, 1024
  373. br i1 %13, label %5, label %14
  374. ; <label>:14 ; preds = %5
  375. %15 = getelementptr inbounds i32, i32* %out, i64 %indvars.iv4
  376. store i32 %11, i32* %15, align 4
  377. %indvars.iv.next5 = add i64 %indvars.iv4, 1
  378. %lftr.wideiv = trunc i64 %indvars.iv.next5 to i32
  379. %exitcond = icmp eq i32 %lftr.wideiv, 32
  380. br i1 %exitcond, label %16, label %.preheader
  381. ; <label>:16 ; preds = %14
  382. ret void
  383. }
  384. ; Can vectorize.
  385. ;CHECK-LABEL: @example14(
  386. ;CHECK: <4 x i32>
  387. ;CHECK: ret void
  388. define void @example14(i32** nocapture %in, i32** nocapture %coeff, i32* nocapture %out) nounwind uwtable ssp {
  389. .preheader3:
  390. br label %.preheader
  391. .preheader: ; preds = %11, %.preheader3
  392. %indvars.iv7 = phi i64 [ 0, %.preheader3 ], [ %indvars.iv.next8, %11 ]
  393. %sum.05 = phi i32 [ 0, %.preheader3 ], [ %10, %11 ]
  394. br label %0
  395. ; <label>:0 ; preds = %0, %.preheader
  396. %indvars.iv = phi i64 [ 0, %.preheader ], [ %indvars.iv.next, %0 ]
  397. %sum.12 = phi i32 [ %sum.05, %.preheader ], [ %10, %0 ]
  398. %1 = getelementptr inbounds i32*, i32** %in, i64 %indvars.iv
  399. %2 = load i32*, i32** %1, align 8
  400. %3 = getelementptr inbounds i32, i32* %2, i64 %indvars.iv7
  401. %4 = load i32, i32* %3, align 4
  402. %5 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv
  403. %6 = load i32*, i32** %5, align 8
  404. %7 = getelementptr inbounds i32, i32* %6, i64 %indvars.iv7
  405. %8 = load i32, i32* %7, align 4
  406. %9 = mul nsw i32 %8, %4
  407. %10 = add nsw i32 %9, %sum.12
  408. %indvars.iv.next = add i64 %indvars.iv, 1
  409. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  410. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  411. br i1 %exitcond, label %11, label %0
  412. ; <label>:11 ; preds = %0
  413. %indvars.iv.next8 = add i64 %indvars.iv7, 1
  414. %lftr.wideiv9 = trunc i64 %indvars.iv.next8 to i32
  415. %exitcond10 = icmp eq i32 %lftr.wideiv9, 32
  416. br i1 %exitcond10, label %.preheader3.1, label %.preheader
  417. .preheader3.1: ; preds = %11
  418. store i32 %10, i32* %out, align 4
  419. br label %.preheader.1
  420. .preheader.1: ; preds = %24, %.preheader3.1
  421. %indvars.iv7.1 = phi i64 [ 0, %.preheader3.1 ], [ %indvars.iv.next8.1, %24 ]
  422. %sum.05.1 = phi i32 [ 0, %.preheader3.1 ], [ %23, %24 ]
  423. br label %12
  424. ; <label>:12 ; preds = %12, %.preheader.1
  425. %indvars.iv.1 = phi i64 [ 0, %.preheader.1 ], [ %13, %12 ]
  426. %sum.12.1 = phi i32 [ %sum.05.1, %.preheader.1 ], [ %23, %12 ]
  427. %13 = add nsw i64 %indvars.iv.1, 1
  428. %14 = getelementptr inbounds i32*, i32** %in, i64 %13
  429. %15 = load i32*, i32** %14, align 8
  430. %16 = getelementptr inbounds i32, i32* %15, i64 %indvars.iv7.1
  431. %17 = load i32, i32* %16, align 4
  432. %18 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv.1
  433. %19 = load i32*, i32** %18, align 8
  434. %20 = getelementptr inbounds i32, i32* %19, i64 %indvars.iv7.1
  435. %21 = load i32, i32* %20, align 4
  436. %22 = mul nsw i32 %21, %17
  437. %23 = add nsw i32 %22, %sum.12.1
  438. %lftr.wideiv.1 = trunc i64 %13 to i32
  439. %exitcond.1 = icmp eq i32 %lftr.wideiv.1, 1024
  440. br i1 %exitcond.1, label %24, label %12
  441. ; <label>:24 ; preds = %12
  442. %indvars.iv.next8.1 = add i64 %indvars.iv7.1, 1
  443. %lftr.wideiv9.1 = trunc i64 %indvars.iv.next8.1 to i32
  444. %exitcond10.1 = icmp eq i32 %lftr.wideiv9.1, 32
  445. br i1 %exitcond10.1, label %.preheader3.2, label %.preheader.1
  446. .preheader3.2: ; preds = %24
  447. %25 = getelementptr inbounds i32, i32* %out, i64 1
  448. store i32 %23, i32* %25, align 4
  449. br label %.preheader.2
  450. .preheader.2: ; preds = %38, %.preheader3.2
  451. %indvars.iv7.2 = phi i64 [ 0, %.preheader3.2 ], [ %indvars.iv.next8.2, %38 ]
  452. %sum.05.2 = phi i32 [ 0, %.preheader3.2 ], [ %37, %38 ]
  453. br label %26
  454. ; <label>:26 ; preds = %26, %.preheader.2
  455. %indvars.iv.2 = phi i64 [ 0, %.preheader.2 ], [ %indvars.iv.next.2, %26 ]
  456. %sum.12.2 = phi i32 [ %sum.05.2, %.preheader.2 ], [ %37, %26 ]
  457. %27 = add nsw i64 %indvars.iv.2, 2
  458. %28 = getelementptr inbounds i32*, i32** %in, i64 %27
  459. %29 = load i32*, i32** %28, align 8
  460. %30 = getelementptr inbounds i32, i32* %29, i64 %indvars.iv7.2
  461. %31 = load i32, i32* %30, align 4
  462. %32 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv.2
  463. %33 = load i32*, i32** %32, align 8
  464. %34 = getelementptr inbounds i32, i32* %33, i64 %indvars.iv7.2
  465. %35 = load i32, i32* %34, align 4
  466. %36 = mul nsw i32 %35, %31
  467. %37 = add nsw i32 %36, %sum.12.2
  468. %indvars.iv.next.2 = add i64 %indvars.iv.2, 1
  469. %lftr.wideiv.2 = trunc i64 %indvars.iv.next.2 to i32
  470. %exitcond.2 = icmp eq i32 %lftr.wideiv.2, 1024
  471. br i1 %exitcond.2, label %38, label %26
  472. ; <label>:38 ; preds = %26
  473. %indvars.iv.next8.2 = add i64 %indvars.iv7.2, 1
  474. %lftr.wideiv9.2 = trunc i64 %indvars.iv.next8.2 to i32
  475. %exitcond10.2 = icmp eq i32 %lftr.wideiv9.2, 32
  476. br i1 %exitcond10.2, label %.preheader3.3, label %.preheader.2
  477. .preheader3.3: ; preds = %38
  478. %39 = getelementptr inbounds i32, i32* %out, i64 2
  479. store i32 %37, i32* %39, align 4
  480. br label %.preheader.3
  481. .preheader.3: ; preds = %52, %.preheader3.3
  482. %indvars.iv7.3 = phi i64 [ 0, %.preheader3.3 ], [ %indvars.iv.next8.3, %52 ]
  483. %sum.05.3 = phi i32 [ 0, %.preheader3.3 ], [ %51, %52 ]
  484. br label %40
  485. ; <label>:40 ; preds = %40, %.preheader.3
  486. %indvars.iv.3 = phi i64 [ 0, %.preheader.3 ], [ %indvars.iv.next.3, %40 ]
  487. %sum.12.3 = phi i32 [ %sum.05.3, %.preheader.3 ], [ %51, %40 ]
  488. %41 = add nsw i64 %indvars.iv.3, 3
  489. %42 = getelementptr inbounds i32*, i32** %in, i64 %41
  490. %43 = load i32*, i32** %42, align 8
  491. %44 = getelementptr inbounds i32, i32* %43, i64 %indvars.iv7.3
  492. %45 = load i32, i32* %44, align 4
  493. %46 = getelementptr inbounds i32*, i32** %coeff, i64 %indvars.iv.3
  494. %47 = load i32*, i32** %46, align 8
  495. %48 = getelementptr inbounds i32, i32* %47, i64 %indvars.iv7.3
  496. %49 = load i32, i32* %48, align 4
  497. %50 = mul nsw i32 %49, %45
  498. %51 = add nsw i32 %50, %sum.12.3
  499. %indvars.iv.next.3 = add i64 %indvars.iv.3, 1
  500. %lftr.wideiv.3 = trunc i64 %indvars.iv.next.3 to i32
  501. %exitcond.3 = icmp eq i32 %lftr.wideiv.3, 1024
  502. br i1 %exitcond.3, label %52, label %40
  503. ; <label>:52 ; preds = %40
  504. %indvars.iv.next8.3 = add i64 %indvars.iv7.3, 1
  505. %lftr.wideiv9.3 = trunc i64 %indvars.iv.next8.3 to i32
  506. %exitcond10.3 = icmp eq i32 %lftr.wideiv9.3, 32
  507. br i1 %exitcond10.3, label %53, label %.preheader.3
  508. ; <label>:53 ; preds = %52
  509. %54 = getelementptr inbounds i32, i32* %out, i64 3
  510. store i32 %51, i32* %54, align 4
  511. ret void
  512. }
  513. ;CHECK-LABEL: @example21(
  514. ;CHECK: load <4 x i32>
  515. ;CHECK: shufflevector {{.*}} <i32 3, i32 2, i32 1, i32 0>
  516. ;CHECK: ret i32
  517. define i32 @example21(i32* nocapture %b, i32 %n) nounwind uwtable readonly ssp {
  518. %1 = icmp sgt i32 %n, 0
  519. br i1 %1, label %.lr.ph, label %._crit_edge
  520. .lr.ph: ; preds = %0
  521. %2 = sext i32 %n to i64
  522. br label %3
  523. ; <label>:3 ; preds = %.lr.ph, %3
  524. %indvars.iv = phi i64 [ %2, %.lr.ph ], [ %indvars.iv.next, %3 ]
  525. %a.02 = phi i32 [ 0, %.lr.ph ], [ %6, %3 ]
  526. %indvars.iv.next = add i64 %indvars.iv, -1
  527. %4 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv.next
  528. %5 = load i32, i32* %4, align 4
  529. %6 = add nsw i32 %5, %a.02
  530. %7 = trunc i64 %indvars.iv.next to i32
  531. %8 = icmp sgt i32 %7, 0
  532. br i1 %8, label %3, label %._crit_edge
  533. ._crit_edge: ; preds = %3, %0
  534. %a.0.lcssa = phi i32 [ 0, %0 ], [ %6, %3 ]
  535. ret i32 %a.0.lcssa
  536. }
  537. ;CHECK-LABEL: @example23(
  538. ;CHECK: <4 x i32>
  539. ;CHECK: ret void
  540. define void @example23(i16* nocapture %src, i32* nocapture %dst) nounwind uwtable ssp {
  541. br label %1
  542. ; <label>:1 ; preds = %1, %0
  543. %.04 = phi i16* [ %src, %0 ], [ %2, %1 ]
  544. %.013 = phi i32* [ %dst, %0 ], [ %6, %1 ]
  545. %i.02 = phi i32 [ 0, %0 ], [ %7, %1 ]
  546. %2 = getelementptr inbounds i16, i16* %.04, i64 1
  547. %3 = load i16, i16* %.04, align 2
  548. %4 = zext i16 %3 to i32
  549. %5 = shl nuw nsw i32 %4, 7
  550. %6 = getelementptr inbounds i32, i32* %.013, i64 1
  551. store i32 %5, i32* %.013, align 4
  552. %7 = add nsw i32 %i.02, 1
  553. %exitcond = icmp eq i32 %7, 256
  554. br i1 %exitcond, label %8, label %1
  555. ; <label>:8 ; preds = %1
  556. ret void
  557. }
  558. ;CHECK-LABEL: @example24(
  559. ;CHECK: shufflevector <4 x i16>
  560. ;CHECK: ret void
  561. define void @example24(i16 signext %x, i16 signext %y) nounwind uwtable ssp {
  562. br label %1
  563. ; <label>:1 ; preds = %1, %0
  564. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  565. %2 = getelementptr inbounds [1024 x float], [1024 x float]* @fa, i64 0, i64 %indvars.iv
  566. %3 = load float, float* %2, align 4
  567. %4 = getelementptr inbounds [1024 x float], [1024 x float]* @fb, i64 0, i64 %indvars.iv
  568. %5 = load float, float* %4, align 4
  569. %6 = fcmp olt float %3, %5
  570. %x.y = select i1 %6, i16 %x, i16 %y
  571. %7 = sext i16 %x.y to i32
  572. %8 = getelementptr inbounds [1024 x i32], [1024 x i32]* @ic, i64 0, i64 %indvars.iv
  573. store i32 %7, i32* %8, align 4
  574. %indvars.iv.next = add i64 %indvars.iv, 1
  575. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  576. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  577. br i1 %exitcond, label %9, label %1
  578. ; <label>:9 ; preds = %1
  579. ret void
  580. }
  581. ;CHECK-LABEL: @example25(
  582. ;CHECK: and <4 x i1>
  583. ;CHECK: zext <4 x i1>
  584. ;CHECK: ret void
  585. define void @example25() nounwind uwtable ssp {
  586. br label %1
  587. ; <label>:1 ; preds = %1, %0
  588. %indvars.iv = phi i64 [ 0, %0 ], [ %indvars.iv.next, %1 ]
  589. %2 = getelementptr inbounds [1024 x float], [1024 x float]* @da, i64 0, i64 %indvars.iv
  590. %3 = load float, float* %2, align 4
  591. %4 = getelementptr inbounds [1024 x float], [1024 x float]* @db, i64 0, i64 %indvars.iv
  592. %5 = load float, float* %4, align 4
  593. %6 = fcmp olt float %3, %5
  594. %7 = getelementptr inbounds [1024 x float], [1024 x float]* @dc, i64 0, i64 %indvars.iv
  595. %8 = load float, float* %7, align 4
  596. %9 = getelementptr inbounds [1024 x float], [1024 x float]* @dd, i64 0, i64 %indvars.iv
  597. %10 = load float, float* %9, align 4
  598. %11 = fcmp olt float %8, %10
  599. %12 = and i1 %6, %11
  600. %13 = zext i1 %12 to i32
  601. %14 = getelementptr inbounds [1024 x i32], [1024 x i32]* @dj, i64 0, i64 %indvars.iv
  602. store i32 %13, i32* %14, align 4
  603. %indvars.iv.next = add i64 %indvars.iv, 1
  604. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  605. %exitcond = icmp eq i32 %lftr.wideiv, 1024
  606. br i1 %exitcond, label %15, label %1
  607. ; <label>:15 ; preds = %1
  608. ret void
  609. }