WeakCrossingSIV.ll 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
  2. ; ModuleID = 'WeakCrossingSIV.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 unsigned i = 0; i < n; i++) {
  6. ;; A[1 + n*i] = i;
  7. ;; *B++ = A[1 - n*i];
  8. define void @weakcrossing0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  9. entry:
  10. %cmp1 = icmp eq i64 %n, 0
  11. br i1 %cmp1, label %for.end, label %for.body.preheader
  12. for.body.preheader: ; preds = %entry
  13. br label %for.body
  14. ; CHECK: da analyze - none!
  15. ; CHECK: da analyze - flow [0|<]!
  16. ; CHECK: da analyze - confused!
  17. ; CHECK: da analyze - none!
  18. ; CHECK: da analyze - confused!
  19. ; CHECK: da analyze - none!
  20. for.body: ; preds = %for.body.preheader, %for.body
  21. %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
  22. %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
  23. %conv = trunc i64 %i.03 to i32
  24. %mul = mul i64 %i.03, %n
  25. %add = add i64 %mul, 1
  26. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
  27. store i32 %conv, i32* %arrayidx, align 4
  28. %mul1 = mul i64 %i.03, %n
  29. %sub = sub i64 1, %mul1
  30. %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
  31. %0 = load i32, i32* %arrayidx2, align 4
  32. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
  33. store i32 %0, i32* %B.addr.02, align 4
  34. %inc = add i64 %i.03, 1
  35. %exitcond = icmp ne i64 %inc, %n
  36. br i1 %exitcond, label %for.body, label %for.end.loopexit
  37. for.end.loopexit: ; preds = %for.body
  38. br label %for.end
  39. for.end: ; preds = %for.end.loopexit, %entry
  40. ret void
  41. }
  42. ;; for (long unsigned i = 0; i < n; i++) {
  43. ;; A[n + i] = i;
  44. ;; *B++ = A[1 + n - i];
  45. define void @weakcrossing1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  46. entry:
  47. %cmp1 = icmp eq i64 %n, 0
  48. br i1 %cmp1, label %for.end, label %for.body.preheader
  49. ; CHECK: da analyze - none!
  50. ; CHECK: da analyze - flow [<>] splitable!
  51. ; CHECK: da analyze - split level = 1, iteration = 0!
  52. ; CHECK: da analyze - confused!
  53. ; CHECK: da analyze - none!
  54. ; CHECK: da analyze - confused!
  55. ; CHECK: da analyze - none!
  56. for.body.preheader: ; preds = %entry
  57. br label %for.body
  58. for.body: ; preds = %for.body.preheader, %for.body
  59. %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
  60. %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
  61. %conv = trunc i64 %i.03 to i32
  62. %add = add i64 %i.03, %n
  63. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
  64. store i32 %conv, i32* %arrayidx, align 4
  65. %add1 = add i64 %n, 1
  66. %sub = sub i64 %add1, %i.03
  67. %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
  68. %0 = load i32, i32* %arrayidx2, align 4
  69. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
  70. store i32 %0, i32* %B.addr.02, align 4
  71. %inc = add i64 %i.03, 1
  72. %exitcond = icmp ne i64 %inc, %n
  73. br i1 %exitcond, label %for.body, label %for.end.loopexit
  74. for.end.loopexit: ; preds = %for.body
  75. br label %for.end
  76. for.end: ; preds = %for.end.loopexit, %entry
  77. ret void
  78. }
  79. ;; for (long unsigned i = 0; i < 3; i++) {
  80. ;; A[i] = i;
  81. ;; *B++ = A[6 - i];
  82. define void @weakcrossing2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  83. entry:
  84. br label %for.body
  85. ; CHECK: da analyze - none!
  86. ; CHECK: da analyze - none!
  87. ; CHECK: da analyze - confused!
  88. ; CHECK: da analyze - none!
  89. ; CHECK: da analyze - confused!
  90. ; CHECK: da analyze - none!
  91. for.body: ; preds = %entry, %for.body
  92. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  93. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  94. %conv = trunc i64 %i.02 to i32
  95. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
  96. store i32 %conv, i32* %arrayidx, align 4
  97. %sub = sub i64 6, %i.02
  98. %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
  99. %0 = load i32, i32* %arrayidx1, align 4
  100. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  101. store i32 %0, i32* %B.addr.01, align 4
  102. %inc = add i64 %i.02, 1
  103. %exitcond = icmp ne i64 %inc, 3
  104. br i1 %exitcond, label %for.body, label %for.end
  105. for.end: ; preds = %for.body
  106. ret void
  107. }
  108. ;; for (long unsigned i = 0; i < 4; i++) {
  109. ;; A[i] = i;
  110. ;; *B++ = A[6 - i];
  111. define void @weakcrossing3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  112. entry:
  113. br label %for.body
  114. ; CHECK: da analyze - none!
  115. ; CHECK: da analyze - flow [0|<]!
  116. ; CHECK: da analyze - confused!
  117. ; CHECK: da analyze - none!
  118. ; CHECK: da analyze - confused!
  119. ; CHECK: da analyze - none!
  120. for.body: ; preds = %entry, %for.body
  121. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  122. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  123. %conv = trunc i64 %i.02 to i32
  124. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
  125. store i32 %conv, i32* %arrayidx, align 4
  126. %sub = sub i64 6, %i.02
  127. %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
  128. %0 = load i32, i32* %arrayidx1, align 4
  129. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  130. store i32 %0, i32* %B.addr.01, align 4
  131. %inc = add i64 %i.02, 1
  132. %exitcond = icmp ne i64 %inc, 4
  133. br i1 %exitcond, label %for.body, label %for.end
  134. for.end: ; preds = %for.body
  135. ret void
  136. }
  137. ;; for (long unsigned i = 0; i < 10; i++) {
  138. ;; A[i] = i;
  139. ;; *B++ = A[-6 - i];
  140. define void @weakcrossing4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  141. entry:
  142. br label %for.body
  143. ; CHECK: da analyze - none!
  144. ; CHECK: da analyze - none!
  145. ; CHECK: da analyze - confused!
  146. ; CHECK: da analyze - none!
  147. ; CHECK: da analyze - confused!
  148. ; CHECK: da analyze - none!
  149. for.body: ; preds = %entry, %for.body
  150. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  151. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  152. %conv = trunc i64 %i.02 to i32
  153. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
  154. store i32 %conv, i32* %arrayidx, align 4
  155. %sub = sub i64 -6, %i.02
  156. %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
  157. %0 = load i32, i32* %arrayidx1, align 4
  158. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  159. store i32 %0, i32* %B.addr.01, align 4
  160. %inc = add i64 %i.02, 1
  161. %exitcond = icmp ne i64 %inc, 10
  162. br i1 %exitcond, label %for.body, label %for.end
  163. for.end: ; preds = %for.body
  164. ret void
  165. }
  166. ;; for (long unsigned i = 0; i < n; i++) {
  167. ;; A[3*i] = i;
  168. ;; *B++ = A[5 - 3*i];
  169. define void @weakcrossing5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  170. entry:
  171. %cmp1 = icmp eq i64 %n, 0
  172. br i1 %cmp1, label %for.end, label %for.body.preheader
  173. ; CHECK: da analyze - none!
  174. ; CHECK: da analyze - none!
  175. ; CHECK: da analyze - confused!
  176. ; CHECK: da analyze - none!
  177. ; CHECK: da analyze - confused!
  178. ; CHECK: da analyze - none!
  179. for.body.preheader: ; preds = %entry
  180. br label %for.body
  181. for.body: ; preds = %for.body.preheader, %for.body
  182. %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
  183. %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
  184. %conv = trunc i64 %i.03 to i32
  185. %mul = mul i64 %i.03, 3
  186. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
  187. store i32 %conv, i32* %arrayidx, align 4
  188. %0 = mul i64 %i.03, -3
  189. %sub = add i64 %0, 5
  190. %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
  191. %1 = load i32, i32* %arrayidx2, align 4
  192. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
  193. store i32 %1, i32* %B.addr.02, align 4
  194. %inc = add i64 %i.03, 1
  195. %exitcond = icmp ne i64 %inc, %n
  196. br i1 %exitcond, label %for.body, label %for.end.loopexit
  197. for.end.loopexit: ; preds = %for.body
  198. br label %for.end
  199. for.end: ; preds = %for.end.loopexit, %entry
  200. ret void
  201. }
  202. ;; for (long unsigned i = 0; i < 4; i++) {
  203. ;; A[i] = i;
  204. ;; *B++ = A[5 - i];
  205. define void @weakcrossing6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
  206. entry:
  207. br label %for.body
  208. ; CHECK: da analyze - none!
  209. ; CHECK: da analyze - flow [<>] splitable!
  210. ; CHECK: da analyze - split level = 1, iteration = 2!
  211. ; CHECK: da analyze - confused!
  212. ; CHECK: da analyze - none!
  213. ; CHECK: da analyze - confused!
  214. ; CHECK: da analyze - none!
  215. for.body: ; preds = %entry, %for.body
  216. %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
  217. %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
  218. %conv = trunc i64 %i.02 to i32
  219. %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
  220. store i32 %conv, i32* %arrayidx, align 4
  221. %sub = sub i64 5, %i.02
  222. %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
  223. %0 = load i32, i32* %arrayidx1, align 4
  224. %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
  225. store i32 %0, i32* %B.addr.01, align 4
  226. %inc = add i64 %i.02, 1
  227. %exitcond = icmp ne i64 %inc, 4
  228. br i1 %exitcond, label %for.body, label %for.end
  229. for.end: ; preds = %for.body
  230. ret void
  231. }