LandingPadClauses.ll 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. @T1 = external constant i32
  3. @T2 = external constant i32
  4. @T3 = external constant i32
  5. declare i32 @generic_personality(i32, i64, i8*, i8*)
  6. declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
  7. declare i32 @__objc_personality_v0(i32, i64, i8*, i8*)
  8. declare i32 @__C_specific_handler(...)
  9. declare void @bar()
  10. define void @foo_generic() personality i32 (i32, i64, i8*, i8*)* @generic_personality {
  11. ; CHECK-LABEL: @foo_generic(
  12. invoke void @bar()
  13. to label %cont.a unwind label %lpad.a
  14. cont.a:
  15. invoke void @bar()
  16. to label %cont.b unwind label %lpad.b
  17. cont.b:
  18. invoke void @bar()
  19. to label %cont.c unwind label %lpad.c
  20. cont.c:
  21. invoke void @bar()
  22. to label %cont.d unwind label %lpad.d
  23. cont.d:
  24. invoke void @bar()
  25. to label %cont.e unwind label %lpad.e
  26. cont.e:
  27. invoke void @bar()
  28. to label %cont.f unwind label %lpad.f
  29. cont.f:
  30. invoke void @bar()
  31. to label %cont.g unwind label %lpad.g
  32. cont.g:
  33. invoke void @bar()
  34. to label %cont.h unwind label %lpad.h
  35. cont.h:
  36. invoke void @bar()
  37. to label %cont.i unwind label %lpad.i
  38. cont.i:
  39. ret void
  40. lpad.a:
  41. %a = landingpad { i8*, i32 }
  42. catch i32* @T1
  43. catch i32* @T2
  44. catch i32* @T1
  45. catch i32* @T2
  46. unreachable
  47. ; CHECK: %a = landingpad
  48. ; CHECK-NEXT: @T1
  49. ; CHECK-NEXT: @T2
  50. ; CHECK-NEXT: unreachable
  51. lpad.b:
  52. %b = landingpad { i8*, i32 }
  53. filter [0 x i32*] zeroinitializer
  54. catch i32* @T1
  55. unreachable
  56. ; CHECK: %b = landingpad
  57. ; CHECK-NEXT: filter
  58. ; CHECK-NEXT: unreachable
  59. lpad.c:
  60. %c = landingpad { i8*, i32 }
  61. catch i32* @T1
  62. filter [1 x i32*] [i32* @T1]
  63. catch i32* @T2
  64. unreachable
  65. ; CHECK: %c = landingpad
  66. ; CHECK-NEXT: @T1
  67. ; CHECK-NEXT: filter [0 x i32*]
  68. ; CHECK-NEXT: unreachable
  69. lpad.d:
  70. %d = landingpad { i8*, i32 }
  71. filter [3 x i32*] zeroinitializer
  72. unreachable
  73. ; CHECK: %d = landingpad
  74. ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
  75. ; CHECK-NEXT: unreachable
  76. lpad.e:
  77. %e = landingpad { i8*, i32 }
  78. catch i32* @T1
  79. filter [3 x i32*] [i32* @T1, i32* @T2, i32* @T2]
  80. unreachable
  81. ; CHECK: %e = landingpad
  82. ; CHECK-NEXT: @T1
  83. ; CHECK-NEXT: filter [1 x i32*] [i32* @T2]
  84. ; CHECK-NEXT: unreachable
  85. lpad.f:
  86. %f = landingpad { i8*, i32 }
  87. filter [2 x i32*] [i32* @T2, i32* @T1]
  88. filter [1 x i32*] [i32* @T1]
  89. unreachable
  90. ; CHECK: %f = landingpad
  91. ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
  92. ; CHECK-NEXT: unreachable
  93. lpad.g:
  94. %g = landingpad { i8*, i32 }
  95. filter [1 x i32*] [i32* @T1]
  96. catch i32* @T3
  97. filter [2 x i32*] [i32* @T2, i32* @T1]
  98. unreachable
  99. ; CHECK: %g = landingpad
  100. ; CHECK-NEXT: filter [1 x i32*] [i32* @T1]
  101. ; CHECK-NEXT: catch i32* @T3
  102. ; CHECK-NEXT: unreachable
  103. lpad.h:
  104. %h = landingpad { i8*, i32 }
  105. filter [2 x i32*] [i32* @T1, i32* null]
  106. filter [1 x i32*] zeroinitializer
  107. unreachable
  108. ; CHECK: %h = landingpad
  109. ; CHECK-NEXT: filter [1 x i32*] zeroinitializer
  110. ; CHECK-NEXT: unreachable
  111. lpad.i:
  112. %i = landingpad { i8*, i32 }
  113. cleanup
  114. filter [0 x i32*] zeroinitializer
  115. unreachable
  116. ; CHECK: %i = landingpad
  117. ; CHECK-NEXT: filter
  118. ; CHECK-NEXT: unreachable
  119. }
  120. define void @foo_cxx() personality i32 (i32, i64, i8*, i8*)* @__gxx_personality_v0 {
  121. ; CHECK-LABEL: @foo_cxx(
  122. invoke void @bar()
  123. to label %cont.a unwind label %lpad.a
  124. cont.a:
  125. invoke void @bar()
  126. to label %cont.b unwind label %lpad.b
  127. cont.b:
  128. invoke void @bar()
  129. to label %cont.c unwind label %lpad.c
  130. cont.c:
  131. invoke void @bar()
  132. to label %cont.d unwind label %lpad.d
  133. cont.d:
  134. ret void
  135. lpad.a:
  136. %a = landingpad { i8*, i32 }
  137. catch i32* null
  138. catch i32* @T1
  139. unreachable
  140. ; CHECK: %a = landingpad
  141. ; CHECK-NEXT: null
  142. ; CHECK-NEXT: unreachable
  143. lpad.b:
  144. %b = landingpad { i8*, i32 }
  145. filter [1 x i32*] zeroinitializer
  146. unreachable
  147. ; CHECK: %b = landingpad
  148. ; CHECK-NEXT: cleanup
  149. ; CHECK-NEXT: unreachable
  150. lpad.c:
  151. %c = landingpad { i8*, i32 }
  152. filter [2 x i32*] [i32* @T1, i32* null]
  153. unreachable
  154. ; CHECK: %c = landingpad
  155. ; CHECK-NEXT: cleanup
  156. ; CHECK-NEXT: unreachable
  157. lpad.d:
  158. %d = landingpad { i8*, i32 }
  159. cleanup
  160. catch i32* null
  161. unreachable
  162. ; CHECK: %d = landingpad
  163. ; CHECK-NEXT: null
  164. ; CHECK-NEXT: unreachable
  165. }
  166. define void @foo_objc() personality i32 (i32, i64, i8*, i8*)* @__objc_personality_v0 {
  167. ; CHECK-LABEL: @foo_objc(
  168. invoke void @bar()
  169. to label %cont.a unwind label %lpad.a
  170. cont.a:
  171. invoke void @bar()
  172. to label %cont.b unwind label %lpad.b
  173. cont.b:
  174. invoke void @bar()
  175. to label %cont.c unwind label %lpad.c
  176. cont.c:
  177. invoke void @bar()
  178. to label %cont.d unwind label %lpad.d
  179. cont.d:
  180. ret void
  181. lpad.a:
  182. %a = landingpad { i8*, i32 }
  183. catch i32* null
  184. catch i32* @T1
  185. unreachable
  186. ; CHECK: %a = landingpad
  187. ; CHECK-NEXT: null
  188. ; CHECK-NEXT: unreachable
  189. lpad.b:
  190. %b = landingpad { i8*, i32 }
  191. filter [1 x i32*] zeroinitializer
  192. unreachable
  193. ; CHECK: %b = landingpad
  194. ; CHECK-NEXT: cleanup
  195. ; CHECK-NEXT: unreachable
  196. lpad.c:
  197. %c = landingpad { i8*, i32 }
  198. filter [2 x i32*] [i32* @T1, i32* null]
  199. unreachable
  200. ; CHECK: %c = landingpad
  201. ; CHECK-NEXT: cleanup
  202. ; CHECK-NEXT: unreachable
  203. lpad.d:
  204. %d = landingpad { i8*, i32 }
  205. cleanup
  206. catch i32* null
  207. unreachable
  208. ; CHECK: %d = landingpad
  209. ; CHECK-NEXT: null
  210. ; CHECK-NEXT: unreachable
  211. }
  212. define void @foo_seh() personality i32 (...)* @__C_specific_handler {
  213. ; CHECK-LABEL: @foo_seh(
  214. invoke void @bar()
  215. to label %cont.a unwind label %lpad.a
  216. cont.a:
  217. invoke void @bar()
  218. to label %cont.b unwind label %lpad.b
  219. cont.b:
  220. invoke void @bar()
  221. to label %cont.c unwind label %lpad.c
  222. cont.c:
  223. invoke void @bar()
  224. to label %cont.d unwind label %lpad.d
  225. cont.d:
  226. ret void
  227. lpad.a:
  228. %a = landingpad { i8*, i32 }
  229. catch i32* null
  230. catch i32* @T1
  231. unreachable
  232. ; CHECK: %a = landingpad
  233. ; CHECK-NEXT: null
  234. ; CHECK-NEXT: unreachable
  235. lpad.b:
  236. %b = landingpad { i8*, i32 }
  237. filter [1 x i32*] zeroinitializer
  238. unreachable
  239. ; CHECK: %b = landingpad
  240. ; CHECK-NEXT: cleanup
  241. ; CHECK-NEXT: unreachable
  242. lpad.c:
  243. %c = landingpad { i8*, i32 }
  244. filter [2 x i32*] [i32* @T1, i32* null]
  245. unreachable
  246. ; CHECK: %c = landingpad
  247. ; CHECK-NEXT: cleanup
  248. ; CHECK-NEXT: unreachable
  249. lpad.d:
  250. %d = landingpad { i8*, i32 }
  251. cleanup
  252. catch i32* null
  253. unreachable
  254. ; CHECK: %d = landingpad
  255. ; CHECK-NEXT: null
  256. ; CHECK-NEXT: unreachable
  257. }