spec.ll 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. ; RUN: opt < %s -S -speculative-execution \
  2. ; RUN: -spec-exec-max-speculation-cost 4 -spec-exec-max-not-hoisted 3 \
  3. ; RUN: | FileCheck %s
  4. target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
  5. ; Hoist in if-then pattern.
  6. define void @ifThen() {
  7. ; CHECK-LABEL: @ifThen(
  8. ; CHECK: %x = add i32 2, 3
  9. ; CHECK: br i1 true
  10. br i1 true, label %a, label %b
  11. ; CHECK: a:
  12. a:
  13. %x = add i32 2, 3
  14. ; CHECK: br label
  15. br label %b
  16. ; CHECK: b:
  17. b:
  18. ; CHECK: ret void
  19. ret void
  20. }
  21. ; Hoist in if-else pattern.
  22. define void @ifElse() {
  23. ; CHECK-LABEL: @ifElse(
  24. ; CHECK: %x = add i32 2, 3
  25. ; CHECK: br i1 true
  26. br i1 true, label %b, label %a
  27. ; CHECK: a:
  28. a:
  29. %x = add i32 2, 3
  30. ; CHECK: br label
  31. br label %b
  32. ; CHECK: b:
  33. b:
  34. ; CHECK: ret void
  35. ret void
  36. }
  37. ; Hoist in if-then-else pattern if it is equivalent to if-then.
  38. define void @ifElseThenAsIfThen() {
  39. ; CHECK-LABEL: @ifElseThenAsIfThen(
  40. ; CHECK: %x = add i32 2, 3
  41. ; CHECK: br
  42. br i1 true, label %a, label %b
  43. ; CHECK: a:
  44. a:
  45. %x = add i32 2, 3
  46. ; CHECK: br label
  47. br label %c
  48. ; CHECK: b:
  49. b:
  50. br label %c
  51. ; CHECK: c
  52. c:
  53. ret void
  54. }
  55. ; Hoist in if-then-else pattern if it is equivalent to if-else.
  56. define void @ifElseThenAsIfElse() {
  57. ; CHECK-LABEL: @ifElseThenAsIfElse(
  58. ; CHECK: %x = add i32 2, 3
  59. ; CHECK: br
  60. br i1 true, label %b, label %a
  61. ; CHECK: a:
  62. a:
  63. %x = add i32 2, 3
  64. ; CHECK: br label
  65. br label %c
  66. ; CHECK: b:
  67. b:
  68. br label %c
  69. ; CHECK: c
  70. c:
  71. ret void
  72. }
  73. ; Do not hoist if-then-else pattern if it is not equivalent to if-then
  74. ; or if-else.
  75. define void @ifElseThen() {
  76. ; CHECK-LABEL: @ifElseThen(
  77. ; CHECK: br
  78. br i1 true, label %a, label %b
  79. ; CHECK: a:
  80. a:
  81. ; CHECK: %x = add
  82. %x = add i32 2, 3
  83. ; CHECK: br label
  84. br label %c
  85. ; CHECK: b:
  86. b:
  87. ; CHECK: %y = add
  88. %y = add i32 2, 3
  89. br label %c
  90. ; CHECK: c
  91. c:
  92. ret void
  93. }
  94. ; Do not hoist loads and do not hoist an instruction past a definition of
  95. ; an operand.
  96. define void @doNotHoistPastDef() {
  97. ; CHECK-LABEL: @doNotHoistPastDef(
  98. br i1 true, label %b, label %a
  99. ; CHECK-NOT: load
  100. ; CHECK-NOT: add
  101. ; CHECK: a:
  102. a:
  103. ; CHECK: %def = load
  104. %def = load i32, i32* null
  105. ; CHECK: %use = add
  106. %use = add i32 %def, 0
  107. br label %b
  108. ; CHECK: b:
  109. b:
  110. ret void
  111. }
  112. ; Case with nothing to speculate.
  113. define void @nothingToSpeculate() {
  114. ; CHECK-LABEL: @nothingToSpeculate(
  115. br i1 true, label %b, label %a
  116. ; CHECK: a:
  117. a:
  118. ; CHECK: %def = load
  119. %def = load i32, i32* null
  120. br label %b
  121. ; CHECK: b:
  122. b:
  123. ret void
  124. }
  125. ; Still hoist if an operand is defined before the block or is itself hoisted.
  126. define void @hoistIfNotPastDef() {
  127. ; CHECK-LABEL: @hoistIfNotPastDef(
  128. ; CHECK: %x = load
  129. %x = load i32, i32* null
  130. ; CHECK: %y = add i32 %x, 1
  131. ; CHECK: %z = add i32 %y, 1
  132. ; CHECK: br
  133. br i1 true, label %b, label %a
  134. ; CHECK: a:
  135. a:
  136. %y = add i32 %x, 1
  137. %z = add i32 %y, 1
  138. br label %b
  139. ; CHECK: b:
  140. b:
  141. ret void
  142. }
  143. ; Do not hoist if the speculation cost is too high.
  144. define void @costTooHigh() {
  145. ; CHECK-LABEL: @costTooHigh(
  146. ; CHECK: br
  147. br i1 true, label %b, label %a
  148. ; CHECK: a:
  149. a:
  150. ; CHECK: %r1 = add
  151. %r1 = add i32 1, 1
  152. ; CHECK: %r2 = add
  153. %r2 = add i32 1, 1
  154. ; CHECK: %r3 = add
  155. %r3 = add i32 1, 1
  156. ; CHECK: %r4 = add
  157. %r4 = add i32 1, 1
  158. ; CHECK: %r5 = add
  159. %r5 = add i32 1, 1
  160. br label %b
  161. ; CHECK: b:
  162. b:
  163. ret void
  164. }
  165. ; Do not hoist if too many instructions are left behind.
  166. define void @tooMuchLeftBehind() {
  167. ; CHECK-LABEL: @tooMuchLeftBehind(
  168. ; CHECK: br
  169. br i1 true, label %b, label %a
  170. ; CHECK: a:
  171. a:
  172. ; CHECK: %x = load
  173. %x = load i32, i32* null
  174. ; CHECK: %r1 = add
  175. %r1 = add i32 %x, 1
  176. ; CHECK: %r2 = add
  177. %r2 = add i32 %x, 1
  178. ; CHECK: %r3 = add
  179. %r3 = add i32 %x, 1
  180. br label %b
  181. ; CHECK: b:
  182. b:
  183. ret void
  184. }