inst-limits.ll 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. ; RUN: opt -S -dse < %s | FileCheck %s
  2. target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
  3. ; If there are two stores to the same location, DSE should be able to remove
  4. ; the first store if the two stores are separated by no more than 98
  5. ; instructions. The existence of debug intrinsics between the stores should
  6. ; not affect this instruction limit.
  7. @x = global i32 0, align 4
  8. ; Function Attrs: nounwind
  9. define i32 @test_within_limit() {
  10. entry:
  11. ; The first store; later there is a second store to the same location,
  12. ; so this store should be optimized away by DSE.
  13. ; CHECK-NOT: store i32 1, i32* @x, align 4
  14. store i32 1, i32* @x, align 4
  15. ; Insert 98 dummy instructions between the two stores
  16. %0 = bitcast i32 0 to i32
  17. %1 = bitcast i32 0 to i32
  18. %2 = bitcast i32 0 to i32
  19. %3 = bitcast i32 0 to i32
  20. %4 = bitcast i32 0 to i32
  21. %5 = bitcast i32 0 to i32
  22. %6 = bitcast i32 0 to i32
  23. %7 = bitcast i32 0 to i32
  24. %8 = bitcast i32 0 to i32
  25. %9 = bitcast i32 0 to i32
  26. %10 = bitcast i32 0 to i32
  27. %11 = bitcast i32 0 to i32
  28. %12 = bitcast i32 0 to i32
  29. %13 = bitcast i32 0 to i32
  30. %14 = bitcast i32 0 to i32
  31. %15 = bitcast i32 0 to i32
  32. %16 = bitcast i32 0 to i32
  33. %17 = bitcast i32 0 to i32
  34. %18 = bitcast i32 0 to i32
  35. %19 = bitcast i32 0 to i32
  36. %20 = bitcast i32 0 to i32
  37. %21 = bitcast i32 0 to i32
  38. %22 = bitcast i32 0 to i32
  39. %23 = bitcast i32 0 to i32
  40. %24 = bitcast i32 0 to i32
  41. %25 = bitcast i32 0 to i32
  42. %26 = bitcast i32 0 to i32
  43. %27 = bitcast i32 0 to i32
  44. %28 = bitcast i32 0 to i32
  45. %29 = bitcast i32 0 to i32
  46. %30 = bitcast i32 0 to i32
  47. %31 = bitcast i32 0 to i32
  48. %32 = bitcast i32 0 to i32
  49. %33 = bitcast i32 0 to i32
  50. %34 = bitcast i32 0 to i32
  51. %35 = bitcast i32 0 to i32
  52. %36 = bitcast i32 0 to i32
  53. %37 = bitcast i32 0 to i32
  54. %38 = bitcast i32 0 to i32
  55. %39 = bitcast i32 0 to i32
  56. %40 = bitcast i32 0 to i32
  57. %41 = bitcast i32 0 to i32
  58. %42 = bitcast i32 0 to i32
  59. %43 = bitcast i32 0 to i32
  60. %44 = bitcast i32 0 to i32
  61. %45 = bitcast i32 0 to i32
  62. %46 = bitcast i32 0 to i32
  63. %47 = bitcast i32 0 to i32
  64. %48 = bitcast i32 0 to i32
  65. %49 = bitcast i32 0 to i32
  66. %50 = bitcast i32 0 to i32
  67. %51 = bitcast i32 0 to i32
  68. %52 = bitcast i32 0 to i32
  69. %53 = bitcast i32 0 to i32
  70. %54 = bitcast i32 0 to i32
  71. %55 = bitcast i32 0 to i32
  72. %56 = bitcast i32 0 to i32
  73. %57 = bitcast i32 0 to i32
  74. %58 = bitcast i32 0 to i32
  75. %59 = bitcast i32 0 to i32
  76. %60 = bitcast i32 0 to i32
  77. %61 = bitcast i32 0 to i32
  78. %62 = bitcast i32 0 to i32
  79. %63 = bitcast i32 0 to i32
  80. %64 = bitcast i32 0 to i32
  81. %65 = bitcast i32 0 to i32
  82. %66 = bitcast i32 0 to i32
  83. %67 = bitcast i32 0 to i32
  84. %68 = bitcast i32 0 to i32
  85. %69 = bitcast i32 0 to i32
  86. %70 = bitcast i32 0 to i32
  87. %71 = bitcast i32 0 to i32
  88. %72 = bitcast i32 0 to i32
  89. %73 = bitcast i32 0 to i32
  90. %74 = bitcast i32 0 to i32
  91. %75 = bitcast i32 0 to i32
  92. %76 = bitcast i32 0 to i32
  93. %77 = bitcast i32 0 to i32
  94. %78 = bitcast i32 0 to i32
  95. %79 = bitcast i32 0 to i32
  96. %80 = bitcast i32 0 to i32
  97. %81 = bitcast i32 0 to i32
  98. %82 = bitcast i32 0 to i32
  99. %83 = bitcast i32 0 to i32
  100. %84 = bitcast i32 0 to i32
  101. %85 = bitcast i32 0 to i32
  102. %86 = bitcast i32 0 to i32
  103. %87 = bitcast i32 0 to i32
  104. %88 = bitcast i32 0 to i32
  105. %89 = bitcast i32 0 to i32
  106. %90 = bitcast i32 0 to i32
  107. %91 = bitcast i32 0 to i32
  108. %92 = bitcast i32 0 to i32
  109. %93 = bitcast i32 0 to i32
  110. %94 = bitcast i32 0 to i32
  111. %95 = bitcast i32 0 to i32
  112. %96 = bitcast i32 0 to i32
  113. %97 = bitcast i32 0 to i32
  114. ; Insert a meaningless dbg.value intrinsic; it should have no
  115. ; effect on the working of DSE in any way.
  116. call void @llvm.dbg.value(metadata i32* undef, i64 0, metadata !10, metadata !DIExpression()), !dbg !DILocation(scope: !4)
  117. ; CHECK: store i32 -1, i32* @x, align 4
  118. store i32 -1, i32* @x, align 4
  119. ret i32 0
  120. }
  121. ; Function Attrs: nounwind
  122. define i32 @test_outside_limit() {
  123. entry:
  124. ; The first store; later there is a second store to the same location
  125. ; CHECK: store i32 1, i32* @x, align 4
  126. store i32 1, i32* @x, align 4
  127. ; Insert 99 dummy instructions between the two stores; this is
  128. ; one too many instruction for the DSE to take place.
  129. %0 = bitcast i32 0 to i32
  130. %1 = bitcast i32 0 to i32
  131. %2 = bitcast i32 0 to i32
  132. %3 = bitcast i32 0 to i32
  133. %4 = bitcast i32 0 to i32
  134. %5 = bitcast i32 0 to i32
  135. %6 = bitcast i32 0 to i32
  136. %7 = bitcast i32 0 to i32
  137. %8 = bitcast i32 0 to i32
  138. %9 = bitcast i32 0 to i32
  139. %10 = bitcast i32 0 to i32
  140. %11 = bitcast i32 0 to i32
  141. %12 = bitcast i32 0 to i32
  142. %13 = bitcast i32 0 to i32
  143. %14 = bitcast i32 0 to i32
  144. %15 = bitcast i32 0 to i32
  145. %16 = bitcast i32 0 to i32
  146. %17 = bitcast i32 0 to i32
  147. %18 = bitcast i32 0 to i32
  148. %19 = bitcast i32 0 to i32
  149. %20 = bitcast i32 0 to i32
  150. %21 = bitcast i32 0 to i32
  151. %22 = bitcast i32 0 to i32
  152. %23 = bitcast i32 0 to i32
  153. %24 = bitcast i32 0 to i32
  154. %25 = bitcast i32 0 to i32
  155. %26 = bitcast i32 0 to i32
  156. %27 = bitcast i32 0 to i32
  157. %28 = bitcast i32 0 to i32
  158. %29 = bitcast i32 0 to i32
  159. %30 = bitcast i32 0 to i32
  160. %31 = bitcast i32 0 to i32
  161. %32 = bitcast i32 0 to i32
  162. %33 = bitcast i32 0 to i32
  163. %34 = bitcast i32 0 to i32
  164. %35 = bitcast i32 0 to i32
  165. %36 = bitcast i32 0 to i32
  166. %37 = bitcast i32 0 to i32
  167. %38 = bitcast i32 0 to i32
  168. %39 = bitcast i32 0 to i32
  169. %40 = bitcast i32 0 to i32
  170. %41 = bitcast i32 0 to i32
  171. %42 = bitcast i32 0 to i32
  172. %43 = bitcast i32 0 to i32
  173. %44 = bitcast i32 0 to i32
  174. %45 = bitcast i32 0 to i32
  175. %46 = bitcast i32 0 to i32
  176. %47 = bitcast i32 0 to i32
  177. %48 = bitcast i32 0 to i32
  178. %49 = bitcast i32 0 to i32
  179. %50 = bitcast i32 0 to i32
  180. %51 = bitcast i32 0 to i32
  181. %52 = bitcast i32 0 to i32
  182. %53 = bitcast i32 0 to i32
  183. %54 = bitcast i32 0 to i32
  184. %55 = bitcast i32 0 to i32
  185. %56 = bitcast i32 0 to i32
  186. %57 = bitcast i32 0 to i32
  187. %58 = bitcast i32 0 to i32
  188. %59 = bitcast i32 0 to i32
  189. %60 = bitcast i32 0 to i32
  190. %61 = bitcast i32 0 to i32
  191. %62 = bitcast i32 0 to i32
  192. %63 = bitcast i32 0 to i32
  193. %64 = bitcast i32 0 to i32
  194. %65 = bitcast i32 0 to i32
  195. %66 = bitcast i32 0 to i32
  196. %67 = bitcast i32 0 to i32
  197. %68 = bitcast i32 0 to i32
  198. %69 = bitcast i32 0 to i32
  199. %70 = bitcast i32 0 to i32
  200. %71 = bitcast i32 0 to i32
  201. %72 = bitcast i32 0 to i32
  202. %73 = bitcast i32 0 to i32
  203. %74 = bitcast i32 0 to i32
  204. %75 = bitcast i32 0 to i32
  205. %76 = bitcast i32 0 to i32
  206. %77 = bitcast i32 0 to i32
  207. %78 = bitcast i32 0 to i32
  208. %79 = bitcast i32 0 to i32
  209. %80 = bitcast i32 0 to i32
  210. %81 = bitcast i32 0 to i32
  211. %82 = bitcast i32 0 to i32
  212. %83 = bitcast i32 0 to i32
  213. %84 = bitcast i32 0 to i32
  214. %85 = bitcast i32 0 to i32
  215. %86 = bitcast i32 0 to i32
  216. %87 = bitcast i32 0 to i32
  217. %88 = bitcast i32 0 to i32
  218. %89 = bitcast i32 0 to i32
  219. %90 = bitcast i32 0 to i32
  220. %91 = bitcast i32 0 to i32
  221. %92 = bitcast i32 0 to i32
  222. %93 = bitcast i32 0 to i32
  223. %94 = bitcast i32 0 to i32
  224. %95 = bitcast i32 0 to i32
  225. %96 = bitcast i32 0 to i32
  226. %97 = bitcast i32 0 to i32
  227. %98 = bitcast i32 0 to i32
  228. ; CHECK: store i32 -1, i32* @x, align 4
  229. store i32 -1, i32* @x, align 4
  230. ret i32 0
  231. }
  232. ; Function Attrs: nounwind readnone
  233. declare void @llvm.dbg.value(metadata, i64, metadata, metadata)
  234. !llvm.dbg.cu = !{!0}
  235. !llvm.module.flags = !{!11, !13}
  236. !0 = !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.4", isOptimized: true, emissionKind: 0, file: !1, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imports: !2)
  237. !1 = !DIFile(filename: "test.c", directory: "/home/tmp")
  238. !2 = !{}
  239. !3 = !{!4}
  240. !4 = !DISubprogram(name: "test_within_limit", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 4, file: !1, scope: !5, type: !6, function: i32 ()* @test_within_limit, variables: !2)
  241. !5 = !DIFile(filename: "test.c", directory: "/home/tmp")
  242. !6 = !DISubroutineType(types: !7)
  243. !7 = !{!8}
  244. !8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
  245. !9 = !{!10}
  246. !10 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "x", scope: !4, type: !8)
  247. !11 = !{i32 2, !"Dwarf Version", i32 4}
  248. !12 = !{i32* undef}
  249. !13 = !{i32 1, !"Debug Info Version", i32 3}