Propagating.ll 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
  2. ; ModuleID = 'Propagating.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 < 100; i++)
  6. ;; for (long int j = 0; j < 100; j++) {
  7. ;; A[i + 1][i + j] = i;
  8. ;; *B++ = A[i][i + j];
  9. define void @prop0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  10. entry:
  11. br label %for.cond1.preheader
  12. ; CHECK: da analyze - none!
  13. ; CHECK: da analyze - consistent flow [1 -1]!
  14. ; CHECK: da analyze - confused!
  15. ; CHECK: da analyze - none!
  16. ; CHECK: da analyze - confused!
  17. ; CHECK: da analyze - none!
  18. for.cond1.preheader: ; preds = %entry, %for.inc9
  19. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
  20. %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
  21. br label %for.body3
  22. for.body3: ; preds = %for.cond1.preheader, %for.body3
  23. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  24. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  25. %conv = trunc i64 %i.03 to i32
  26. %add = add nsw i64 %i.03, %j.02
  27. %add4 = add nsw i64 %i.03, 1
  28. %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add4, i64 %add
  29. store i32 %conv, i32* %arrayidx5, align 4
  30. %add6 = add nsw i64 %i.03, %j.02
  31. %arrayidx8 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add6
  32. %0 = load i32, i32* %arrayidx8, align 4
  33. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  34. store i32 %0, i32* %B.addr.11, align 4
  35. %inc = add nsw i64 %j.02, 1
  36. %exitcond = icmp ne i64 %inc, 100
  37. br i1 %exitcond, label %for.body3, label %for.inc9
  38. for.inc9: ; preds = %for.body3
  39. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  40. %inc10 = add nsw i64 %i.03, 1
  41. %exitcond5 = icmp ne i64 %inc10, 100
  42. br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
  43. for.end11: ; preds = %for.inc9
  44. ret void
  45. }
  46. ;; for (long int i = 0; i < 100; i++)
  47. ;; for (long int j = 0; j < 100; j++)
  48. ;; for (long int k = 0; k < 100; k++) {
  49. ;; A[j - i][i + 1][j + k] = i;
  50. ;; *B++ = A[j - i][i][j + k];
  51. define void @prop1([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  52. entry:
  53. br label %for.cond1.preheader
  54. ; CHECK: da analyze - none!
  55. ; CHECK: da analyze - consistent flow [1 1 -1]!
  56. ; CHECK: da analyze - confused!
  57. ; CHECK: da analyze - none!
  58. ; CHECK: da analyze - confused!
  59. ; CHECK: da analyze - none!
  60. for.cond1.preheader: ; preds = %entry, %for.inc18
  61. %B.addr.06 = phi i32* [ %B, %entry ], [ %scevgep7, %for.inc18 ]
  62. %i.05 = phi i64 [ 0, %entry ], [ %inc19, %for.inc18 ]
  63. br label %for.cond4.preheader
  64. for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc15
  65. %B.addr.14 = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc15 ]
  66. %j.03 = phi i64 [ 0, %for.cond1.preheader ], [ %inc16, %for.inc15 ]
  67. br label %for.body6
  68. for.body6: ; preds = %for.cond4.preheader, %for.body6
  69. %k.02 = phi i64 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ]
  70. %B.addr.21 = phi i32* [ %B.addr.14, %for.cond4.preheader ], [ %incdec.ptr, %for.body6 ]
  71. %conv = trunc i64 %i.05 to i32
  72. %add = add nsw i64 %j.03, %k.02
  73. %add7 = add nsw i64 %i.05, 1
  74. %sub = sub nsw i64 %j.03, %i.05
  75. %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub, i64 %add7, i64 %add
  76. store i32 %conv, i32* %arrayidx9, align 4
  77. %add10 = add nsw i64 %j.03, %k.02
  78. %sub11 = sub nsw i64 %j.03, %i.05
  79. %arrayidx14 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub11, i64 %i.05, i64 %add10
  80. %0 = load i32, i32* %arrayidx14, align 4
  81. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.21, i64 1
  82. store i32 %0, i32* %B.addr.21, align 4
  83. %inc = add nsw i64 %k.02, 1
  84. %exitcond = icmp ne i64 %inc, 100
  85. br i1 %exitcond, label %for.body6, label %for.inc15
  86. for.inc15: ; preds = %for.body6
  87. %scevgep = getelementptr i32, i32* %B.addr.14, i64 100
  88. %inc16 = add nsw i64 %j.03, 1
  89. %exitcond8 = icmp ne i64 %inc16, 100
  90. br i1 %exitcond8, label %for.cond4.preheader, label %for.inc18
  91. for.inc18: ; preds = %for.inc15
  92. %scevgep7 = getelementptr i32, i32* %B.addr.06, i64 10000
  93. %inc19 = add nsw i64 %i.05, 1
  94. %exitcond9 = icmp ne i64 %inc19, 100
  95. br i1 %exitcond9, label %for.cond1.preheader, label %for.end20
  96. for.end20: ; preds = %for.inc18
  97. ret void
  98. }
  99. ;; for (long int i = 0; i < 100; i++)
  100. ;; for (long int j = 0; j < 100; j++) {
  101. ;; A[i - 1][2*i] = i;
  102. ;; *B++ = A[i][i + j + 110];
  103. define void @prop2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  104. entry:
  105. br label %for.cond1.preheader
  106. ; CHECK: da analyze - consistent output [0 S]!
  107. ; CHECK: da analyze - none!
  108. ; CHECK: da analyze - confused!
  109. ; CHECK: da analyze - none!
  110. ; CHECK: da analyze - confused!
  111. ; CHECK: da analyze - none!
  112. for.cond1.preheader: ; preds = %entry, %for.inc8
  113. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
  114. %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
  115. br label %for.body3
  116. for.body3: ; preds = %for.cond1.preheader, %for.body3
  117. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  118. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  119. %conv = trunc i64 %i.03 to i32
  120. %mul = shl nsw i64 %i.03, 1
  121. %sub = add nsw i64 %i.03, -1
  122. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub, i64 %mul
  123. store i32 %conv, i32* %arrayidx4, align 4
  124. %add = add nsw i64 %i.03, %j.02
  125. %add5 = add nsw i64 %add, 110
  126. %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add5
  127. %0 = load i32, i32* %arrayidx7, align 4
  128. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  129. store i32 %0, i32* %B.addr.11, align 4
  130. %inc = add nsw i64 %j.02, 1
  131. %exitcond = icmp ne i64 %inc, 100
  132. br i1 %exitcond, label %for.body3, label %for.inc8
  133. for.inc8: ; preds = %for.body3
  134. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  135. %inc9 = add nsw i64 %i.03, 1
  136. %exitcond5 = icmp ne i64 %inc9, 100
  137. br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
  138. for.end10: ; preds = %for.inc8
  139. ret void
  140. }
  141. ;; for (long int i = 0; i < 100; i++)
  142. ;; for (long int j = 0; j < 100; j++) {
  143. ;; A[i][2*j + i] = i;
  144. ;; *B++ = A[i][2*j - i + 5];
  145. define void @prop3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  146. entry:
  147. br label %for.cond1.preheader
  148. ; CHECK: da analyze - none!
  149. ; CHECK: da analyze - none!
  150. ; CHECK: da analyze - confused!
  151. ; CHECK: da analyze - none!
  152. ; CHECK: da analyze - confused!
  153. ; CHECK: da analyze - none!
  154. for.cond1.preheader: ; preds = %entry, %for.inc9
  155. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
  156. %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
  157. br label %for.body3
  158. for.body3: ; preds = %for.cond1.preheader, %for.body3
  159. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  160. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  161. %conv = trunc i64 %i.03 to i32
  162. %mul = shl nsw i64 %j.02, 1
  163. %add = add nsw i64 %mul, %i.03
  164. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add
  165. store i32 %conv, i32* %arrayidx4, align 4
  166. %mul5 = shl nsw i64 %j.02, 1
  167. %sub = sub nsw i64 %mul5, %i.03
  168. %add6 = add nsw i64 %sub, 5
  169. %arrayidx8 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add6
  170. %0 = load i32, i32* %arrayidx8, align 4
  171. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  172. store i32 %0, i32* %B.addr.11, align 4
  173. %inc = add nsw i64 %j.02, 1
  174. %exitcond = icmp ne i64 %inc, 100
  175. br i1 %exitcond, label %for.body3, label %for.inc9
  176. for.inc9: ; preds = %for.body3
  177. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  178. %inc10 = add nsw i64 %i.03, 1
  179. %exitcond5 = icmp ne i64 %inc10, 100
  180. br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
  181. for.end11: ; preds = %for.inc9
  182. ret void
  183. }
  184. ;; for (long int i = 0; i < 100; i++)
  185. ;; for (long int j = 0; j < 100; j++) {
  186. ;; A[i + 2][2*i + j + 1] = i;
  187. ;; *B++ = A[i][2*i + j];
  188. define void @prop4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  189. entry:
  190. br label %for.cond1.preheader
  191. ; CHECK: da analyze - none!
  192. ; CHECK: da analyze - consistent flow [2 -3]!
  193. ; CHECK: da analyze - confused!
  194. ; CHECK: da analyze - none!
  195. ; CHECK: da analyze - confused!
  196. ; CHECK: da analyze - none!
  197. for.cond1.preheader: ; preds = %entry, %for.inc11
  198. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc11 ]
  199. %i.03 = phi i64 [ 0, %entry ], [ %inc12, %for.inc11 ]
  200. br label %for.body3
  201. for.body3: ; preds = %for.cond1.preheader, %for.body3
  202. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  203. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  204. %conv = trunc i64 %i.03 to i32
  205. %mul = shl nsw i64 %i.03, 1
  206. %add = add nsw i64 %mul, %j.02
  207. %add4 = add nsw i64 %add, 1
  208. %add5 = add nsw i64 %i.03, 2
  209. %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add5, i64 %add4
  210. store i32 %conv, i32* %arrayidx6, align 4
  211. %mul7 = shl nsw i64 %i.03, 1
  212. %add8 = add nsw i64 %mul7, %j.02
  213. %arrayidx10 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add8
  214. %0 = load i32, i32* %arrayidx10, align 4
  215. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  216. store i32 %0, i32* %B.addr.11, align 4
  217. %inc = add nsw i64 %j.02, 1
  218. %exitcond = icmp ne i64 %inc, 100
  219. br i1 %exitcond, label %for.body3, label %for.inc11
  220. for.inc11: ; preds = %for.body3
  221. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  222. %inc12 = add nsw i64 %i.03, 1
  223. %exitcond5 = icmp ne i64 %inc12, 100
  224. br i1 %exitcond5, label %for.cond1.preheader, label %for.end13
  225. for.end13: ; preds = %for.inc11
  226. ret void
  227. }
  228. ;; for (long int i = 0; i < 100; i++)
  229. ;; for (long int j = 0; j < 100; j++) {
  230. ;; A[3*i - 18][22 - i][2*i + j] = i;
  231. ;; *B++ = A[i][i][3*i + j];
  232. define void @prop5([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  233. entry:
  234. br label %for.cond1.preheader
  235. ; CHECK: da analyze - none!
  236. ; CHECK: da analyze - flow [< -16] splitable!
  237. ; CHECK: da analyze - split level = 1, iteration = 11!
  238. ; CHECK: da analyze - confused!
  239. ; CHECK: da analyze - none!
  240. ; CHECK: da analyze - confused!
  241. ; CHECK: da analyze - none!
  242. for.cond1.preheader: ; preds = %entry, %for.inc13
  243. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc13 ]
  244. %i.03 = phi i64 [ 0, %entry ], [ %inc14, %for.inc13 ]
  245. br label %for.body3
  246. for.body3: ; preds = %for.cond1.preheader, %for.body3
  247. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  248. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  249. %conv = trunc i64 %i.03 to i32
  250. %mul = shl nsw i64 %i.03, 1
  251. %add = add nsw i64 %mul, %j.02
  252. %sub = sub nsw i64 22, %i.03
  253. %mul4 = mul nsw i64 %i.03, 3
  254. %sub5 = add nsw i64 %mul4, -18
  255. %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub5, i64 %sub, i64 %add
  256. store i32 %conv, i32* %arrayidx7, align 4
  257. %mul8 = mul nsw i64 %i.03, 3
  258. %add9 = add nsw i64 %mul8, %j.02
  259. %arrayidx12 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.03, i64 %i.03, i64 %add9
  260. %0 = load i32, i32* %arrayidx12, align 4
  261. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  262. store i32 %0, i32* %B.addr.11, align 4
  263. %inc = add nsw i64 %j.02, 1
  264. %exitcond = icmp ne i64 %inc, 100
  265. br i1 %exitcond, label %for.body3, label %for.inc13
  266. for.inc13: ; preds = %for.body3
  267. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  268. %inc14 = add nsw i64 %i.03, 1
  269. %exitcond5 = icmp ne i64 %inc14, 100
  270. br i1 %exitcond5, label %for.cond1.preheader, label %for.end15
  271. for.end15: ; preds = %for.inc13
  272. ret void
  273. }
  274. ;; for (long int i = 0; i < 100; i++)
  275. ;; for (long int j = 0; j < 100; j++) {
  276. ;; A[i + 1][4*i + j + 2] = i;
  277. ;; *B++ = A[2*i][8*i + j];
  278. define void @prop6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  279. entry:
  280. br label %for.cond1.preheader
  281. ; CHECK: da analyze - none!
  282. ; CHECK: da analyze - flow [=> -2]!
  283. ; CHECK: da analyze - confused!
  284. ; CHECK: da analyze - none!
  285. ; CHECK: da analyze - confused!
  286. ; CHECK: da analyze - none!
  287. for.cond1.preheader: ; preds = %entry, %for.inc12
  288. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc12 ]
  289. %i.03 = phi i64 [ 0, %entry ], [ %inc13, %for.inc12 ]
  290. br label %for.body3
  291. for.body3: ; preds = %for.cond1.preheader, %for.body3
  292. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  293. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  294. %conv = trunc i64 %i.03 to i32
  295. %mul = shl nsw i64 %i.03, 2
  296. %add = add nsw i64 %mul, %j.02
  297. %add4 = add nsw i64 %add, 2
  298. %add5 = add nsw i64 %i.03, 1
  299. %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add5, i64 %add4
  300. store i32 %conv, i32* %arrayidx6, align 4
  301. %mul7 = shl nsw i64 %i.03, 3
  302. %add8 = add nsw i64 %mul7, %j.02
  303. %mul9 = shl nsw i64 %i.03, 1
  304. %arrayidx11 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %mul9, i64 %add8
  305. %0 = load i32, i32* %arrayidx11, align 4
  306. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  307. store i32 %0, i32* %B.addr.11, align 4
  308. %inc = add nsw i64 %j.02, 1
  309. %exitcond = icmp ne i64 %inc, 100
  310. br i1 %exitcond, label %for.body3, label %for.inc12
  311. for.inc12: ; preds = %for.body3
  312. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  313. %inc13 = add nsw i64 %i.03, 1
  314. %exitcond5 = icmp ne i64 %inc13, 100
  315. br i1 %exitcond5, label %for.cond1.preheader, label %for.end14
  316. for.end14: ; preds = %for.inc12
  317. ret void
  318. }
  319. ;; for (long int i = 0; i < 100; i++)
  320. ;; for (long int j = 0; j < 100; j++) {
  321. ;; A[2*i + 4][-5*i + j + 2] = i;
  322. ;; *B++ = A[-2*i + 20][5*i + j];
  323. define void @prop7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  324. entry:
  325. br label %for.cond1.preheader
  326. ; CHECK: da analyze - none!
  327. ; CHECK: da analyze - flow [* -38] splitable!
  328. ; CHECK: da analyze - split level = 1, iteration = 4!
  329. ; CHECK: da analyze - confused!
  330. ; CHECK: da analyze - none!
  331. ; CHECK: da analyze - confused!
  332. ; CHECK: da analyze - none!
  333. for.cond1.preheader: ; preds = %entry, %for.inc14
  334. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc14 ]
  335. %i.03 = phi i64 [ 0, %entry ], [ %inc15, %for.inc14 ]
  336. br label %for.body3
  337. for.body3: ; preds = %for.cond1.preheader, %for.body3
  338. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  339. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  340. %conv = trunc i64 %i.03 to i32
  341. %mul = mul nsw i64 %i.03, -5
  342. %add = add nsw i64 %mul, %j.02
  343. %add4 = add nsw i64 %add, 2
  344. %mul5 = shl nsw i64 %i.03, 1
  345. %add6 = add nsw i64 %mul5, 4
  346. %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add6, i64 %add4
  347. store i32 %conv, i32* %arrayidx7, align 4
  348. %mul8 = mul nsw i64 %i.03, 5
  349. %add9 = add nsw i64 %mul8, %j.02
  350. %mul10 = mul nsw i64 %i.03, -2
  351. %add11 = add nsw i64 %mul10, 20
  352. %arrayidx13 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add11, i64 %add9
  353. %0 = load i32, i32* %arrayidx13, align 4
  354. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  355. store i32 %0, i32* %B.addr.11, align 4
  356. %inc = add nsw i64 %j.02, 1
  357. %exitcond = icmp ne i64 %inc, 100
  358. br i1 %exitcond, label %for.body3, label %for.inc14
  359. for.inc14: ; preds = %for.body3
  360. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  361. %inc15 = add nsw i64 %i.03, 1
  362. %exitcond5 = icmp ne i64 %inc15, 100
  363. br i1 %exitcond5, label %for.cond1.preheader, label %for.end16
  364. for.end16: ; preds = %for.inc14
  365. ret void
  366. }
  367. ;; for (long int i = 0; i < 100; i++)
  368. ;; for (long int j = 0; j < 100; j++) {
  369. ;; A[4][j + 2] = i;
  370. ;; *B++ = A[-2*i + 4][5*i + j];
  371. define void @prop8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  372. entry:
  373. br label %for.cond1.preheader
  374. ; CHECK: da analyze - consistent output [S 0]!
  375. ; CHECK: da analyze - flow [p<= 2]!
  376. ; CHECK: da analyze - confused!
  377. ; CHECK: da analyze - none!
  378. ; CHECK: da analyze - confused!
  379. ; CHECK: da analyze - none!
  380. for.cond1.preheader: ; preds = %entry, %for.inc10
  381. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ]
  382. %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]
  383. br label %for.body3
  384. for.body3: ; preds = %for.cond1.preheader, %for.body3
  385. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  386. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  387. %conv = trunc i64 %i.03 to i32
  388. %add = add nsw i64 %j.02, 2
  389. %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 4, i64 %add
  390. store i32 %conv, i32* %arrayidx4, align 4
  391. %mul = mul nsw i64 %i.03, 5
  392. %add5 = add nsw i64 %mul, %j.02
  393. %mul6 = mul nsw i64 %i.03, -2
  394. %add7 = add nsw i64 %mul6, 4
  395. %arrayidx9 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add7, i64 %add5
  396. %0 = load i32, i32* %arrayidx9, align 4
  397. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  398. store i32 %0, i32* %B.addr.11, align 4
  399. %inc = add nsw i64 %j.02, 1
  400. %exitcond = icmp ne i64 %inc, 100
  401. br i1 %exitcond, label %for.body3, label %for.inc10
  402. for.inc10: ; preds = %for.body3
  403. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  404. %inc11 = add nsw i64 %i.03, 1
  405. %exitcond5 = icmp ne i64 %inc11, 100
  406. br i1 %exitcond5, label %for.cond1.preheader, label %for.end12
  407. for.end12: ; preds = %for.inc10
  408. ret void
  409. }
  410. ;; for (long int i = 0; i < 100; i++)
  411. ;; for (long int j = 0; j < 100; j++) {
  412. ;; A[2*i + 4][5*i + j + 2] = i;
  413. ;; *B++ = A[4][j];
  414. define void @prop9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
  415. entry:
  416. br label %for.cond1.preheader
  417. ; CHECK: da analyze - none!
  418. ; CHECK: da analyze - flow [p<= 2]!
  419. ; CHECK: da analyze - confused!
  420. ; CHECK: da analyze - consistent input [S 0]!
  421. ; CHECK: da analyze - confused!
  422. ; CHECK: da analyze - none!
  423. for.cond1.preheader: ; preds = %entry, %for.inc10
  424. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ]
  425. %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]
  426. br label %for.body3
  427. for.body3: ; preds = %for.cond1.preheader, %for.body3
  428. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  429. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  430. %conv = trunc i64 %i.03 to i32
  431. %mul = mul nsw i64 %i.03, 5
  432. %add = add nsw i64 %mul, %j.02
  433. %add4 = add nsw i64 %add, 2
  434. %mul5 = shl nsw i64 %i.03, 1
  435. %add6 = add nsw i64 %mul5, 4
  436. %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add6, i64 %add4
  437. store i32 %conv, i32* %arrayidx7, align 4
  438. %arrayidx9 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 4, i64 %j.02
  439. %0 = load i32, i32* %arrayidx9, align 4
  440. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  441. store i32 %0, i32* %B.addr.11, align 4
  442. %inc = add nsw i64 %j.02, 1
  443. %exitcond = icmp ne i64 %inc, 100
  444. br i1 %exitcond, label %for.body3, label %for.inc10
  445. for.inc10: ; preds = %for.body3
  446. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  447. %inc11 = add nsw i64 %i.03, 1
  448. %exitcond5 = icmp ne i64 %inc11, 100
  449. br i1 %exitcond5, label %for.cond1.preheader, label %for.end12
  450. for.end12: ; preds = %for.inc10
  451. ret void
  452. }