GCD.ll 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. ; RUN: opt < %s -analyze -basicaa -da -da-delinearize=false | FileCheck %s
  2. ; RUN: opt < %s -analyze -basicaa -da -da-delinearize | FileCheck %s -check-prefix=DELIN
  3. ; ModuleID = 'GCD.bc'
  4. 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"
  5. target triple = "x86_64-apple-macosx10.6.0"
  6. ;; for (long int i = 0; i < 100; i++)
  7. ;; for (long int j = 0; j < 100; j++) {
  8. ;; A[2*i - 4*j] = i;
  9. ;; *B++ = A[6*i + 8*j];
  10. define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
  11. entry:
  12. br label %for.cond1.preheader
  13. ; CHECK: 'Dependence Analysis' for function 'gcd0'
  14. ; CHECK: da analyze - output [* *]!
  15. ; CHECK: da analyze - flow [=> *|<]!
  16. ; CHECK: da analyze - confused!
  17. ; CHECK: da analyze - input [* *]!
  18. ; CHECK: da analyze - confused!
  19. ; CHECK: da analyze - none!
  20. ; DELIN: 'Dependence Analysis' for function 'gcd0'
  21. ; DELIN: da analyze - output [* *]!
  22. ; DELIN: da analyze - flow [=> *|<]!
  23. ; DELIN: da analyze - confused!
  24. ; DELIN: da analyze - input [* *]!
  25. ; DELIN: da analyze - confused!
  26. ; DELIN: da analyze - none!
  27. for.cond1.preheader: ; preds = %entry, %for.inc8
  28. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
  29. %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
  30. br label %for.body3
  31. for.body3: ; preds = %for.cond1.preheader, %for.body3
  32. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  33. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  34. %conv = trunc i64 %i.03 to i32
  35. %mul = shl nsw i64 %i.03, 1
  36. %mul4 = shl nsw i64 %j.02, 2
  37. %sub = sub nsw i64 %mul, %mul4
  38. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
  39. store i32 %conv, i32* %arrayidx, align 4
  40. %mul5 = mul nsw i64 %i.03, 6
  41. %mul6 = shl nsw i64 %j.02, 3
  42. %add = add nsw i64 %mul5, %mul6
  43. %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add
  44. %0 = load i32, i32* %arrayidx7, align 4
  45. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  46. store i32 %0, i32* %B.addr.11, align 4
  47. %inc = add nsw i64 %j.02, 1
  48. %exitcond = icmp ne i64 %inc, 100
  49. br i1 %exitcond, label %for.body3, label %for.inc8
  50. for.inc8: ; preds = %for.body3
  51. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  52. %inc9 = add nsw i64 %i.03, 1
  53. %exitcond5 = icmp ne i64 %inc9, 100
  54. br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
  55. for.end10: ; preds = %for.inc8
  56. ret void
  57. }
  58. ;; for (long int i = 0; i < 100; i++)
  59. ;; for (long int j = 0; j < 100; j++) {
  60. ;; A[2*i - 4*j] = i;
  61. ;; *B++ = A[6*i + 8*j + 1];
  62. define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
  63. entry:
  64. br label %for.cond1.preheader
  65. ; CHECK: 'Dependence Analysis' for function 'gcd1'
  66. ; CHECK: da analyze - output [* *]!
  67. ; CHECK: da analyze - none!
  68. ; CHECK: da analyze - confused!
  69. ; CHECK: da analyze - input [* *]!
  70. ; CHECK: da analyze - confused!
  71. ; CHECK: da analyze - none!
  72. ; DELIN: 'Dependence Analysis' for function 'gcd1'
  73. ; DELIN: da analyze - output [* *]!
  74. ; DELIN: da analyze - none!
  75. ; DELIN: da analyze - confused!
  76. ; DELIN: da analyze - input [* *]!
  77. ; DELIN: da analyze - confused!
  78. ; DELIN: da analyze - none!
  79. for.cond1.preheader: ; preds = %entry, %for.inc9
  80. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
  81. %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
  82. br label %for.body3
  83. for.body3: ; preds = %for.cond1.preheader, %for.body3
  84. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  85. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  86. %conv = trunc i64 %i.03 to i32
  87. %mul = shl nsw i64 %i.03, 1
  88. %mul4 = shl nsw i64 %j.02, 2
  89. %sub = sub nsw i64 %mul, %mul4
  90. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
  91. store i32 %conv, i32* %arrayidx, align 4
  92. %mul5 = mul nsw i64 %i.03, 6
  93. %mul6 = shl nsw i64 %j.02, 3
  94. %add = add nsw i64 %mul5, %mul6
  95. %add7 = or i64 %add, 1
  96. %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
  97. %0 = load i32, i32* %arrayidx8, align 4
  98. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  99. store i32 %0, i32* %B.addr.11, align 4
  100. %inc = add nsw i64 %j.02, 1
  101. %exitcond = icmp ne i64 %inc, 100
  102. br i1 %exitcond, label %for.body3, label %for.inc9
  103. for.inc9: ; preds = %for.body3
  104. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  105. %inc10 = add nsw i64 %i.03, 1
  106. %exitcond5 = icmp ne i64 %inc10, 100
  107. br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
  108. for.end11: ; preds = %for.inc9
  109. ret void
  110. }
  111. ;; for (long int i = 0; i < 100; i++)
  112. ;; for (long int j = 0; j < 100; j++) {
  113. ;; A[2*i - 4*j + 1] = i;
  114. ;; *B++ = A[6*i + 8*j];
  115. define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
  116. entry:
  117. br label %for.cond1.preheader
  118. ; CHECK: 'Dependence Analysis' for function 'gcd2'
  119. ; CHECK: da analyze - output [* *]!
  120. ; CHECK: da analyze - none!
  121. ; CHECK: da analyze - confused!
  122. ; CHECK: da analyze - input [* *]!
  123. ; CHECK: da analyze - confused!
  124. ; CHECK: da analyze - none!
  125. ; DELIN: 'Dependence Analysis' for function 'gcd2'
  126. ; DELIN: da analyze - output [* *]!
  127. ; DELIN: da analyze - none!
  128. ; DELIN: da analyze - confused!
  129. ; DELIN: da analyze - input [* *]!
  130. ; DELIN: da analyze - confused!
  131. ; DELIN: da analyze - none!
  132. for.cond1.preheader: ; preds = %entry, %for.inc9
  133. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
  134. %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
  135. br label %for.body3
  136. for.body3: ; preds = %for.cond1.preheader, %for.body3
  137. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  138. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  139. %conv = trunc i64 %i.03 to i32
  140. %mul = shl nsw i64 %i.03, 1
  141. %mul4 = shl nsw i64 %j.02, 2
  142. %sub = sub nsw i64 %mul, %mul4
  143. %add5 = or i64 %sub, 1
  144. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add5
  145. store i32 %conv, i32* %arrayidx, align 4
  146. %mul5 = mul nsw i64 %i.03, 6
  147. %mul6 = shl nsw i64 %j.02, 3
  148. %add7 = add nsw i64 %mul5, %mul6
  149. %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
  150. %0 = load i32, i32* %arrayidx8, align 4
  151. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  152. store i32 %0, i32* %B.addr.11, align 4
  153. %inc = add nsw i64 %j.02, 1
  154. %exitcond = icmp ne i64 %inc, 100
  155. br i1 %exitcond, label %for.body3, label %for.inc9
  156. for.inc9: ; preds = %for.body3
  157. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  158. %inc10 = add nsw i64 %i.03, 1
  159. %exitcond6 = icmp ne i64 %inc10, 100
  160. br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
  161. for.end11: ; preds = %for.inc9
  162. ret void
  163. }
  164. ;; for (long int i = 0; i < 100; i++)
  165. ;; for (long int j = 0; j < 100; j++) {
  166. ;; A[i + 2*j] = i;
  167. ;; *B++ = A[i + 2*j - 1];
  168. define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
  169. entry:
  170. br label %for.cond1.preheader
  171. ; CHECK: 'Dependence Analysis' for function 'gcd3'
  172. ; CHECK: da analyze - output [* *]!
  173. ; CHECK: da analyze - flow [<> *]!
  174. ; CHECK: da analyze - confused!
  175. ; CHECK: da analyze - input [* *]!
  176. ; CHECK: da analyze - confused!
  177. ; CHECK: da analyze - none!
  178. ; DELIN: 'Dependence Analysis' for function 'gcd3'
  179. ; DELIN: da analyze - output [* *]!
  180. ; DELIN: da analyze - flow [<> *]!
  181. ; DELIN: da analyze - confused!
  182. ; DELIN: da analyze - input [* *]!
  183. ; DELIN: da analyze - confused!
  184. ; DELIN: da analyze - none!
  185. for.cond1.preheader: ; preds = %entry, %for.inc7
  186. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
  187. %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
  188. br label %for.body3
  189. for.body3: ; preds = %for.cond1.preheader, %for.body3
  190. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  191. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  192. %conv = trunc i64 %i.03 to i32
  193. %mul = shl nsw i64 %j.02, 1
  194. %add = add nsw i64 %i.03, %mul
  195. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
  196. store i32 %conv, i32* %arrayidx, align 4
  197. %mul4 = shl nsw i64 %j.02, 1
  198. %add5 = add nsw i64 %i.03, %mul4
  199. %sub = add nsw i64 %add5, -1
  200. %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %sub
  201. %0 = load i32, i32* %arrayidx6, align 4
  202. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  203. store i32 %0, i32* %B.addr.11, align 4
  204. %inc = add nsw i64 %j.02, 1
  205. %exitcond = icmp ne i64 %inc, 100
  206. br i1 %exitcond, label %for.body3, label %for.inc7
  207. for.inc7: ; preds = %for.body3
  208. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  209. %inc8 = add nsw i64 %i.03, 1
  210. %exitcond5 = icmp ne i64 %inc8, 100
  211. br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
  212. for.end9: ; preds = %for.inc7
  213. ret void
  214. }
  215. ;; for (long int i = 0; i < 100; i++)
  216. ;; for (long int j = 0; j < 100; j++) {
  217. ;; A[5*i + 10*j*M + 9*M*N] = i;
  218. ;; *B++ = A[15*i + 20*j*M - 21*N*M + 4];
  219. define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
  220. entry:
  221. br label %for.cond1.preheader
  222. ; CHECK: 'Dependence Analysis' for function 'gcd4'
  223. ; CHECK: da analyze - output [* *]!
  224. ; CHECK: da analyze - none!
  225. ; CHECK: da analyze - confused!
  226. ; CHECK: da analyze - input [* *]!
  227. ; CHECK: da analyze - confused!
  228. ; CHECK: da analyze - none!
  229. ; DELIN: 'Dependence Analysis' for function 'gcd4'
  230. ; DELIN: da analyze - output [* *]!
  231. ; DELIN: da analyze - none!
  232. ; DELIN: da analyze - confused!
  233. ; DELIN: da analyze - input [* *]!
  234. ; DELIN: da analyze - confused!
  235. ; DELIN: da analyze - none!
  236. for.cond1.preheader: ; preds = %entry, %for.inc17
  237. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
  238. %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
  239. br label %for.body3
  240. for.body3: ; preds = %for.cond1.preheader, %for.body3
  241. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  242. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  243. %conv = trunc i64 %i.03 to i32
  244. %mul = mul nsw i64 %i.03, 5
  245. %mul4 = mul nsw i64 %j.02, 10
  246. %mul5 = mul nsw i64 %mul4, %M
  247. %add = add nsw i64 %mul, %mul5
  248. %mul6 = mul nsw i64 %M, 9
  249. %mul7 = mul nsw i64 %mul6, %N
  250. %add8 = add nsw i64 %add, %mul7
  251. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add8
  252. store i32 %conv, i32* %arrayidx, align 4
  253. %mul9 = mul nsw i64 %i.03, 15
  254. %mul10 = mul nsw i64 %j.02, 20
  255. %mul11 = mul nsw i64 %mul10, %M
  256. %add12 = add nsw i64 %mul9, %mul11
  257. %mul13 = mul nsw i64 %N, 21
  258. %mul14 = mul nsw i64 %mul13, %M
  259. %sub = sub nsw i64 %add12, %mul14
  260. %add15 = add nsw i64 %sub, 4
  261. %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 %add15
  262. %0 = load i32, i32* %arrayidx16, align 4
  263. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  264. store i32 %0, i32* %B.addr.11, align 4
  265. %inc = add nsw i64 %j.02, 1
  266. %exitcond = icmp ne i64 %inc, 100
  267. br i1 %exitcond, label %for.body3, label %for.inc17
  268. for.inc17: ; preds = %for.body3
  269. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  270. %inc18 = add nsw i64 %i.03, 1
  271. %exitcond5 = icmp ne i64 %inc18, 100
  272. br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
  273. for.end19: ; preds = %for.inc17
  274. ret void
  275. }
  276. ;; for (long int i = 0; i < 100; i++)
  277. ;; for (long int j = 0; j < 100; j++) {
  278. ;; A[5*i + 10*j*M + 9*M*N] = i;
  279. ;; *B++ = A[15*i + 20*j*M - 21*N*M + 5];
  280. define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
  281. entry:
  282. br label %for.cond1.preheader
  283. ; CHECK: 'Dependence Analysis' for function 'gcd5'
  284. ; CHECK: da analyze - output [* *]!
  285. ; CHECK: da analyze - flow [<> *]!
  286. ; CHECK: da analyze - confused!
  287. ; CHECK: da analyze - input [* *]!
  288. ; CHECK: da analyze - confused!
  289. ; CHECK: da analyze - none!
  290. ; DELIN: 'Dependence Analysis' for function 'gcd5'
  291. ; DELIN: da analyze - output [* *]!
  292. ; DELIN: da analyze - flow [<> *]!
  293. ; DELIN: da analyze - confused!
  294. ; DELIN: da analyze - input [* *]!
  295. ; DELIN: da analyze - confused!
  296. ; DELIN: da analyze - none!
  297. for.cond1.preheader: ; preds = %entry, %for.inc17
  298. %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
  299. %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
  300. br label %for.body3
  301. for.body3: ; preds = %for.cond1.preheader, %for.body3
  302. %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
  303. %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
  304. %conv = trunc i64 %i.03 to i32
  305. %mul = mul nsw i64 %i.03, 5
  306. %mul4 = mul nsw i64 %j.02, 10
  307. %mul5 = mul nsw i64 %mul4, %M
  308. %add = add nsw i64 %mul, %mul5
  309. %mul6 = mul nsw i64 %M, 9
  310. %mul7 = mul nsw i64 %mul6, %N
  311. %add8 = add nsw i64 %add, %mul7
  312. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add8
  313. store i32 %conv, i32* %arrayidx, align 4
  314. %mul9 = mul nsw i64 %i.03, 15
  315. %mul10 = mul nsw i64 %j.02, 20
  316. %mul11 = mul nsw i64 %mul10, %M
  317. %add12 = add nsw i64 %mul9, %mul11
  318. %mul13 = mul nsw i64 %N, 21
  319. %mul14 = mul nsw i64 %mul13, %M
  320. %sub = sub nsw i64 %add12, %mul14
  321. %add15 = add nsw i64 %sub, 5
  322. %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 %add15
  323. %0 = load i32, i32* %arrayidx16, align 4
  324. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
  325. store i32 %0, i32* %B.addr.11, align 4
  326. %inc = add nsw i64 %j.02, 1
  327. %exitcond = icmp ne i64 %inc, 100
  328. br i1 %exitcond, label %for.body3, label %for.inc17
  329. for.inc17: ; preds = %for.body3
  330. %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
  331. %inc18 = add nsw i64 %i.03, 1
  332. %exitcond5 = icmp ne i64 %inc18, 100
  333. br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
  334. for.end19: ; preds = %for.inc17
  335. ret void
  336. }
  337. ;; for (long int i = 0; i < n; i++)
  338. ;; for (long int j = 0; j < n; j++) {
  339. ;; A[2*i][4*j] = i;
  340. ;; *B++ = A[8*i][6*j + 1];
  341. define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
  342. entry:
  343. %cmp4 = icmp sgt i64 %n, 0
  344. br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
  345. ; CHECK: 'Dependence Analysis' for function 'gcd6'
  346. ; CHECK: da analyze - output [* *]!
  347. ; CHECK: da analyze - none!
  348. ; CHECK: da analyze - confused!
  349. ; CHECK: da analyze - input [* *]!
  350. ; CHECK: da analyze - confused!
  351. ; CHECK: da analyze - output [* *]!
  352. ; DELIN: 'Dependence Analysis' for function 'gcd6'
  353. ; DELIN: da analyze - output [* *]!
  354. ; DELIN: da analyze - none!
  355. ; DELIN: da analyze - confused!
  356. ; DELIN: da analyze - input [* *]!
  357. ; DELIN: da analyze - confused!
  358. ; DELIN: da analyze - output [* *]!
  359. for.cond1.preheader.preheader: ; preds = %entry
  360. br label %for.cond1.preheader
  361. for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10
  362. %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
  363. %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
  364. %cmp21 = icmp sgt i64 %n, 0
  365. br i1 %cmp21, label %for.body3.preheader, label %for.inc10
  366. for.body3.preheader: ; preds = %for.cond1.preheader
  367. br label %for.body3
  368. for.body3: ; preds = %for.body3.preheader, %for.body3
  369. %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
  370. %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
  371. %conv = trunc i64 %i.06 to i32
  372. %mul = shl nsw i64 %j.03, 2
  373. %mul4 = shl nsw i64 %i.06, 1
  374. %0 = mul nsw i64 %mul4, %n
  375. %arrayidx.sum = add i64 %0, %mul
  376. %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
  377. store i32 %conv, i32* %arrayidx5, align 4
  378. %mul6 = mul nsw i64 %j.03, 6
  379. %add7 = or i64 %mul6, 1
  380. %mul7 = shl nsw i64 %i.06, 3
  381. %1 = mul nsw i64 %mul7, %n
  382. %arrayidx8.sum = add i64 %1, %add7
  383. %arrayidx9 = getelementptr inbounds i32, i32* %A, i64 %arrayidx8.sum
  384. %2 = load i32, i32* %arrayidx9, align 4
  385. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
  386. store i32 %2, i32* %B.addr.12, align 4
  387. %inc = add nsw i64 %j.03, 1
  388. %exitcond = icmp ne i64 %inc, %n
  389. br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
  390. for.inc10.loopexit: ; preds = %for.body3
  391. %scevgep = getelementptr i32, i32* %B.addr.05, i64 %n
  392. br label %for.inc10
  393. for.inc10: ; preds = %for.inc10.loopexit, %for.cond1.preheader
  394. %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
  395. %inc11 = add nsw i64 %i.06, 1
  396. %exitcond8 = icmp ne i64 %inc11, %n
  397. br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
  398. for.end12.loopexit: ; preds = %for.inc10
  399. br label %for.end12
  400. for.end12: ; preds = %for.end12.loopexit, %entry
  401. ret void
  402. }
  403. ;; for (int i = 0; i < n; i++)
  404. ;; for (int j = 0; j < n; j++) {
  405. ;; A[2*i][4*j] = i;
  406. ;; *B++ = A[8*i][6*j + 1];
  407. define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
  408. entry:
  409. %0 = zext i32 %n to i64
  410. %cmp4 = icmp sgt i32 %n, 0
  411. br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
  412. ; CHECK: 'Dependence Analysis' for function 'gcd7'
  413. ; CHECK: da analyze - output [* *]!
  414. ; CHECK: da analyze - flow [* *|<]!
  415. ; CHECK: da analyze - confused!
  416. ; CHECK: da analyze - input [* *]!
  417. ; CHECK: da analyze - confused!
  418. ; CHECK: da analyze - output [* *]!
  419. ; DELIN: 'Dependence Analysis' for function 'gcd7'
  420. ; DELIN: da analyze - output [* *]!
  421. ; DELIN: da analyze - flow [* *|<]!
  422. ; DELIN: da analyze - confused!
  423. ; DELIN: da analyze - input [* *]!
  424. ; DELIN: da analyze - confused!
  425. ; DELIN: da analyze - output [* *]!
  426. for.cond1.preheader.preheader: ; preds = %entry
  427. br label %for.cond1.preheader
  428. for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
  429. %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
  430. %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
  431. %1 = add i32 %n, -1
  432. %2 = zext i32 %1 to i64
  433. %3 = add i64 %2, 1
  434. %cmp21 = icmp sgt i32 %n, 0
  435. br i1 %cmp21, label %for.body3.preheader, label %for.inc13
  436. for.body3.preheader: ; preds = %for.cond1.preheader
  437. br label %for.body3
  438. for.body3: ; preds = %for.body3.preheader, %for.body3
  439. %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
  440. %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
  441. %4 = trunc i64 %indvars.iv to i32
  442. %mul = shl nsw i32 %4, 2
  443. %idxprom = sext i32 %mul to i64
  444. %5 = trunc i64 %indvars.iv8 to i32
  445. %mul4 = shl nsw i32 %5, 1
  446. %idxprom5 = sext i32 %mul4 to i64
  447. %6 = mul nsw i64 %idxprom5, %0
  448. %arrayidx.sum = add i64 %6, %idxprom
  449. %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
  450. %7 = trunc i64 %indvars.iv8 to i32
  451. store i32 %7, i32* %arrayidx6, align 4
  452. %8 = trunc i64 %indvars.iv to i32
  453. %mul7 = mul nsw i32 %8, 6
  454. %add7 = or i32 %mul7, 1
  455. %idxprom8 = sext i32 %add7 to i64
  456. %9 = trunc i64 %indvars.iv8 to i32
  457. %mul9 = shl nsw i32 %9, 3
  458. %idxprom10 = sext i32 %mul9 to i64
  459. %10 = mul nsw i64 %idxprom10, %0
  460. %arrayidx11.sum = add i64 %10, %idxprom8
  461. %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %arrayidx11.sum
  462. %11 = load i32, i32* %arrayidx12, align 4
  463. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
  464. store i32 %11, i32* %B.addr.12, align 4
  465. %indvars.iv.next = add i64 %indvars.iv, 1
  466. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  467. %exitcond = icmp ne i32 %lftr.wideiv, %n
  468. br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
  469. for.inc13.loopexit: ; preds = %for.body3
  470. %scevgep = getelementptr i32, i32* %B.addr.05, i64 %3
  471. br label %for.inc13
  472. for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
  473. %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
  474. %indvars.iv.next9 = add i64 %indvars.iv8, 1
  475. %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
  476. %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
  477. br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
  478. for.end15.loopexit: ; preds = %for.inc13
  479. br label %for.end15
  480. for.end15: ; preds = %for.end15.loopexit, %entry
  481. ret void
  482. }
  483. ;; for (int i = 0; i < n; i++)
  484. ;; for (int j = 0; j < n; j++) {
  485. ;; A[n*2*i + 4*j] = i;
  486. ;; *B++ = A[n*8*i + 6*j + 1];
  487. define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
  488. entry:
  489. %cmp4 = icmp sgt i32 %n, 0
  490. br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
  491. ; CHECK: 'Dependence Analysis' for function 'gcd8'
  492. ; CHECK: da analyze - output [* *]!
  493. ; CHECK: da analyze - none!
  494. ; CHECK: da analyze - confused!
  495. ; CHECK: da analyze - input [* *]!
  496. ; CHECK: da analyze - confused!
  497. ; CHECK: da analyze - output [* *]!
  498. ; DELIN: 'Dependence Analysis' for function 'gcd8'
  499. ; DELIN: da analyze - output [* *]!
  500. ; DELIN: da analyze - none!
  501. ; DELIN: da analyze - confused!
  502. ; DELIN: da analyze - input [* *]!
  503. ; DELIN: da analyze - confused!
  504. ; DELIN: da analyze - output [* *]!
  505. for.cond1.preheader.preheader: ; preds = %entry
  506. br label %for.cond1.preheader
  507. for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
  508. %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
  509. %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
  510. %0 = add i32 %n, -1
  511. %1 = zext i32 %0 to i64
  512. %2 = add i64 %1, 1
  513. %cmp21 = icmp sgt i32 %n, 0
  514. br i1 %cmp21, label %for.body3.preheader, label %for.inc13
  515. for.body3.preheader: ; preds = %for.cond1.preheader
  516. br label %for.body3
  517. for.body3: ; preds = %for.body3.preheader, %for.body3
  518. %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
  519. %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
  520. %mul = shl nsw i32 %n, 1
  521. %mul4 = mul nsw i32 %mul, %i.06
  522. %3 = trunc i64 %indvars.iv to i32
  523. %mul5 = shl nsw i32 %3, 2
  524. %add = add nsw i32 %mul4, %mul5
  525. %idxprom = sext i32 %add to i64
  526. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
  527. store i32 %i.06, i32* %arrayidx, align 4
  528. %mul6 = shl nsw i32 %n, 3
  529. %mul7 = mul nsw i32 %mul6, %i.06
  530. %4 = trunc i64 %indvars.iv to i32
  531. %mul8 = mul nsw i32 %4, 6
  532. %add9 = add nsw i32 %mul7, %mul8
  533. %add10 = or i32 %add9, 1
  534. %idxprom11 = sext i32 %add10 to i64
  535. %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %idxprom11
  536. %5 = load i32, i32* %arrayidx12, align 4
  537. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
  538. store i32 %5, i32* %B.addr.12, align 4
  539. %indvars.iv.next = add i64 %indvars.iv, 1
  540. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  541. %exitcond = icmp ne i32 %lftr.wideiv, %n
  542. br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
  543. for.inc13.loopexit: ; preds = %for.body3
  544. %scevgep = getelementptr i32, i32* %B.addr.05, i64 %2
  545. br label %for.inc13
  546. for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
  547. %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
  548. %inc14 = add nsw i32 %i.06, 1
  549. %exitcond7 = icmp ne i32 %inc14, %n
  550. br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
  551. for.end15.loopexit: ; preds = %for.inc13
  552. br label %for.end15
  553. for.end15: ; preds = %for.end15.loopexit, %entry
  554. ret void
  555. }
  556. ;; for (unsigned i = 0; i < n; i++)
  557. ;; for (unsigned j = 0; j < n; j++) {
  558. ;; A[2*i][4*j] = i;
  559. ;; *B++ = A[8*i][6*j + 1];
  560. define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
  561. entry:
  562. %0 = zext i32 %n to i64
  563. %cmp4 = icmp eq i32 %n, 0
  564. br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
  565. ; CHECK: 'Dependence Analysis' for function 'gcd9'
  566. ; CHECK: da analyze - output [* *]!
  567. ; CHECK: da analyze - flow [* *|<]!
  568. ; CHECK: da analyze - confused!
  569. ; CHECK: da analyze - input [* *]!
  570. ; CHECK: da analyze - confused!
  571. ; CHECK: da analyze - output [* *]!
  572. ; DELIN: 'Dependence Analysis' for function 'gcd9'
  573. ; DELIN: da analyze - output [* *]!
  574. ; DELIN: da analyze - flow [* *|<]!
  575. ; DELIN: da analyze - confused!
  576. ; DELIN: da analyze - input [* *]!
  577. ; DELIN: da analyze - confused!
  578. ; DELIN: da analyze - output [* *]!
  579. for.cond1.preheader.preheader: ; preds = %entry
  580. br label %for.cond1.preheader
  581. for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
  582. %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
  583. %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
  584. %1 = add i32 %n, -1
  585. %2 = zext i32 %1 to i64
  586. %3 = add i64 %2, 1
  587. %cmp21 = icmp eq i32 %n, 0
  588. br i1 %cmp21, label %for.inc13, label %for.body3.preheader
  589. for.body3.preheader: ; preds = %for.cond1.preheader
  590. br label %for.body3
  591. for.body3: ; preds = %for.body3.preheader, %for.body3
  592. %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
  593. %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
  594. %4 = trunc i64 %indvars.iv to i32
  595. %mul = shl i32 %4, 2
  596. %idxprom = zext i32 %mul to i64
  597. %5 = trunc i64 %indvars.iv8 to i32
  598. %mul4 = shl i32 %5, 1
  599. %idxprom5 = zext i32 %mul4 to i64
  600. %6 = mul nsw i64 %idxprom5, %0
  601. %arrayidx.sum = add i64 %6, %idxprom
  602. %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
  603. %7 = trunc i64 %indvars.iv8 to i32
  604. store i32 %7, i32* %arrayidx6, align 4
  605. %8 = trunc i64 %indvars.iv to i32
  606. %mul7 = mul i32 %8, 6
  607. %add7 = or i32 %mul7, 1
  608. %idxprom8 = zext i32 %add7 to i64
  609. %9 = trunc i64 %indvars.iv8 to i32
  610. %mul9 = shl i32 %9, 3
  611. %idxprom10 = zext i32 %mul9 to i64
  612. %10 = mul nsw i64 %idxprom10, %0
  613. %arrayidx11.sum = add i64 %10, %idxprom8
  614. %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %arrayidx11.sum
  615. %11 = load i32, i32* %arrayidx12, align 4
  616. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
  617. store i32 %11, i32* %B.addr.12, align 4
  618. %indvars.iv.next = add i64 %indvars.iv, 1
  619. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  620. %exitcond = icmp ne i32 %lftr.wideiv, %n
  621. br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
  622. for.inc13.loopexit: ; preds = %for.body3
  623. %scevgep = getelementptr i32, i32* %B.addr.05, i64 %3
  624. br label %for.inc13
  625. for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
  626. %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
  627. %indvars.iv.next9 = add i64 %indvars.iv8, 1
  628. %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
  629. %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
  630. br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
  631. for.end15.loopexit: ; preds = %for.inc13
  632. br label %for.end15
  633. for.end15: ; preds = %for.end15.loopexit, %entry
  634. ret void
  635. }