Coupled.ll 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
  2. ; ModuleID = 'Coupled.bc'
  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.6.0"
  5. ;; for (long int i = 0; i < 50; i++) {
  6. ;; A[i][i] = i;
  7. ;; *B++ = A[i + 10][i + 9];
  8. define void @couple0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  9. entry:
  10. br label %for.body
  11. ; CHECK: da analyze - none!
  12. ; CHECK: da analyze - none!
  13. ; CHECK: da analyze - confused!
  14. ; CHECK: da analyze - none!
  15. ; CHECK: da analyze - confused!
  16. ; CHECK: da analyze - none!
  17. for.body: ; preds = %entry, %for.body
  18. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  19. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  20. %conv = trunc i64 %i.02 to i32
  21. %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  22. store i32 %conv, i32* %arrayidx1, align 4
  23. %add = add nsw i64 %i.02, 9
  24. %add2 = add nsw i64 %i.02, 10
  25. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add2, i64 %add
  26. %0 = load i32, i32* %arrayidx4, align 4
  27. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  28. store i32 %0, i32* %B.addr.01, align 4
  29. %inc = add nsw i64 %i.02, 1
  30. %exitcond = icmp ne i64 %inc, 50
  31. br i1 %exitcond, label %for.body, label %for.end
  32. for.end: ; preds = %for.body
  33. ret void
  34. }
  35. ;; for (long int i = 0; i < 50; i++) {
  36. ;; A[i][i] = i;
  37. ;; *B++ = A[i + 9][i + 9];
  38. define void @couple1([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  39. entry:
  40. br label %for.body
  41. ; CHECK: da analyze - none!
  42. ; CHECK: da analyze - consistent flow [-9]!
  43. ; CHECK: da analyze - confused!
  44. ; CHECK: da analyze - none!
  45. ; CHECK: da analyze - confused!
  46. ; CHECK: da analyze - none!
  47. for.body: ; preds = %entry, %for.body
  48. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  49. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  50. %conv = trunc i64 %i.02 to i32
  51. %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  52. store i32 %conv, i32* %arrayidx1, align 4
  53. %add = add nsw i64 %i.02, 9
  54. %add2 = add nsw i64 %i.02, 9
  55. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add2, i64 %add
  56. %0 = load i32, i32* %arrayidx4, align 4
  57. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  58. store i32 %0, i32* %B.addr.01, align 4
  59. %inc = add nsw i64 %i.02, 1
  60. %exitcond = icmp ne i64 %inc, 50
  61. br i1 %exitcond, label %for.body, label %for.end
  62. for.end: ; preds = %for.body
  63. ret void
  64. }
  65. ;; for (long int i = 0; i < 50; i++) {
  66. ;; A[3*i - 6][3*i - 6] = i;
  67. ;; *B++ = A[i][i];
  68. define void @couple2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  69. entry:
  70. br label %for.body
  71. ; CHECK: da analyze - none!
  72. ; CHECK: da analyze - flow [*|<]!
  73. ; CHECK: da analyze - confused!
  74. ; CHECK: da analyze - none!
  75. ; CHECK: da analyze - confused!
  76. ; CHECK: da analyze - none!
  77. for.body: ; preds = %entry, %for.body
  78. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  79. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  80. %conv = trunc i64 %i.02 to i32
  81. %mul = mul nsw i64 %i.02, 3
  82. %sub = add nsw i64 %mul, -6
  83. %mul1 = mul nsw i64 %i.02, 3
  84. %sub2 = add nsw i64 %mul1, -6
  85. %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub2, i64 %sub
  86. store i32 %conv, i32* %arrayidx3, align 4
  87. %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  88. %0 = load i32, i32* %arrayidx5, align 4
  89. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  90. store i32 %0, i32* %B.addr.01, align 4
  91. %inc = add nsw i64 %i.02, 1
  92. %exitcond = icmp ne i64 %inc, 50
  93. br i1 %exitcond, label %for.body, label %for.end
  94. for.end: ; preds = %for.body
  95. ret void
  96. }
  97. ;; for (long int i = 0; i < 50; i++) {
  98. ;; A[3*i - 6][3*i - 5] = i;
  99. ;; *B++ = A[i][i];
  100. define void @couple3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  101. entry:
  102. br label %for.body
  103. ; CHECK: da analyze - none!
  104. ; CHECK: da analyze - none!
  105. ; CHECK: da analyze - confused!
  106. ; CHECK: da analyze - none!
  107. ; CHECK: da analyze - confused!
  108. ; CHECK: da analyze - none!
  109. for.body: ; preds = %entry, %for.body
  110. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  111. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  112. %conv = trunc i64 %i.02 to i32
  113. %mul = mul nsw i64 %i.02, 3
  114. %sub = add nsw i64 %mul, -5
  115. %mul1 = mul nsw i64 %i.02, 3
  116. %sub2 = add nsw i64 %mul1, -6
  117. %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub2, i64 %sub
  118. store i32 %conv, i32* %arrayidx3, align 4
  119. %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  120. %0 = load i32, i32* %arrayidx5, align 4
  121. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  122. store i32 %0, i32* %B.addr.01, align 4
  123. %inc = add nsw i64 %i.02, 1
  124. %exitcond = icmp ne i64 %inc, 50
  125. br i1 %exitcond, label %for.body, label %for.end
  126. for.end: ; preds = %for.body
  127. ret void
  128. }
  129. ;; for (long int i = 0; i < 50; i++) {
  130. ;; A[3*i - 6][3*i - n] = i;
  131. ;; *B++ = A[i][i];
  132. define void @couple4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  133. entry:
  134. br label %for.body
  135. ; CHECK: da analyze - none!
  136. ; CHECK: da analyze - flow [*|<]!
  137. ; CHECK: da analyze - confused!
  138. ; CHECK: da analyze - none!
  139. ; CHECK: da analyze - confused!
  140. ; CHECK: da analyze - none!
  141. for.body: ; preds = %entry, %for.body
  142. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  143. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  144. %conv = trunc i64 %i.02 to i32
  145. %mul = mul nsw i64 %i.02, 3
  146. %conv1 = sext i32 %n to i64
  147. %sub = sub nsw i64 %mul, %conv1
  148. %mul2 = mul nsw i64 %i.02, 3
  149. %sub3 = add nsw i64 %mul2, -6
  150. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub3, i64 %sub
  151. store i32 %conv, i32* %arrayidx4, align 4
  152. %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  153. %0 = load i32, i32* %arrayidx6, align 4
  154. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  155. store i32 %0, i32* %B.addr.01, align 4
  156. %inc = add nsw i64 %i.02, 1
  157. %exitcond = icmp ne i64 %inc, 50
  158. br i1 %exitcond, label %for.body, label %for.end
  159. for.end: ; preds = %for.body
  160. ret void
  161. }
  162. ;; for (long int i = 0; i < 50; i++) {
  163. ;; A[3*i - n + 1][3*i - n] = i;
  164. ;; *B++ = A[i][i];
  165. define void @couple5([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  166. entry:
  167. br label %for.body
  168. ; CHECK: da analyze - none!
  169. ; CHECK: da analyze - none!
  170. ; CHECK: da analyze - confused!
  171. ; CHECK: da analyze - none!
  172. ; CHECK: da analyze - confused!
  173. ; CHECK: da analyze - none!
  174. for.body: ; preds = %entry, %for.body
  175. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  176. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  177. %conv = trunc i64 %i.02 to i32
  178. %mul = mul nsw i64 %i.02, 3
  179. %conv1 = sext i32 %n to i64
  180. %sub = sub nsw i64 %mul, %conv1
  181. %mul2 = mul nsw i64 %i.02, 3
  182. %conv3 = sext i32 %n to i64
  183. %sub4 = sub nsw i64 %mul2, %conv3
  184. %add = add nsw i64 %sub4, 1
  185. %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add, i64 %sub
  186. store i32 %conv, i32* %arrayidx5, align 4
  187. %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  188. %0 = load i32, i32* %arrayidx7, align 4
  189. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  190. store i32 %0, i32* %B.addr.01, align 4
  191. %inc = add nsw i64 %i.02, 1
  192. %exitcond = icmp ne i64 %inc, 50
  193. br i1 %exitcond, label %for.body, label %for.end
  194. for.end: ; preds = %for.body
  195. ret void
  196. }
  197. ;; for (long int i = 0; i < 50; i++) {
  198. ;; A[i][3*i - 6] = i;
  199. ;; *B++ = A[i][i];
  200. define void @couple6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  201. entry:
  202. br label %for.body
  203. ; CHECK: da analyze - none!
  204. ; CHECK: da analyze - flow [=|<]!
  205. ; CHECK: da analyze - confused!
  206. ; CHECK: da analyze - none!
  207. ; CHECK: da analyze - confused!
  208. ; CHECK: da analyze - none!
  209. for.body: ; preds = %entry, %for.body
  210. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  211. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  212. %conv = trunc i64 %i.02 to i32
  213. %mul = mul nsw i64 %i.02, 3
  214. %sub = add nsw i64 %mul, -6
  215. %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %sub
  216. store i32 %conv, i32* %arrayidx1, align 4
  217. %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  218. %0 = load i32, i32* %arrayidx3, align 4
  219. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  220. store i32 %0, i32* %B.addr.01, align 4
  221. %inc = add nsw i64 %i.02, 1
  222. %exitcond = icmp ne i64 %inc, 50
  223. br i1 %exitcond, label %for.body, label %for.end
  224. for.end: ; preds = %for.body
  225. ret void
  226. }
  227. ;; for (long int i = 0; i < 50; i++) {
  228. ;; A[i][3*i - 5] = i;
  229. ;; *B++ = A[i][i];
  230. define void @couple7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  231. entry:
  232. br label %for.body
  233. ; CHECK: da analyze - none!
  234. ; CHECK: da analyze - none!
  235. ; CHECK: da analyze - confused!
  236. ; CHECK: da analyze - none!
  237. ; CHECK: da analyze - confused!
  238. ; CHECK: da analyze - none!
  239. for.body: ; preds = %entry, %for.body
  240. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  241. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  242. %conv = trunc i64 %i.02 to i32
  243. %mul = mul nsw i64 %i.02, 3
  244. %sub = add nsw i64 %mul, -5
  245. %arrayidx1 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %sub
  246. store i32 %conv, i32* %arrayidx1, align 4
  247. %arrayidx3 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  248. %0 = load i32, i32* %arrayidx3, align 4
  249. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  250. store i32 %0, i32* %B.addr.01, align 4
  251. %inc = add nsw i64 %i.02, 1
  252. %exitcond = icmp ne i64 %inc, 50
  253. br i1 %exitcond, label %for.body, label %for.end
  254. for.end: ; preds = %for.body
  255. ret void
  256. }
  257. ;; for (long int i = 0; i <= 15; i++) {
  258. ;; A[3*i - 18][3 - i] = i;
  259. ;; *B++ = A[i][i];
  260. define void @couple8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  261. entry:
  262. br label %for.body
  263. ; CHECK: da analyze - none!
  264. ; CHECK: da analyze - none!
  265. ; CHECK: da analyze - confused!
  266. ; CHECK: da analyze - none!
  267. ; CHECK: da analyze - confused!
  268. ; CHECK: da analyze - none!
  269. for.body: ; preds = %entry, %for.body
  270. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  271. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  272. %conv = trunc i64 %i.02 to i32
  273. %sub = sub nsw i64 3, %i.02
  274. %mul = mul nsw i64 %i.02, 3
  275. %sub1 = add nsw i64 %mul, -18
  276. %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
  277. store i32 %conv, i32* %arrayidx2, align 4
  278. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  279. %0 = load i32, i32* %arrayidx4, align 4
  280. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  281. store i32 %0, i32* %B.addr.01, align 4
  282. %inc = add nsw i64 %i.02, 1
  283. %exitcond = icmp ne i64 %inc, 16
  284. br i1 %exitcond, label %for.body, label %for.end
  285. for.end: ; preds = %for.body
  286. ret void
  287. }
  288. ;; for (long int i = 0; i <= 15; i++) {
  289. ;; A[3*i - 18][2 - i] = i;
  290. ;; *B++ = A[i][i];
  291. define void @couple9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  292. entry:
  293. br label %for.body
  294. ; CHECK: da analyze - none!
  295. ; CHECK: da analyze - none!
  296. ; CHECK: da analyze - confused!
  297. ; CHECK: da analyze - none!
  298. ; CHECK: da analyze - confused!
  299. ; CHECK: da analyze - none!
  300. for.body: ; preds = %entry, %for.body
  301. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  302. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  303. %conv = trunc i64 %i.02 to i32
  304. %sub = sub nsw i64 2, %i.02
  305. %mul = mul nsw i64 %i.02, 3
  306. %sub1 = add nsw i64 %mul, -18
  307. %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
  308. store i32 %conv, i32* %arrayidx2, align 4
  309. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  310. %0 = load i32, i32* %arrayidx4, align 4
  311. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  312. store i32 %0, i32* %B.addr.01, align 4
  313. %inc = add nsw i64 %i.02, 1
  314. %exitcond = icmp ne i64 %inc, 16
  315. br i1 %exitcond, label %for.body, label %for.end
  316. for.end: ; preds = %for.body
  317. ret void
  318. }
  319. ;; for (long int i = 0; i <= 15; i++) {
  320. ;; A[3*i - 18][6 - i] = i;
  321. ;; *B++ = A[i][i];
  322. define void @couple10([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  323. entry:
  324. br label %for.body
  325. ; CHECK: da analyze - none!
  326. ; CHECK: da analyze - flow [>] splitable!
  327. ; CHECK: da analyze - split level = 1, iteration = 3!
  328. ; CHECK: da analyze - confused!
  329. ; CHECK: da analyze - none!
  330. ; CHECK: da analyze - confused!
  331. ; CHECK: da analyze - none!
  332. for.body: ; preds = %entry, %for.body
  333. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  334. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  335. %conv = trunc i64 %i.02 to i32
  336. %sub = sub nsw i64 6, %i.02
  337. %mul = mul nsw i64 %i.02, 3
  338. %sub1 = add nsw i64 %mul, -18
  339. %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
  340. store i32 %conv, i32* %arrayidx2, align 4
  341. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  342. %0 = load i32, i32* %arrayidx4, align 4
  343. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  344. store i32 %0, i32* %B.addr.01, align 4
  345. %inc = add nsw i64 %i.02, 1
  346. %exitcond = icmp ne i64 %inc, 16
  347. br i1 %exitcond, label %for.body, label %for.end
  348. for.end: ; preds = %for.body
  349. ret void
  350. }
  351. ;; for (long int i = 0; i <= 15; i++) {
  352. ;; A[3*i - 18][18 - i] = i;
  353. ;; *B++ = A[i][i];
  354. define void @couple11([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  355. entry:
  356. br label %for.body
  357. ; CHECK: da analyze - none!
  358. ; CHECK: da analyze - flow [=|<] splitable!
  359. ; CHECK: da analyze - split level = 1, iteration = 9!
  360. ; CHECK: da analyze - confused!
  361. ; CHECK: da analyze - none!
  362. ; CHECK: da analyze - confused!
  363. ; CHECK: da analyze - none!
  364. for.body: ; preds = %entry, %for.body
  365. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  366. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  367. %conv = trunc i64 %i.02 to i32
  368. %sub = sub nsw i64 18, %i.02
  369. %mul = mul nsw i64 %i.02, 3
  370. %sub1 = add nsw i64 %mul, -18
  371. %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
  372. store i32 %conv, i32* %arrayidx2, align 4
  373. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  374. %0 = load i32, i32* %arrayidx4, align 4
  375. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  376. store i32 %0, i32* %B.addr.01, align 4
  377. %inc = add nsw i64 %i.02, 1
  378. %exitcond = icmp ne i64 %inc, 16
  379. br i1 %exitcond, label %for.body, label %for.end
  380. for.end: ; preds = %for.body
  381. ret void
  382. }
  383. ;; for (long int i = 0; i <= 12; i++) {
  384. ;; A[3*i - 18][22 - i] = i;
  385. ;; *B++ = A[i][i];
  386. define void @couple12([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  387. entry:
  388. br label %for.body
  389. ; CHECK: da analyze - none!
  390. ; CHECK: da analyze - flow [<] splitable!
  391. ; CHECK: da analyze - split level = 1, iteration = 11!
  392. ; CHECK: da analyze - confused!
  393. ; CHECK: da analyze - none!
  394. ; CHECK: da analyze - confused!
  395. ; CHECK: da analyze - none!
  396. for.body: ; preds = %entry, %for.body
  397. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  398. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  399. %conv = trunc i64 %i.02 to i32
  400. %sub = sub nsw i64 22, %i.02
  401. %mul = mul nsw i64 %i.02, 3
  402. %sub1 = add nsw i64 %mul, -18
  403. %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
  404. store i32 %conv, i32* %arrayidx2, align 4
  405. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  406. %0 = load i32, i32* %arrayidx4, align 4
  407. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  408. store i32 %0, i32* %B.addr.01, align 4
  409. %inc = add nsw i64 %i.02, 1
  410. %exitcond = icmp ne i64 %inc, 13
  411. br i1 %exitcond, label %for.body, label %for.end
  412. for.end: ; preds = %for.body
  413. ret void
  414. }
  415. ;; for (long int i = 0; i < 12; i++) {
  416. ;; A[3*i - 18][22 - i] = i;
  417. ;; *B++ = A[i][i];
  418. define void @couple13([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  419. entry:
  420. br label %for.body
  421. ; CHECK: da analyze - none!
  422. ; CHECK: da analyze - none!
  423. ; CHECK: da analyze - confused!
  424. ; CHECK: da analyze - none!
  425. ; CHECK: da analyze - confused!
  426. ; CHECK: da analyze - none!
  427. for.body: ; preds = %entry, %for.body
  428. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  429. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  430. %conv = trunc i64 %i.02 to i32
  431. %sub = sub nsw i64 22, %i.02
  432. %mul = mul nsw i64 %i.02, 3
  433. %sub1 = add nsw i64 %mul, -18
  434. %arrayidx2 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub1, i64 %sub
  435. store i32 %conv, i32* %arrayidx2, align 4
  436. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.02, i64 %i.02
  437. %0 = load i32, i32* %arrayidx4, align 4
  438. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  439. store i32 %0, i32* %B.addr.01, align 4
  440. %inc = add nsw i64 %i.02, 1
  441. %exitcond = icmp ne i64 %inc, 12
  442. br i1 %exitcond, label %for.body, label %for.end
  443. for.end: ; preds = %for.body
  444. ret void
  445. }
  446. ;; for (long int i = 0; i < 100; i++) {
  447. ;; A[3*i - 18][18 - i][i] = i;
  448. ;; *B++ = A[i][i][i];
  449. define void @couple14([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  450. entry:
  451. br label %for.body
  452. ; CHECK: da analyze - none!
  453. ; CHECK: da analyze - flow [=|<] splitable!
  454. ; CHECK: da analyze - split level = 1, iteration = 9!
  455. ; CHECK: da analyze - confused!
  456. ; CHECK: da analyze - none!
  457. ; CHECK: da analyze - confused!
  458. ; CHECK: da analyze - none!
  459. for.body: ; preds = %entry, %for.body
  460. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  461. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  462. %conv = trunc i64 %i.02 to i32
  463. %sub = sub nsw i64 18, %i.02
  464. %mul = mul nsw i64 %i.02, 3
  465. %sub1 = add nsw i64 %mul, -18
  466. %arrayidx3 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub1, i64 %sub, i64 %i.02
  467. store i32 %conv, i32* %arrayidx3, align 4
  468. %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02
  469. %0 = load i32, i32* %arrayidx6, align 4
  470. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  471. store i32 %0, i32* %B.addr.01, align 4
  472. %inc = add nsw i64 %i.02, 1
  473. %exitcond = icmp ne i64 %inc, 100
  474. br i1 %exitcond, label %for.body, label %for.end
  475. for.end: ; preds = %for.body
  476. ret void
  477. }
  478. ;; for (long int i = 0; i < 100; i++) {
  479. ;; A[3*i - 18][22 - i][i] = i;
  480. ;; *B++ = A[i][i][i];
  481. define void @couple15([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  482. entry:
  483. br label %for.body
  484. ; CHECK: da analyze - none!
  485. ; CHECK: da analyze - none!
  486. ; CHECK: da analyze - confused!
  487. ; CHECK: da analyze - none!
  488. ; CHECK: da analyze - confused!
  489. ; CHECK: da analyze - none!
  490. for.body: ; preds = %entry, %for.body
  491. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  492. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  493. %conv = trunc i64 %i.02 to i32
  494. %sub = sub nsw i64 22, %i.02
  495. %mul = mul nsw i64 %i.02, 3
  496. %sub1 = add nsw i64 %mul, -18
  497. %arrayidx3 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub1, i64 %sub, i64 %i.02
  498. store i32 %conv, i32* %arrayidx3, align 4
  499. %arrayidx6 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.02, i64 %i.02, i64 %i.02
  500. %0 = load i32, i32* %arrayidx6, align 4
  501. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  502. store i32 %0, i32* %B.addr.01, align 4
  503. %inc = add nsw i64 %i.02, 1
  504. %exitcond = icmp ne i64 %inc, 100
  505. br i1 %exitcond, label %for.body, label %for.end
  506. for.end: ; preds = %for.body
  507. ret void
  508. }