ExactRDIV.ll 21 KB

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