assume.ll 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. ; Function Attrs: nounwind uwtable
  5. define i32 @foo1(i32* %a) #0 {
  6. entry:
  7. %0 = load i32, i32* %a, align 4
  8. ; Check that the alignment has been upgraded and that the assume has not
  9. ; been removed:
  10. ; CHECK-LABEL: @foo1
  11. ; CHECK-DAG: load i32, i32* %a, align 32
  12. ; CHECK-DAG: call void @llvm.assume
  13. ; CHECK: ret i32
  14. %ptrint = ptrtoint i32* %a to i64
  15. %maskedptr = and i64 %ptrint, 31
  16. %maskcond = icmp eq i64 %maskedptr, 0
  17. tail call void @llvm.assume(i1 %maskcond)
  18. ret i32 %0
  19. }
  20. ; Function Attrs: nounwind uwtable
  21. define i32 @foo2(i32* %a) #0 {
  22. entry:
  23. ; Same check as in @foo1, but make sure it works if the assume is first too.
  24. ; CHECK-LABEL: @foo2
  25. ; CHECK-DAG: load i32, i32* %a, align 32
  26. ; CHECK-DAG: call void @llvm.assume
  27. ; CHECK: ret i32
  28. %ptrint = ptrtoint i32* %a to i64
  29. %maskedptr = and i64 %ptrint, 31
  30. %maskcond = icmp eq i64 %maskedptr, 0
  31. tail call void @llvm.assume(i1 %maskcond)
  32. %0 = load i32, i32* %a, align 4
  33. ret i32 %0
  34. }
  35. ; Function Attrs: nounwind
  36. declare void @llvm.assume(i1) #1
  37. define i32 @simple(i32 %a) #1 {
  38. entry:
  39. ; CHECK-LABEL: @simple
  40. ; CHECK: call void @llvm.assume
  41. ; CHECK: ret i32 4
  42. %cmp = icmp eq i32 %a, 4
  43. tail call void @llvm.assume(i1 %cmp)
  44. ret i32 %a
  45. }
  46. ; Function Attrs: nounwind uwtable
  47. define i32 @can1(i1 %a, i1 %b, i1 %c) {
  48. entry:
  49. %and1 = and i1 %a, %b
  50. %and = and i1 %and1, %c
  51. tail call void @llvm.assume(i1 %and)
  52. ; CHECK-LABEL: @can1
  53. ; CHECK: call void @llvm.assume(i1 %a)
  54. ; CHECK: call void @llvm.assume(i1 %b)
  55. ; CHECK: call void @llvm.assume(i1 %c)
  56. ; CHECK: ret i32
  57. ret i32 5
  58. }
  59. ; Function Attrs: nounwind uwtable
  60. define i32 @can2(i1 %a, i1 %b, i1 %c) {
  61. entry:
  62. %v = or i1 %a, %b
  63. %w = xor i1 %v, 1
  64. tail call void @llvm.assume(i1 %w)
  65. ; CHECK-LABEL: @can2
  66. ; CHECK: %[[V1:[^ ]+]] = xor i1 %a, true
  67. ; CHECK: call void @llvm.assume(i1 %[[V1]])
  68. ; CHECK: %[[V2:[^ ]+]] = xor i1 %b, true
  69. ; CHECK: call void @llvm.assume(i1 %[[V2]])
  70. ; CHECK: ret i32
  71. ret i32 5
  72. }
  73. define i32 @bar1(i32 %a) #0 {
  74. entry:
  75. %and1 = and i32 %a, 3
  76. ; CHECK-LABEL: @bar1
  77. ; CHECK: call void @llvm.assume
  78. ; CHECK: ret i32 1
  79. %and = and i32 %a, 7
  80. %cmp = icmp eq i32 %and, 1
  81. tail call void @llvm.assume(i1 %cmp)
  82. ret i32 %and1
  83. }
  84. ; Function Attrs: nounwind uwtable
  85. define i32 @bar2(i32 %a) #0 {
  86. entry:
  87. ; CHECK-LABEL: @bar2
  88. ; CHECK: call void @llvm.assume
  89. ; CHECK: ret i32 1
  90. %and = and i32 %a, 7
  91. %cmp = icmp eq i32 %and, 1
  92. tail call void @llvm.assume(i1 %cmp)
  93. %and1 = and i32 %a, 3
  94. ret i32 %and1
  95. }
  96. ; Function Attrs: nounwind uwtable
  97. define i32 @bar3(i32 %a, i1 %x, i1 %y) #0 {
  98. entry:
  99. %and1 = and i32 %a, 3
  100. ; Don't be fooled by other assumes around.
  101. ; CHECK-LABEL: @bar3
  102. ; CHECK: call void @llvm.assume
  103. ; CHECK: ret i32 1
  104. tail call void @llvm.assume(i1 %x)
  105. %and = and i32 %a, 7
  106. %cmp = icmp eq i32 %and, 1
  107. tail call void @llvm.assume(i1 %cmp)
  108. tail call void @llvm.assume(i1 %y)
  109. ret i32 %and1
  110. }
  111. ; Function Attrs: nounwind uwtable
  112. define i32 @bar4(i32 %a, i32 %b) {
  113. entry:
  114. %and1 = and i32 %b, 3
  115. ; CHECK-LABEL: @bar4
  116. ; CHECK: call void @llvm.assume
  117. ; CHECK: call void @llvm.assume
  118. ; CHECK: ret i32 1
  119. %and = and i32 %a, 7
  120. %cmp = icmp eq i32 %and, 1
  121. tail call void @llvm.assume(i1 %cmp)
  122. %cmp2 = icmp eq i32 %a, %b
  123. tail call void @llvm.assume(i1 %cmp2)
  124. ret i32 %and1
  125. }
  126. define i32 @icmp1(i32 %a) #0 {
  127. entry:
  128. %cmp = icmp sgt i32 %a, 5
  129. tail call void @llvm.assume(i1 %cmp)
  130. %conv = zext i1 %cmp to i32
  131. ret i32 %conv
  132. ; CHECK-LABEL: @icmp1
  133. ; CHECK: call void @llvm.assume
  134. ; CHECK: ret i32 1
  135. }
  136. ; Function Attrs: nounwind uwtable
  137. define i32 @icmp2(i32 %a) #0 {
  138. entry:
  139. %cmp = icmp sgt i32 %a, 5
  140. tail call void @llvm.assume(i1 %cmp)
  141. %0 = zext i1 %cmp to i32
  142. %lnot.ext = xor i32 %0, 1
  143. ret i32 %lnot.ext
  144. ; CHECK-LABEL: @icmp2
  145. ; CHECK: call void @llvm.assume
  146. ; CHECK: ret i32 0
  147. }
  148. declare void @escape(i32* %a)
  149. ; Do we canonicalize a nonnull assumption on a load into
  150. ; metadata form?
  151. define i1 @nonnull1(i32** %a) {
  152. entry:
  153. %load = load i32*, i32** %a
  154. %cmp = icmp ne i32* %load, null
  155. tail call void @llvm.assume(i1 %cmp)
  156. tail call void @escape(i32* %load)
  157. %rval = icmp eq i32* %load, null
  158. ret i1 %rval
  159. ; CHECK-LABEL: @nonnull1
  160. ; CHECK: !nonnull
  161. ; CHECK-NOT: call void @llvm.assume
  162. ; CHECK: ret i1 false
  163. }
  164. ; Make sure the above canonicalization applies only
  165. ; to pointer types. Doing otherwise would be illegal.
  166. define i1 @nonnull2(i32* %a) {
  167. entry:
  168. %load = load i32, i32* %a
  169. %cmp = icmp ne i32 %load, 0
  170. tail call void @llvm.assume(i1 %cmp)
  171. %rval = icmp eq i32 %load, 0
  172. ret i1 %rval
  173. ; CHECK-LABEL: @nonnull2
  174. ; CHECK-NOT: !nonnull
  175. ; CHECK: call void @llvm.assume
  176. }
  177. ; Make sure the above canonicalization does not trigger
  178. ; if the assume is control dependent on something else
  179. define i1 @nonnull3(i32** %a, i1 %control) {
  180. entry:
  181. %load = load i32*, i32** %a
  182. %cmp = icmp ne i32* %load, null
  183. br i1 %control, label %taken, label %not_taken
  184. taken:
  185. tail call void @llvm.assume(i1 %cmp)
  186. %rval = icmp eq i32* %load, null
  187. ret i1 %rval
  188. not_taken:
  189. ret i1 true
  190. ; CHECK-LABEL: @nonnull3
  191. ; CHECK-NOT: !nonnull
  192. ; CHECK: call void @llvm.assume
  193. }
  194. ; Make sure the above canonicalization does not trigger
  195. ; if the path from the load to the assume is potentially
  196. ; interrupted by an exception being thrown
  197. define i1 @nonnull4(i32** %a) {
  198. entry:
  199. %load = load i32*, i32** %a
  200. ;; This call may throw!
  201. tail call void @escape(i32* %load)
  202. %cmp = icmp ne i32* %load, null
  203. tail call void @llvm.assume(i1 %cmp)
  204. %rval = icmp eq i32* %load, null
  205. ret i1 %rval
  206. ; CHECK-LABEL: @nonnull4
  207. ; CHECK-NOT: !nonnull
  208. ; CHECK: call void @llvm.assume
  209. }
  210. attributes #0 = { nounwind uwtable }
  211. attributes #1 = { nounwind }