projectB.ll 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. ; ModuleID = 'data/projectB.c'
  2. source_filename = "data/projectB.c"
  3. target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
  4. target triple = "x86_64-pc-linux-gnu"
  5. @cache = internal global [100 x i32] zeroinitializer, align 16
  6. @__const.projectB_main.str = private unnamed_addr constant [14 x i8] c"Hello, World!\00", align 1
  7. @__const.projectB_main.arr = private unnamed_addr constant [8 x i32] [i32 10, i32 22, i32 9, i32 33, i32 21, i32 50, i32 41, i32 60], align 16
  8. @__const.projectB_main.matrix = private unnamed_addr constant <{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }> <{ <{ i32, i32, i32, [97 x i32] }> <{ i32 1, i32 2, i32 3, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 4, i32 5, i32 6, [97 x i32] zeroinitializer }>, <{ i32, i32, i32, [97 x i32] }> <{ i32 7, i32 8, i32 9, [97 x i32] zeroinitializer }>, [97 x <{ i32, i32, i32, [97 x i32] }>] zeroinitializer }>, align 16
  9. ; Function Attrs: noinline nounwind optnone uwtable
  10. define dso_local void @reverseString(i8* %0) #0 {
  11. %2 = alloca i8*, align 8
  12. %3 = alloca i32, align 4
  13. %4 = alloca i32, align 4
  14. %5 = alloca i8, align 1
  15. store i8* %0, i8** %2, align 8
  16. %6 = load i8*, i8** %2, align 8
  17. %7 = call i64 @strlen(i8* %6) #3
  18. %8 = trunc i64 %7 to i32
  19. store i32 %8, i32* %3, align 4
  20. store i32 0, i32* %4, align 4
  21. br label %9
  22. 9: ; preds = %40, %1
  23. %10 = load i32, i32* %4, align 4
  24. %11 = load i32, i32* %3, align 4
  25. %12 = sdiv i32 %11, 2
  26. %13 = icmp slt i32 %10, %12
  27. br i1 %13, label %14, label %43
  28. 14: ; preds = %9
  29. %15 = load i8*, i8** %2, align 8
  30. %16 = load i32, i32* %4, align 4
  31. %17 = sext i32 %16 to i64
  32. %18 = getelementptr inbounds i8, i8* %15, i64 %17
  33. %19 = load i8, i8* %18, align 1
  34. store i8 %19, i8* %5, align 1
  35. %20 = load i8*, i8** %2, align 8
  36. %21 = load i32, i32* %3, align 4
  37. %22 = sub nsw i32 %21, 1
  38. %23 = load i32, i32* %4, align 4
  39. %24 = sub nsw i32 %22, %23
  40. %25 = sext i32 %24 to i64
  41. %26 = getelementptr inbounds i8, i8* %20, i64 %25
  42. %27 = load i8, i8* %26, align 1
  43. %28 = load i8*, i8** %2, align 8
  44. %29 = load i32, i32* %4, align 4
  45. %30 = sext i32 %29 to i64
  46. %31 = getelementptr inbounds i8, i8* %28, i64 %30
  47. store i8 %27, i8* %31, align 1
  48. %32 = load i8, i8* %5, align 1
  49. %33 = load i8*, i8** %2, align 8
  50. %34 = load i32, i32* %3, align 4
  51. %35 = sub nsw i32 %34, 1
  52. %36 = load i32, i32* %4, align 4
  53. %37 = sub nsw i32 %35, %36
  54. %38 = sext i32 %37 to i64
  55. %39 = getelementptr inbounds i8, i8* %33, i64 %38
  56. store i8 %32, i8* %39, align 1
  57. br label %40
  58. 40: ; preds = %14
  59. %41 = load i32, i32* %4, align 4
  60. %42 = add nsw i32 %41, 1
  61. store i32 %42, i32* %4, align 4
  62. br label %9
  63. 43: ; preds = %9
  64. ret void
  65. }
  66. ; Function Attrs: nounwind readonly
  67. declare dso_local i64 @strlen(i8*) #1
  68. ; Function Attrs: noinline nounwind optnone uwtable
  69. define dso_local i32 @testPoints(i32 %0) #0 {
  70. %2 = alloca i32, align 4
  71. %3 = alloca i32, align 4
  72. %4 = alloca i32, align 4
  73. %5 = alloca i32, align 4
  74. store i32 %0, i32* %3, align 4
  75. store i32 0, i32* %4, align 4
  76. store i32 1, i32* %5, align 4
  77. br label %6
  78. 6: ; preds = %16, %1
  79. %7 = load i32, i32* %5, align 4
  80. %8 = icmp slt i32 %7, 5
  81. br i1 %8, label %9, label %19
  82. 9: ; preds = %6
  83. %10 = load i32, i32* %4, align 4
  84. %11 = add nsw i32 %10, 1
  85. store i32 %11, i32* %4, align 4
  86. %12 = load i32, i32* %3, align 4
  87. %13 = icmp sgt i32 %12, 2
  88. br i1 %13, label %14, label %15
  89. 14: ; preds = %9
  90. store i32 23, i32* %2, align 4
  91. br label %21
  92. 15: ; preds = %9
  93. br label %16
  94. 16: ; preds = %15
  95. %17 = load i32, i32* %5, align 4
  96. %18 = add nsw i32 %17, 1
  97. store i32 %18, i32* %5, align 4
  98. br label %6
  99. 19: ; preds = %6
  100. %20 = load i32, i32* %4, align 4
  101. store i32 %20, i32* %2, align 4
  102. br label %21
  103. 21: ; preds = %19, %14
  104. %22 = load i32, i32* %2, align 4
  105. ret i32 %22
  106. }
  107. ; Function Attrs: noinline nounwind optnone uwtable
  108. define dso_local i32 @countSetBits(i32 %0) #0 {
  109. %2 = alloca i32, align 4
  110. %3 = alloca i32, align 4
  111. store i32 %0, i32* %2, align 4
  112. store i32 0, i32* %3, align 4
  113. br label %4
  114. 4: ; preds = %7, %1
  115. %5 = load i32, i32* %2, align 4
  116. %6 = icmp ne i32 %5, 0
  117. br i1 %6, label %7, label %14
  118. 7: ; preds = %4
  119. %8 = load i32, i32* %2, align 4
  120. %9 = and i32 %8, 1
  121. %10 = load i32, i32* %3, align 4
  122. %11 = add nsw i32 %10, %9
  123. store i32 %11, i32* %3, align 4
  124. %12 = load i32, i32* %2, align 4
  125. %13 = ashr i32 %12, 1
  126. store i32 %13, i32* %2, align 4
  127. br label %4
  128. 14: ; preds = %4
  129. %15 = load i32, i32* %3, align 4
  130. ret i32 %15
  131. }
  132. ; Function Attrs: noinline nounwind optnone uwtable
  133. define dso_local i32 @memoizedFib(i32 %0) #0 {
  134. %2 = alloca i32, align 4
  135. %3 = alloca i32, align 4
  136. store i32 %0, i32* %3, align 4
  137. %4 = load i32, i32* %3, align 4
  138. %5 = sext i32 %4 to i64
  139. %6 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %5
  140. %7 = load i32, i32* %6, align 4
  141. %8 = icmp ne i32 %7, -1
  142. br i1 %8, label %9, label %14
  143. 9: ; preds = %1
  144. %10 = load i32, i32* %3, align 4
  145. %11 = sext i32 %10 to i64
  146. %12 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %11
  147. %13 = load i32, i32* %12, align 4
  148. store i32 %13, i32* %2, align 4
  149. br label %34
  150. 14: ; preds = %1
  151. %15 = load i32, i32* %3, align 4
  152. %16 = icmp sle i32 %15, 1
  153. br i1 %16, label %17, label %19
  154. 17: ; preds = %14
  155. %18 = load i32, i32* %3, align 4
  156. store i32 %18, i32* %2, align 4
  157. br label %34
  158. 19: ; preds = %14
  159. %20 = load i32, i32* %3, align 4
  160. %21 = sub nsw i32 %20, 1
  161. %22 = call i32 @memoizedFib(i32 %21)
  162. %23 = load i32, i32* %3, align 4
  163. %24 = sub nsw i32 %23, 2
  164. %25 = call i32 @memoizedFib(i32 %24)
  165. %26 = add nsw i32 %22, %25
  166. %27 = load i32, i32* %3, align 4
  167. %28 = sext i32 %27 to i64
  168. %29 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %28
  169. store i32 %26, i32* %29, align 4
  170. %30 = load i32, i32* %3, align 4
  171. %31 = sext i32 %30 to i64
  172. %32 = getelementptr inbounds [100 x i32], [100 x i32]* @cache, i64 0, i64 %31
  173. %33 = load i32, i32* %32, align 4
  174. store i32 %33, i32* %2, align 4
  175. br label %34
  176. 34: ; preds = %19, %17, %9
  177. %35 = load i32, i32* %2, align 4
  178. ret i32 %35
  179. }
  180. ; Function Attrs: noinline nounwind optnone uwtable
  181. define dso_local i32 @processMatrix([100 x i32]* %0, i32 %1) #0 {
  182. %3 = alloca [100 x i32]*, align 8
  183. %4 = alloca i32, align 4
  184. %5 = alloca i32, align 4
  185. %6 = alloca i32, align 4
  186. %7 = alloca i32, align 4
  187. store [100 x i32]* %0, [100 x i32]** %3, align 8
  188. store i32 %1, i32* %4, align 4
  189. store i32 0, i32* %5, align 4
  190. store i32 0, i32* %6, align 4
  191. br label %8
  192. 8: ; preds = %77, %2
  193. %9 = load i32, i32* %6, align 4
  194. %10 = load i32, i32* %4, align 4
  195. %11 = icmp slt i32 %9, %10
  196. br i1 %11, label %12, label %80
  197. 12: ; preds = %8
  198. store i32 0, i32* %7, align 4
  199. br label %13
  200. 13: ; preds = %73, %12
  201. %14 = load i32, i32* %7, align 4
  202. %15 = load i32, i32* %4, align 4
  203. %16 = icmp slt i32 %14, %15
  204. br i1 %16, label %17, label %76
  205. 17: ; preds = %13
  206. %18 = load i32, i32* %6, align 4
  207. %19 = load i32, i32* %7, align 4
  208. %20 = icmp eq i32 %18, %19
  209. br i1 %20, label %21, label %55
  210. 21: ; preds = %17
  211. %22 = load [100 x i32]*, [100 x i32]** %3, align 8
  212. %23 = load i32, i32* %6, align 4
  213. %24 = sext i32 %23 to i64
  214. %25 = getelementptr inbounds [100 x i32], [100 x i32]* %22, i64 %24
  215. %26 = load i32, i32* %7, align 4
  216. %27 = sext i32 %26 to i64
  217. %28 = getelementptr inbounds [100 x i32], [100 x i32]* %25, i64 0, i64 %27
  218. %29 = load i32, i32* %28, align 4
  219. %30 = srem i32 %29, 2
  220. %31 = icmp eq i32 %30, 0
  221. br i1 %31, label %32, label %43
  222. 32: ; preds = %21
  223. %33 = load [100 x i32]*, [100 x i32]** %3, align 8
  224. %34 = load i32, i32* %6, align 4
  225. %35 = sext i32 %34 to i64
  226. %36 = getelementptr inbounds [100 x i32], [100 x i32]* %33, i64 %35
  227. %37 = load i32, i32* %7, align 4
  228. %38 = sext i32 %37 to i64
  229. %39 = getelementptr inbounds [100 x i32], [100 x i32]* %36, i64 0, i64 %38
  230. %40 = load i32, i32* %39, align 4
  231. %41 = load i32, i32* %5, align 4
  232. %42 = add nsw i32 %41, %40
  233. store i32 %42, i32* %5, align 4
  234. br label %54
  235. 43: ; preds = %21
  236. %44 = load [100 x i32]*, [100 x i32]** %3, align 8
  237. %45 = load i32, i32* %6, align 4
  238. %46 = sext i32 %45 to i64
  239. %47 = getelementptr inbounds [100 x i32], [100 x i32]* %44, i64 %46
  240. %48 = load i32, i32* %7, align 4
  241. %49 = sext i32 %48 to i64
  242. %50 = getelementptr inbounds [100 x i32], [100 x i32]* %47, i64 0, i64 %49
  243. %51 = load i32, i32* %50, align 4
  244. %52 = load i32, i32* %5, align 4
  245. %53 = sub nsw i32 %52, %51
  246. store i32 %53, i32* %5, align 4
  247. br label %54
  248. 54: ; preds = %43, %32
  249. br label %72
  250. 55: ; preds = %17
  251. %56 = load i32, i32* %6, align 4
  252. %57 = load i32, i32* %7, align 4
  253. %58 = icmp slt i32 %56, %57
  254. br i1 %58, label %59, label %71
  255. 59: ; preds = %55
  256. %60 = load [100 x i32]*, [100 x i32]** %3, align 8
  257. %61 = load i32, i32* %6, align 4
  258. %62 = sext i32 %61 to i64
  259. %63 = getelementptr inbounds [100 x i32], [100 x i32]* %60, i64 %62
  260. %64 = load i32, i32* %7, align 4
  261. %65 = sext i32 %64 to i64
  262. %66 = getelementptr inbounds [100 x i32], [100 x i32]* %63, i64 0, i64 %65
  263. %67 = load i32, i32* %66, align 4
  264. %68 = call i32 @countSetBits(i32 %67)
  265. %69 = load i32, i32* %5, align 4
  266. %70 = add nsw i32 %69, %68
  267. store i32 %70, i32* %5, align 4
  268. br label %71
  269. 71: ; preds = %59, %55
  270. br label %72
  271. 72: ; preds = %71, %54
  272. br label %73
  273. 73: ; preds = %72
  274. %74 = load i32, i32* %7, align 4
  275. %75 = add nsw i32 %74, 1
  276. store i32 %75, i32* %7, align 4
  277. br label %13
  278. 76: ; preds = %13
  279. br label %77
  280. 77: ; preds = %76
  281. %78 = load i32, i32* %6, align 4
  282. %79 = add nsw i32 %78, 1
  283. store i32 %79, i32* %6, align 4
  284. br label %8
  285. 80: ; preds = %8
  286. %81 = load i32, i32* %5, align 4
  287. ret i32 %81
  288. }
  289. ; Function Attrs: noinline nounwind optnone uwtable
  290. define dso_local i32 @projectB_main() #0 {
  291. %1 = alloca [14 x i8], align 1
  292. %2 = alloca [8 x i32], align 16
  293. %3 = alloca i32, align 4
  294. %4 = alloca [100 x [100 x i32]], align 16
  295. %5 = alloca i32, align 4
  296. %6 = alloca i32, align 4
  297. %7 = alloca i32, align 4
  298. %8 = call i32 @testPoints(i32 5)
  299. call void @llvm.memset.p0i8.i64(i8* align 16 bitcast ([100 x i32]* @cache to i8*), i8 -1, i64 400, i1 false)
  300. %9 = bitcast [14 x i8]* %1 to i8*
  301. call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %9, i8* align 1 getelementptr inbounds ([14 x i8], [14 x i8]* @__const.projectB_main.str, i32 0, i32 0), i64 14, i1 false)
  302. %10 = getelementptr inbounds [14 x i8], [14 x i8]* %1, i64 0, i64 0
  303. call void @reverseString(i8* %10)
  304. %11 = bitcast [8 x i32]* %2 to i8*
  305. call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %11, i8* align 16 bitcast ([8 x i32]* @__const.projectB_main.arr to i8*), i64 32, i1 false)
  306. store i32 8, i32* %3, align 4
  307. %12 = bitcast [100 x [100 x i32]]* %4 to i8*
  308. call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 16 %12, i8* align 16 bitcast (<{ <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, <{ i32, i32, i32, [97 x i32] }>, [97 x <{ i32, i32, i32, [97 x i32] }>] }>* @__const.projectB_main.matrix to i8*), i64 40000, i1 false)
  309. %13 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %4, i64 0, i64 0
  310. %14 = call i32 @processMatrix([100 x i32]* %13, i32 3)
  311. store i32 %14, i32* %5, align 4
  312. store i32 0, i32* %6, align 4
  313. br label %15
  314. 15: ; preds = %20, %0
  315. %16 = load i32, i32* %6, align 4
  316. %17 = call i32 @memoizedFib(i32 %16)
  317. %18 = load i32, i32* %6, align 4
  318. %19 = add nsw i32 %18, 1
  319. store i32 %19, i32* %6, align 4
  320. br label %20
  321. 20: ; preds = %15
  322. %21 = load i32, i32* %6, align 4
  323. %22 = icmp slt i32 %21, 10
  324. br i1 %22, label %15, label %23
  325. 23: ; preds = %20
  326. %24 = load i32, i32* %5, align 4
  327. %25 = icmp sgt i32 %24, 0
  328. br i1 %25, label %26, label %28
  329. 26: ; preds = %23
  330. %27 = call i32 @memoizedFib(i32 7)
  331. store i32 %27, i32* %7, align 4
  332. br label %31
  333. 28: ; preds = %23
  334. %29 = load i32, i32* %5, align 4
  335. %30 = call i32 @countSetBits(i32 %29)
  336. store i32 %30, i32* %7, align 4
  337. br label %31
  338. 31: ; preds = %28, %26
  339. %32 = load i32, i32* %7, align 4
  340. ret i32 %32
  341. }
  342. ; Function Attrs: argmemonly nounwind willreturn
  343. declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #2
  344. ; Function Attrs: argmemonly nounwind willreturn
  345. declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #2
  346. attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
  347. attributes #1 = { nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
  348. attributes #2 = { argmemonly nounwind willreturn }
  349. attributes #3 = { nounwind readonly }
  350. !llvm.module.flags = !{!0}
  351. !llvm.ident = !{!1}
  352. !0 = !{i32 1, !"wchar_size", i32 4}
  353. !1 = !{!"clang version 10.0.0-4ubuntu1 "}