loop.ll 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. ; Test the static branch probability heuristics for no-return functions.
  2. ; RUN: opt < %s -analyze -branch-prob | FileCheck %s
  3. declare void @g1()
  4. declare void @g2()
  5. declare void @g3()
  6. declare void @g4()
  7. define void @test1(i32 %a, i32 %b) {
  8. entry:
  9. br label %do.body
  10. ; CHECK: edge entry -> do.body probability is 16 / 16 = 100%
  11. do.body:
  12. %i.0 = phi i32 [ 0, %entry ], [ %inc3, %do.end ]
  13. call void @g1()
  14. br label %do.body1
  15. ; CHECK: edge do.body -> do.body1 probability is 16 / 16 = 100%
  16. do.body1:
  17. %j.0 = phi i32 [ 0, %do.body ], [ %inc, %do.body1 ]
  18. call void @g2()
  19. %inc = add nsw i32 %j.0, 1
  20. %cmp = icmp slt i32 %inc, %b
  21. br i1 %cmp, label %do.body1, label %do.end
  22. ; CHECK: edge do.body1 -> do.body1 probability is 124 / 128
  23. ; CHECK: edge do.body1 -> do.end probability is 4 / 128
  24. do.end:
  25. call void @g3()
  26. %inc3 = add nsw i32 %i.0, 1
  27. %cmp4 = icmp slt i32 %inc3, %a
  28. br i1 %cmp4, label %do.body, label %do.end5
  29. ; CHECK: edge do.end -> do.body probability is 124 / 128
  30. ; CHECK: edge do.end -> do.end5 probability is 4 / 128
  31. do.end5:
  32. call void @g4()
  33. ret void
  34. }
  35. define void @test2(i32 %a, i32 %b) {
  36. entry:
  37. %cmp9 = icmp sgt i32 %a, 0
  38. br i1 %cmp9, label %for.body.lr.ph, label %for.end6
  39. ; CHECK: edge entry -> for.body.lr.ph probability is 20 / 32
  40. ; CHECK: edge entry -> for.end6 probability is 12 / 32
  41. for.body.lr.ph:
  42. %cmp27 = icmp sgt i32 %b, 0
  43. br label %for.body
  44. ; CHECK: edge for.body.lr.ph -> for.body probability is 16 / 16 = 100%
  45. for.body:
  46. %i.010 = phi i32 [ 0, %for.body.lr.ph ], [ %inc5, %for.end ]
  47. call void @g1()
  48. br i1 %cmp27, label %for.body3, label %for.end
  49. ; CHECK: edge for.body -> for.body3 probability is 20 / 32 = 62.5%
  50. ; CHECK: edge for.body -> for.end probability is 12 / 32 = 37.5%
  51. for.body3:
  52. %j.08 = phi i32 [ %inc, %for.body3 ], [ 0, %for.body ]
  53. call void @g2()
  54. %inc = add nsw i32 %j.08, 1
  55. %exitcond = icmp eq i32 %inc, %b
  56. br i1 %exitcond, label %for.end, label %for.body3
  57. ; CHECK: edge for.body3 -> for.end probability is 4 / 128
  58. ; CHECK: edge for.body3 -> for.body3 probability is 124 / 128
  59. for.end:
  60. call void @g3()
  61. %inc5 = add nsw i32 %i.010, 1
  62. %exitcond11 = icmp eq i32 %inc5, %a
  63. br i1 %exitcond11, label %for.end6, label %for.body
  64. ; CHECK: edge for.end -> for.end6 probability is 4 / 128
  65. ; CHECK: edge for.end -> for.body probability is 124 / 128
  66. for.end6:
  67. call void @g4()
  68. ret void
  69. }
  70. define void @test3(i32 %a, i32 %b, i32* %c) {
  71. entry:
  72. br label %do.body
  73. ; CHECK: edge entry -> do.body probability is 16 / 16 = 100%
  74. do.body:
  75. %i.0 = phi i32 [ 0, %entry ], [ %inc4, %if.end ]
  76. call void @g1()
  77. %0 = load i32, i32* %c, align 4
  78. %cmp = icmp slt i32 %0, 42
  79. br i1 %cmp, label %do.body1, label %if.end
  80. ; CHECK: edge do.body -> do.body1 probability is 16 / 32 = 50%
  81. ; CHECK: edge do.body -> if.end probability is 16 / 32 = 50%
  82. do.body1:
  83. %j.0 = phi i32 [ %inc, %do.body1 ], [ 0, %do.body ]
  84. call void @g2()
  85. %inc = add nsw i32 %j.0, 1
  86. %cmp2 = icmp slt i32 %inc, %b
  87. br i1 %cmp2, label %do.body1, label %if.end
  88. ; CHECK: edge do.body1 -> do.body1 probability is 124 / 128
  89. ; CHECK: edge do.body1 -> if.end probability is 4 / 128
  90. if.end:
  91. call void @g3()
  92. %inc4 = add nsw i32 %i.0, 1
  93. %cmp5 = icmp slt i32 %inc4, %a
  94. br i1 %cmp5, label %do.body, label %do.end6
  95. ; CHECK: edge if.end -> do.body probability is 124 / 128
  96. ; CHECK: edge if.end -> do.end6 probability is 4 / 128
  97. do.end6:
  98. call void @g4()
  99. ret void
  100. }
  101. define void @test4(i32 %a, i32 %b, i32* %c) {
  102. entry:
  103. br label %do.body
  104. ; CHECK: edge entry -> do.body probability is 16 / 16 = 100%
  105. do.body:
  106. %i.0 = phi i32 [ 0, %entry ], [ %inc4, %do.end ]
  107. call void @g1()
  108. %0 = load i32, i32* %c, align 4
  109. %cmp = icmp slt i32 %0, 42
  110. br i1 %cmp, label %return, label %do.body1
  111. ; CHECK: edge do.body -> return probability is 4 / 128
  112. ; CHECK: edge do.body -> do.body1 probability is 124 / 128
  113. do.body1:
  114. %j.0 = phi i32 [ %inc, %do.body1 ], [ 0, %do.body ]
  115. call void @g2()
  116. %inc = add nsw i32 %j.0, 1
  117. %cmp2 = icmp slt i32 %inc, %b
  118. br i1 %cmp2, label %do.body1, label %do.end
  119. ; CHECK: edge do.body1 -> do.body1 probability is 124 / 128
  120. ; CHECK: edge do.body1 -> do.end probability is 4 / 128
  121. do.end:
  122. call void @g3()
  123. %inc4 = add nsw i32 %i.0, 1
  124. %cmp5 = icmp slt i32 %inc4, %a
  125. br i1 %cmp5, label %do.body, label %do.end6
  126. ; CHECK: edge do.end -> do.body probability is 124 / 128
  127. ; CHECK: edge do.end -> do.end6 probability is 4 / 128
  128. do.end6:
  129. call void @g4()
  130. br label %return
  131. ; CHECK: edge do.end6 -> return probability is 16 / 16 = 100%
  132. return:
  133. ret void
  134. }
  135. define void @test5(i32 %a, i32 %b, i32* %c) {
  136. entry:
  137. br label %do.body
  138. ; CHECK: edge entry -> do.body probability is 16 / 16 = 100%
  139. do.body:
  140. %i.0 = phi i32 [ 0, %entry ], [ %inc4, %do.end ]
  141. call void @g1()
  142. br label %do.body1
  143. ; CHECK: edge do.body -> do.body1 probability is 16 / 16 = 100%
  144. do.body1:
  145. %j.0 = phi i32 [ 0, %do.body ], [ %inc, %if.end ]
  146. %0 = load i32, i32* %c, align 4
  147. %cmp = icmp slt i32 %0, 42
  148. br i1 %cmp, label %return, label %if.end
  149. ; CHECK: edge do.body1 -> return probability is 4 / 128
  150. ; CHECK: edge do.body1 -> if.end probability is 124 / 128
  151. if.end:
  152. call void @g2()
  153. %inc = add nsw i32 %j.0, 1
  154. %cmp2 = icmp slt i32 %inc, %b
  155. br i1 %cmp2, label %do.body1, label %do.end
  156. ; CHECK: edge if.end -> do.body1 probability is 124 / 128
  157. ; CHECK: edge if.end -> do.end probability is 4 / 128
  158. do.end:
  159. call void @g3()
  160. %inc4 = add nsw i32 %i.0, 1
  161. %cmp5 = icmp slt i32 %inc4, %a
  162. br i1 %cmp5, label %do.body, label %do.end6
  163. ; CHECK: edge do.end -> do.body probability is 124 / 128
  164. ; CHECK: edge do.end -> do.end6 probability is 4 / 128
  165. do.end6:
  166. call void @g4()
  167. br label %return
  168. ; CHECK: edge do.end6 -> return probability is 16 / 16 = 100%
  169. return:
  170. ret void
  171. }
  172. define void @test6(i32 %a, i32 %b, i32* %c) {
  173. entry:
  174. br label %do.body
  175. ; CHECK: edge entry -> do.body probability is 16 / 16 = 100%
  176. do.body:
  177. %i.0 = phi i32 [ 0, %entry ], [ %inc4, %do.end ]
  178. call void @g1()
  179. br label %do.body1
  180. ; CHECK: edge do.body -> do.body1 probability is 16 / 16 = 100%
  181. do.body1:
  182. %j.0 = phi i32 [ 0, %do.body ], [ %inc, %do.cond ]
  183. call void @g2()
  184. %0 = load i32, i32* %c, align 4
  185. %cmp = icmp slt i32 %0, 42
  186. br i1 %cmp, label %return, label %do.cond
  187. ; CHECK: edge do.body1 -> return probability is 4 / 128
  188. ; CHECK: edge do.body1 -> do.cond probability is 124 / 128
  189. do.cond:
  190. %inc = add nsw i32 %j.0, 1
  191. %cmp2 = icmp slt i32 %inc, %b
  192. br i1 %cmp2, label %do.body1, label %do.end
  193. ; CHECK: edge do.cond -> do.body1 probability is 124 / 128
  194. ; CHECK: edge do.cond -> do.end probability is 4 / 128
  195. do.end:
  196. call void @g3()
  197. %inc4 = add nsw i32 %i.0, 1
  198. %cmp5 = icmp slt i32 %inc4, %a
  199. br i1 %cmp5, label %do.body, label %do.end6
  200. ; CHECK: edge do.end -> do.body probability is 124 / 128
  201. ; CHECK: edge do.end -> do.end6 probability is 4 / 128
  202. do.end6:
  203. call void @g4()
  204. br label %return
  205. ; CHECK: edge do.end6 -> return probability is 16 / 16 = 100%
  206. return:
  207. ret void
  208. }
  209. define void @test7(i32 %a, i32 %b, i32* %c) {
  210. entry:
  211. %cmp10 = icmp sgt i32 %a, 0
  212. br i1 %cmp10, label %for.body.lr.ph, label %for.end7
  213. ; CHECK: edge entry -> for.body.lr.ph probability is 20 / 32
  214. ; CHECK: edge entry -> for.end7 probability is 12 / 32
  215. for.body.lr.ph:
  216. %cmp38 = icmp sgt i32 %b, 0
  217. br label %for.body
  218. ; CHECK: edge for.body.lr.ph -> for.body probability is 16 / 16 = 100%
  219. for.body:
  220. %i.011 = phi i32 [ 0, %for.body.lr.ph ], [ %inc6, %for.inc5 ]
  221. %0 = load i32, i32* %c, align 4
  222. %cmp1 = icmp eq i32 %0, %i.011
  223. br i1 %cmp1, label %for.inc5, label %if.end
  224. ; CHECK: edge for.body -> for.inc5 probability is 16 / 32 = 50%
  225. ; CHECK: edge for.body -> if.end probability is 16 / 32 = 50%
  226. if.end:
  227. call void @g1()
  228. br i1 %cmp38, label %for.body4, label %for.end
  229. ; CHECK: edge if.end -> for.body4 probability is 20 / 32 = 62.5%
  230. ; CHECK: edge if.end -> for.end probability is 12 / 32 = 37.5%
  231. for.body4:
  232. %j.09 = phi i32 [ %inc, %for.body4 ], [ 0, %if.end ]
  233. call void @g2()
  234. %inc = add nsw i32 %j.09, 1
  235. %exitcond = icmp eq i32 %inc, %b
  236. br i1 %exitcond, label %for.end, label %for.body4
  237. ; CHECK: edge for.body4 -> for.end probability is 4 / 128
  238. ; CHECK: edge for.body4 -> for.body4 probability is 124 / 128
  239. for.end:
  240. call void @g3()
  241. br label %for.inc5
  242. ; CHECK: edge for.end -> for.inc5 probability is 16 / 16 = 100%
  243. for.inc5:
  244. %inc6 = add nsw i32 %i.011, 1
  245. %exitcond12 = icmp eq i32 %inc6, %a
  246. br i1 %exitcond12, label %for.end7, label %for.body
  247. ; CHECK: edge for.inc5 -> for.end7 probability is 4 / 128
  248. ; CHECK: edge for.inc5 -> for.body probability is 124 / 128
  249. for.end7:
  250. call void @g4()
  251. ret void
  252. }
  253. define void @test8(i32 %a, i32 %b, i32* %c) {
  254. entry:
  255. %cmp18 = icmp sgt i32 %a, 0
  256. br i1 %cmp18, label %for.body.lr.ph, label %for.end15
  257. ; CHECK: edge entry -> for.body.lr.ph probability is 20 / 32
  258. ; CHECK: edge entry -> for.end15 probability is 12 / 32
  259. for.body.lr.ph:
  260. %cmp216 = icmp sgt i32 %b, 0
  261. %arrayidx5 = getelementptr inbounds i32, i32* %c, i64 1
  262. %arrayidx9 = getelementptr inbounds i32, i32* %c, i64 2
  263. br label %for.body
  264. ; CHECK: edge for.body.lr.ph -> for.body probability is 16 / 16 = 100%
  265. for.body:
  266. %i.019 = phi i32 [ 0, %for.body.lr.ph ], [ %inc14, %for.end ]
  267. call void @g1()
  268. br i1 %cmp216, label %for.body3, label %for.end
  269. ; CHECK: edge for.body -> for.body3 probability is 20 / 32 = 62.5%
  270. ; CHECK: edge for.body -> for.end probability is 12 / 32 = 37.5%
  271. for.body3:
  272. %j.017 = phi i32 [ 0, %for.body ], [ %inc, %for.inc ]
  273. %0 = load i32, i32* %c, align 4
  274. %cmp4 = icmp eq i32 %0, %j.017
  275. br i1 %cmp4, label %for.inc, label %if.end
  276. ; CHECK: edge for.body3 -> for.inc probability is 16 / 32 = 50%
  277. ; CHECK: edge for.body3 -> if.end probability is 16 / 32 = 50%
  278. if.end:
  279. %1 = load i32, i32* %arrayidx5, align 4
  280. %cmp6 = icmp eq i32 %1, %j.017
  281. br i1 %cmp6, label %for.inc, label %if.end8
  282. ; CHECK: edge if.end -> for.inc probability is 16 / 32 = 50%
  283. ; CHECK: edge if.end -> if.end8 probability is 16 / 32 = 50%
  284. if.end8:
  285. %2 = load i32, i32* %arrayidx9, align 4
  286. %cmp10 = icmp eq i32 %2, %j.017
  287. br i1 %cmp10, label %for.inc, label %if.end12
  288. ; CHECK: edge if.end8 -> for.inc probability is 16 / 32 = 50%
  289. ; CHECK: edge if.end8 -> if.end12 probability is 16 / 32 = 50%
  290. if.end12:
  291. call void @g2()
  292. br label %for.inc
  293. ; CHECK: edge if.end12 -> for.inc probability is 16 / 16 = 100%
  294. for.inc:
  295. %inc = add nsw i32 %j.017, 1
  296. %exitcond = icmp eq i32 %inc, %b
  297. br i1 %exitcond, label %for.end, label %for.body3
  298. ; CHECK: edge for.inc -> for.end probability is 4 / 128
  299. ; CHECK: edge for.inc -> for.body3 probability is 124 / 128
  300. for.end:
  301. call void @g3()
  302. %inc14 = add nsw i32 %i.019, 1
  303. %exitcond20 = icmp eq i32 %inc14, %a
  304. br i1 %exitcond20, label %for.end15, label %for.body
  305. ; CHECK: edge for.end -> for.end15 probability is 4 / 128
  306. ; CHECK: edge for.end -> for.body probability is 124 / 128
  307. for.end15:
  308. call void @g4()
  309. ret void
  310. }