switch_to_lookup_table.ll 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. ; RUN: opt < %s -simplifycfg -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. ; The table for @f
  5. ; CHECK: @switch.table = private unnamed_addr constant [7 x i32] [i32 55, i32 123, i32 0, i32 -1, i32 27, i32 62, i32 1]
  6. ; The float table for @h
  7. ; CHECK: @switch.table.1 = private unnamed_addr constant [4 x float] [float 0x40091EB860000000, float 0x3FF3BE76C0000000, float 0x4012449BA0000000, float 0x4001AE1480000000]
  8. ; The table for @foostring
  9. ; CHECK: @switch.table.2 = private unnamed_addr constant [4 x i8*] [i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i64 0, i64 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str3, i64 0, i64 0)]
  10. ; The table for @earlyreturncrash
  11. ; CHECK: @switch.table.3 = private unnamed_addr constant [4 x i32] [i32 42, i32 9, i32 88, i32 5]
  12. ; The table for @large.
  13. ; CHECK: @switch.table.4 = private unnamed_addr constant [199 x i32] [i32 1, i32 4, i32 9,
  14. ; The table for @cprop
  15. ; CHECK: @switch.table.5 = private unnamed_addr constant [7 x i32] [i32 5, i32 42, i32 126, i32 -452, i32 128, i32 6, i32 7]
  16. ; The table for @unreachable_case
  17. ; CHECK: @switch.table.6 = private unnamed_addr constant [9 x i32] [i32 0, i32 0, i32 0, i32 2, i32 -1, i32 1, i32 1, i32 1, i32 1]
  18. ; A simple int-to-int selection switch.
  19. ; It is dense enough to be replaced by table lookup.
  20. ; The result is directly by a ret from an otherwise empty bb,
  21. ; so we return early, directly from the lookup bb.
  22. define i32 @f(i32 %c) {
  23. entry:
  24. switch i32 %c, label %sw.default [
  25. i32 42, label %return
  26. i32 43, label %sw.bb1
  27. i32 44, label %sw.bb2
  28. i32 45, label %sw.bb3
  29. i32 46, label %sw.bb4
  30. i32 47, label %sw.bb5
  31. i32 48, label %sw.bb6
  32. ]
  33. sw.bb1: br label %return
  34. sw.bb2: br label %return
  35. sw.bb3: br label %return
  36. sw.bb4: br label %return
  37. sw.bb5: br label %return
  38. sw.bb6: br label %return
  39. sw.default: br label %return
  40. return:
  41. %retval.0 = phi i32 [ 15, %sw.default ], [ 1, %sw.bb6 ], [ 62, %sw.bb5 ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ]
  42. ret i32 %retval.0
  43. ; CHECK-LABEL: @f(
  44. ; CHECK: entry:
  45. ; CHECK-NEXT: %switch.tableidx = sub i32 %c, 42
  46. ; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 7
  47. ; CHECK-NEXT: br i1 %0, label %switch.lookup, label %return
  48. ; CHECK: switch.lookup:
  49. ; CHECK-NEXT: %switch.gep = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table, i32 0, i32 %switch.tableidx
  50. ; CHECK-NEXT: %switch.load = load i32, i32* %switch.gep
  51. ; CHECK-NEXT: ret i32 %switch.load
  52. ; CHECK: return:
  53. ; CHECK-NEXT: ret i32 15
  54. }
  55. ; A switch used to initialize two variables, an i8 and a float.
  56. declare void @dummy(i8 signext, float)
  57. define void @h(i32 %x) {
  58. entry:
  59. switch i32 %x, label %sw.default [
  60. i32 0, label %sw.epilog
  61. i32 1, label %sw.bb1
  62. i32 2, label %sw.bb2
  63. i32 3, label %sw.bb3
  64. ]
  65. sw.bb1: br label %sw.epilog
  66. sw.bb2: br label %sw.epilog
  67. sw.bb3: br label %sw.epilog
  68. sw.default: br label %sw.epilog
  69. sw.epilog:
  70. %a.0 = phi i8 [ 7, %sw.default ], [ 5, %sw.bb3 ], [ 88, %sw.bb2 ], [ 9, %sw.bb1 ], [ 42, %entry ]
  71. %b.0 = phi float [ 0x4023FAE140000000, %sw.default ], [ 0x4001AE1480000000, %sw.bb3 ], [ 0x4012449BA0000000, %sw.bb2 ], [ 0x3FF3BE76C0000000, %sw.bb1 ], [ 0x40091EB860000000, %entry ]
  72. call void @dummy(i8 signext %a.0, float %b.0)
  73. ret void
  74. ; CHECK-LABEL: @h(
  75. ; CHECK: entry:
  76. ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0
  77. ; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 4
  78. ; CHECK-NEXT: br i1 %0, label %switch.lookup, label %sw.epilog
  79. ; CHECK: switch.lookup:
  80. ; CHECK-NEXT: %switch.shiftamt = mul i32 %switch.tableidx, 8
  81. ; CHECK-NEXT: %switch.downshift = lshr i32 89655594, %switch.shiftamt
  82. ; CHECK-NEXT: %switch.masked = trunc i32 %switch.downshift to i8
  83. ; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x float], [4 x float]* @switch.table.1, i32 0, i32 %switch.tableidx
  84. ; CHECK-NEXT: %switch.load = load float, float* %switch.gep
  85. ; CHECK-NEXT: br label %sw.epilog
  86. ; CHECK: sw.epilog:
  87. ; CHECK-NEXT: %a.0 = phi i8 [ %switch.masked, %switch.lookup ], [ 7, %entry ]
  88. ; CHECK-NEXT: %b.0 = phi float [ %switch.load, %switch.lookup ], [ 0x4023FAE140000000, %entry ]
  89. ; CHECK-NEXT: call void @dummy(i8 signext %a.0, float %b.0)
  90. ; CHECK-NEXT: ret void
  91. }
  92. ; Switch used to return a string.
  93. @.str = private unnamed_addr constant [4 x i8] c"foo\00", align 1
  94. @.str1 = private unnamed_addr constant [4 x i8] c"bar\00", align 1
  95. @.str2 = private unnamed_addr constant [4 x i8] c"baz\00", align 1
  96. @.str3 = private unnamed_addr constant [4 x i8] c"qux\00", align 1
  97. @.str4 = private unnamed_addr constant [6 x i8] c"error\00", align 1
  98. define i8* @foostring(i32 %x) {
  99. entry:
  100. switch i32 %x, label %sw.default [
  101. i32 0, label %return
  102. i32 1, label %sw.bb1
  103. i32 2, label %sw.bb2
  104. i32 3, label %sw.bb3
  105. ]
  106. sw.bb1: br label %return
  107. sw.bb2: br label %return
  108. sw.bb3: br label %return
  109. sw.default: br label %return
  110. return:
  111. %retval.0 = phi i8* [ getelementptr inbounds ([6 x i8], [6 x i8]* @.str4, i64 0, i64 0), %sw.default ],
  112. [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str3, i64 0, i64 0), %sw.bb3 ],
  113. [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str2, i64 0, i64 0), %sw.bb2 ],
  114. [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str1, i64 0, i64 0), %sw.bb1 ],
  115. [ getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), %entry ]
  116. ret i8* %retval.0
  117. ; CHECK-LABEL: @foostring(
  118. ; CHECK: entry:
  119. ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0
  120. ; CHECK-NEXT: %0 = icmp ult i32 %switch.tableidx, 4
  121. ; CHECK-NEXT: br i1 %0, label %switch.lookup, label %return
  122. ; CHECK: switch.lookup:
  123. ; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i8*], [4 x i8*]* @switch.table.2, i32 0, i32 %switch.tableidx
  124. ; CHECK-NEXT: %switch.load = load i8*, i8** %switch.gep
  125. ; CHECK-NEXT: ret i8* %switch.load
  126. }
  127. ; Switch used to initialize two values. The first value is returned, the second
  128. ; value is not used. This used to make the transformation generate illegal code.
  129. define i32 @earlyreturncrash(i32 %x) {
  130. entry:
  131. switch i32 %x, label %sw.default [
  132. i32 0, label %sw.epilog
  133. i32 1, label %sw.bb1
  134. i32 2, label %sw.bb2
  135. i32 3, label %sw.bb3
  136. ]
  137. sw.bb1: br label %sw.epilog
  138. sw.bb2: br label %sw.epilog
  139. sw.bb3: br label %sw.epilog
  140. sw.default: br label %sw.epilog
  141. sw.epilog:
  142. %a.0 = phi i32 [ 7, %sw.default ], [ 5, %sw.bb3 ], [ 88, %sw.bb2 ], [ 9, %sw.bb1 ], [ 42, %entry ]
  143. %b.0 = phi i32 [ 10, %sw.default ], [ 5, %sw.bb3 ], [ 1, %sw.bb2 ], [ 4, %sw.bb1 ], [ 3, %entry ]
  144. ret i32 %a.0
  145. ; CHECK-LABEL: @earlyreturncrash(
  146. ; CHECK: switch.lookup:
  147. ; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i32], [4 x i32]* @switch.table.3, i32 0, i32 %switch.tableidx
  148. ; CHECK-NEXT: %switch.load = load i32, i32* %switch.gep
  149. ; CHECK-NEXT: ret i32 %switch.load
  150. ; CHECK: sw.epilog:
  151. ; CHECK-NEXT: ret i32 7
  152. }
  153. ; Example 7 from http://blog.regehr.org/archives/320
  154. ; It is not dense enough for a regular table, but the results
  155. ; can be packed into a bitmap.
  156. define i32 @crud(i8 zeroext %c) {
  157. entry:
  158. %cmp = icmp ult i8 %c, 33
  159. br i1 %cmp, label %lor.end, label %switch.early.test
  160. switch.early.test:
  161. switch i8 %c, label %lor.rhs [
  162. i8 92, label %lor.end
  163. i8 62, label %lor.end
  164. i8 60, label %lor.end
  165. i8 59, label %lor.end
  166. i8 58, label %lor.end
  167. i8 46, label %lor.end
  168. i8 44, label %lor.end
  169. i8 34, label %lor.end
  170. i8 39, label %switch.edge
  171. ]
  172. switch.edge: br label %lor.end
  173. lor.rhs: br label %lor.end
  174. lor.end:
  175. %0 = phi i1 [ true, %switch.early.test ],
  176. [ false, %lor.rhs ],
  177. [ true, %entry ],
  178. [ true, %switch.early.test ],
  179. [ true, %switch.early.test ],
  180. [ true, %switch.early.test ],
  181. [ true, %switch.early.test ],
  182. [ true, %switch.early.test ],
  183. [ true, %switch.early.test ],
  184. [ true, %switch.early.test ],
  185. [ true, %switch.edge ]
  186. %lor.ext = zext i1 %0 to i32
  187. ret i32 %lor.ext
  188. ; CHECK-LABEL: @crud(
  189. ; CHECK: entry:
  190. ; CHECK-NEXT: %cmp = icmp ult i8 %c, 33
  191. ; CHECK-NEXT: br i1 %cmp, label %lor.end, label %switch.early.test
  192. ; CHECK: switch.early.test:
  193. ; CHECK-NEXT: %switch.tableidx = sub i8 %c, 34
  194. ; CHECK-NEXT: %0 = icmp ult i8 %switch.tableidx, 59
  195. ; CHECK-NEXT: br i1 %0, label %switch.lookup, label %lor.end
  196. ; CHECK: switch.lookup:
  197. ; CHECK-NEXT: %switch.cast = zext i8 %switch.tableidx to i59
  198. ; CHECK-NEXT: %switch.shiftamt = mul i59 %switch.cast, 1
  199. ; CHECK-NEXT: %switch.downshift = lshr i59 -288230375765830623, %switch.shiftamt
  200. ; CHECK-NEXT: %switch.masked = trunc i59 %switch.downshift to i1
  201. ; CHECK-NEXT: br label %lor.end
  202. ; CHECK: lor.end:
  203. ; CHECK-NEXT: %1 = phi i1 [ true, %entry ], [ %switch.masked, %switch.lookup ], [ false, %switch.early.test ]
  204. ; CHECK-NEXT: %lor.ext = zext i1 %1 to i32
  205. ; CHECK-NEXT: ret i32 %lor.ext
  206. }
  207. ; PR13946
  208. define i32 @overflow(i32 %type) {
  209. entry:
  210. switch i32 %type, label %sw.default [
  211. i32 -2147483648, label %sw.bb
  212. i32 0, label %sw.bb
  213. i32 1, label %sw.bb1
  214. i32 2, label %sw.bb2
  215. i32 -2147483645, label %sw.bb3
  216. i32 3, label %sw.bb3
  217. ]
  218. sw.bb: br label %if.end
  219. sw.bb1: br label %if.end
  220. sw.bb2: br label %if.end
  221. sw.bb3: br label %if.end
  222. sw.default: br label %if.end
  223. if.else: br label %if.end
  224. if.end:
  225. %dirent_type.0 = phi i32 [ 3, %sw.default ], [ 6, %sw.bb3 ], [ 5, %sw.bb2 ], [ 0, %sw.bb1 ], [ 3, %sw.bb ], [ 0, %if.else ]
  226. ret i32 %dirent_type.0
  227. ; CHECK-LABEL: define i32 @overflow(
  228. ; CHECK: switch
  229. ; CHECK: phi
  230. }
  231. ; PR13985
  232. define i1 @undef(i32 %tmp) {
  233. bb:
  234. switch i32 %tmp, label %bb3 [
  235. i32 0, label %bb1
  236. i32 1, label %bb1
  237. i32 7, label %bb2
  238. i32 8, label %bb2
  239. ]
  240. bb1: br label %bb3
  241. bb2: br label %bb3
  242. bb3:
  243. %tmp4 = phi i1 [ undef, %bb ], [ false, %bb2 ], [ true, %bb1 ]
  244. ret i1 %tmp4
  245. ; CHECK-LABEL: define i1 @undef(
  246. ; CHECK: %switch.cast = trunc i32 %switch.tableidx to i9
  247. ; CHECK: %switch.downshift = lshr i9 3, %switch.shiftamt
  248. }
  249. ; Also handle large switches that would be rejected by
  250. ; isValueEqualityComparison()
  251. ; CHECK: large
  252. ; CHECK-NOT: switch i32
  253. define i32 @large(i32 %x) {
  254. entry:
  255. %cmp = icmp slt i32 %x, 0
  256. br i1 %cmp, label %if.then, label %if.end
  257. if.then:
  258. %mul = mul i32 %x, -10
  259. br label %if.end
  260. if.end:
  261. %x.addr.0 = phi i32 [ %mul, %if.then ], [ %x, %entry ]
  262. switch i32 %x.addr.0, label %return [
  263. i32 199, label %sw.bb203
  264. i32 1, label %sw.bb1
  265. i32 2, label %sw.bb2
  266. i32 3, label %sw.bb3
  267. i32 4, label %sw.bb4
  268. i32 5, label %sw.bb5
  269. i32 6, label %sw.bb6
  270. i32 7, label %sw.bb7
  271. i32 8, label %sw.bb8
  272. i32 9, label %sw.bb9
  273. i32 10, label %sw.bb10
  274. i32 11, label %sw.bb11
  275. i32 12, label %sw.bb12
  276. i32 13, label %sw.bb13
  277. i32 14, label %sw.bb14
  278. i32 15, label %sw.bb15
  279. i32 16, label %sw.bb16
  280. i32 17, label %sw.bb17
  281. i32 18, label %sw.bb18
  282. i32 19, label %sw.bb19
  283. i32 20, label %sw.bb20
  284. i32 21, label %sw.bb21
  285. i32 22, label %sw.bb22
  286. i32 23, label %sw.bb23
  287. i32 24, label %sw.bb24
  288. i32 25, label %sw.bb25
  289. i32 26, label %sw.bb26
  290. i32 27, label %sw.bb27
  291. i32 28, label %sw.bb28
  292. i32 29, label %sw.bb29
  293. i32 30, label %sw.bb30
  294. i32 31, label %sw.bb31
  295. i32 32, label %sw.bb32
  296. i32 33, label %sw.bb33
  297. i32 34, label %sw.bb34
  298. i32 35, label %sw.bb35
  299. i32 36, label %sw.bb37
  300. i32 37, label %sw.bb38
  301. i32 38, label %sw.bb39
  302. i32 39, label %sw.bb40
  303. i32 40, label %sw.bb41
  304. i32 41, label %sw.bb42
  305. i32 42, label %sw.bb43
  306. i32 43, label %sw.bb44
  307. i32 44, label %sw.bb45
  308. i32 45, label %sw.bb47
  309. i32 46, label %sw.bb48
  310. i32 47, label %sw.bb49
  311. i32 48, label %sw.bb50
  312. i32 49, label %sw.bb51
  313. i32 50, label %sw.bb52
  314. i32 51, label %sw.bb53
  315. i32 52, label %sw.bb54
  316. i32 53, label %sw.bb55
  317. i32 54, label %sw.bb56
  318. i32 55, label %sw.bb58
  319. i32 56, label %sw.bb59
  320. i32 57, label %sw.bb60
  321. i32 58, label %sw.bb61
  322. i32 59, label %sw.bb62
  323. i32 60, label %sw.bb63
  324. i32 61, label %sw.bb64
  325. i32 62, label %sw.bb65
  326. i32 63, label %sw.bb66
  327. i32 64, label %sw.bb67
  328. i32 65, label %sw.bb68
  329. i32 66, label %sw.bb69
  330. i32 67, label %sw.bb70
  331. i32 68, label %sw.bb71
  332. i32 69, label %sw.bb72
  333. i32 70, label %sw.bb73
  334. i32 71, label %sw.bb74
  335. i32 72, label %sw.bb76
  336. i32 73, label %sw.bb77
  337. i32 74, label %sw.bb78
  338. i32 75, label %sw.bb79
  339. i32 76, label %sw.bb80
  340. i32 77, label %sw.bb81
  341. i32 78, label %sw.bb82
  342. i32 79, label %sw.bb83
  343. i32 80, label %sw.bb84
  344. i32 81, label %sw.bb85
  345. i32 82, label %sw.bb86
  346. i32 83, label %sw.bb87
  347. i32 84, label %sw.bb88
  348. i32 85, label %sw.bb89
  349. i32 86, label %sw.bb90
  350. i32 87, label %sw.bb91
  351. i32 88, label %sw.bb92
  352. i32 89, label %sw.bb93
  353. i32 90, label %sw.bb94
  354. i32 91, label %sw.bb95
  355. i32 92, label %sw.bb96
  356. i32 93, label %sw.bb97
  357. i32 94, label %sw.bb98
  358. i32 95, label %sw.bb99
  359. i32 96, label %sw.bb100
  360. i32 97, label %sw.bb101
  361. i32 98, label %sw.bb102
  362. i32 99, label %sw.bb103
  363. i32 100, label %sw.bb104
  364. i32 101, label %sw.bb105
  365. i32 102, label %sw.bb106
  366. i32 103, label %sw.bb107
  367. i32 104, label %sw.bb108
  368. i32 105, label %sw.bb109
  369. i32 106, label %sw.bb110
  370. i32 107, label %sw.bb111
  371. i32 108, label %sw.bb112
  372. i32 109, label %sw.bb113
  373. i32 110, label %sw.bb114
  374. i32 111, label %sw.bb115
  375. i32 112, label %sw.bb116
  376. i32 113, label %sw.bb117
  377. i32 114, label %sw.bb118
  378. i32 115, label %sw.bb119
  379. i32 116, label %sw.bb120
  380. i32 117, label %sw.bb121
  381. i32 118, label %sw.bb122
  382. i32 119, label %sw.bb123
  383. i32 120, label %sw.bb124
  384. i32 121, label %sw.bb125
  385. i32 122, label %sw.bb126
  386. i32 123, label %sw.bb127
  387. i32 124, label %sw.bb128
  388. i32 125, label %sw.bb129
  389. i32 126, label %sw.bb130
  390. i32 127, label %sw.bb131
  391. i32 128, label %sw.bb132
  392. i32 129, label %sw.bb133
  393. i32 130, label %sw.bb134
  394. i32 131, label %sw.bb135
  395. i32 132, label %sw.bb136
  396. i32 133, label %sw.bb137
  397. i32 134, label %sw.bb138
  398. i32 135, label %sw.bb139
  399. i32 136, label %sw.bb140
  400. i32 137, label %sw.bb141
  401. i32 138, label %sw.bb142
  402. i32 139, label %sw.bb143
  403. i32 140, label %sw.bb144
  404. i32 141, label %sw.bb145
  405. i32 142, label %sw.bb146
  406. i32 143, label %sw.bb147
  407. i32 144, label %sw.bb148
  408. i32 145, label %sw.bb149
  409. i32 146, label %sw.bb150
  410. i32 147, label %sw.bb151
  411. i32 148, label %sw.bb152
  412. i32 149, label %sw.bb153
  413. i32 150, label %sw.bb154
  414. i32 151, label %sw.bb155
  415. i32 152, label %sw.bb156
  416. i32 153, label %sw.bb157
  417. i32 154, label %sw.bb158
  418. i32 155, label %sw.bb159
  419. i32 156, label %sw.bb160
  420. i32 157, label %sw.bb161
  421. i32 158, label %sw.bb162
  422. i32 159, label %sw.bb163
  423. i32 160, label %sw.bb164
  424. i32 161, label %sw.bb165
  425. i32 162, label %sw.bb166
  426. i32 163, label %sw.bb167
  427. i32 164, label %sw.bb168
  428. i32 165, label %sw.bb169
  429. i32 166, label %sw.bb170
  430. i32 167, label %sw.bb171
  431. i32 168, label %sw.bb172
  432. i32 169, label %sw.bb173
  433. i32 170, label %sw.bb174
  434. i32 171, label %sw.bb175
  435. i32 172, label %sw.bb176
  436. i32 173, label %sw.bb177
  437. i32 174, label %sw.bb178
  438. i32 175, label %sw.bb179
  439. i32 176, label %sw.bb180
  440. i32 177, label %sw.bb181
  441. i32 178, label %sw.bb182
  442. i32 179, label %sw.bb183
  443. i32 180, label %sw.bb184
  444. i32 181, label %sw.bb185
  445. i32 182, label %sw.bb186
  446. i32 183, label %sw.bb187
  447. i32 184, label %sw.bb188
  448. i32 185, label %sw.bb189
  449. i32 186, label %sw.bb190
  450. i32 187, label %sw.bb191
  451. i32 188, label %sw.bb192
  452. i32 189, label %sw.bb193
  453. i32 190, label %sw.bb194
  454. i32 191, label %sw.bb195
  455. i32 192, label %sw.bb196
  456. i32 193, label %sw.bb197
  457. i32 194, label %sw.bb198
  458. i32 195, label %sw.bb199
  459. i32 196, label %sw.bb200
  460. i32 197, label %sw.bb201
  461. i32 198, label %sw.bb202
  462. ]
  463. sw.bb1: br label %return
  464. sw.bb2: br label %return
  465. sw.bb3: br label %return
  466. sw.bb4: br label %return
  467. sw.bb5: br label %return
  468. sw.bb6: br label %return
  469. sw.bb7: br label %return
  470. sw.bb8: br label %return
  471. sw.bb9: br label %return
  472. sw.bb10: br label %return
  473. sw.bb11: br label %return
  474. sw.bb12: br label %return
  475. sw.bb13: br label %return
  476. sw.bb14: br label %return
  477. sw.bb15: br label %return
  478. sw.bb16: br label %return
  479. sw.bb17: br label %return
  480. sw.bb18: br label %return
  481. sw.bb19: br label %return
  482. sw.bb20: br label %return
  483. sw.bb21: br label %return
  484. sw.bb22: br label %return
  485. sw.bb23: br label %return
  486. sw.bb24: br label %return
  487. sw.bb25: br label %return
  488. sw.bb26: br label %return
  489. sw.bb27: br label %return
  490. sw.bb28: br label %return
  491. sw.bb29: br label %return
  492. sw.bb30: br label %return
  493. sw.bb31: br label %return
  494. sw.bb32: br label %return
  495. sw.bb33: br label %return
  496. sw.bb34: br label %return
  497. sw.bb35: br label %return
  498. sw.bb37: br label %return
  499. sw.bb38: br label %return
  500. sw.bb39: br label %return
  501. sw.bb40: br label %return
  502. sw.bb41: br label %return
  503. sw.bb42: br label %return
  504. sw.bb43: br label %return
  505. sw.bb44: br label %return
  506. sw.bb45: br label %return
  507. sw.bb47: br label %return
  508. sw.bb48: br label %return
  509. sw.bb49: br label %return
  510. sw.bb50: br label %return
  511. sw.bb51: br label %return
  512. sw.bb52: br label %return
  513. sw.bb53: br label %return
  514. sw.bb54: br label %return
  515. sw.bb55: br label %return
  516. sw.bb56: br label %return
  517. sw.bb58: br label %return
  518. sw.bb59: br label %return
  519. sw.bb60: br label %return
  520. sw.bb61: br label %return
  521. sw.bb62: br label %return
  522. sw.bb63: br label %return
  523. sw.bb64: br label %return
  524. sw.bb65: br label %return
  525. sw.bb66: br label %return
  526. sw.bb67: br label %return
  527. sw.bb68: br label %return
  528. sw.bb69: br label %return
  529. sw.bb70: br label %return
  530. sw.bb71: br label %return
  531. sw.bb72: br label %return
  532. sw.bb73: br label %return
  533. sw.bb74: br label %return
  534. sw.bb76: br label %return
  535. sw.bb77: br label %return
  536. sw.bb78: br label %return
  537. sw.bb79: br label %return
  538. sw.bb80: br label %return
  539. sw.bb81: br label %return
  540. sw.bb82: br label %return
  541. sw.bb83: br label %return
  542. sw.bb84: br label %return
  543. sw.bb85: br label %return
  544. sw.bb86: br label %return
  545. sw.bb87: br label %return
  546. sw.bb88: br label %return
  547. sw.bb89: br label %return
  548. sw.bb90: br label %return
  549. sw.bb91: br label %return
  550. sw.bb92: br label %return
  551. sw.bb93: br label %return
  552. sw.bb94: br label %return
  553. sw.bb95: br label %return
  554. sw.bb96: br label %return
  555. sw.bb97: br label %return
  556. sw.bb98: br label %return
  557. sw.bb99: br label %return
  558. sw.bb100: br label %return
  559. sw.bb101: br label %return
  560. sw.bb102: br label %return
  561. sw.bb103: br label %return
  562. sw.bb104: br label %return
  563. sw.bb105: br label %return
  564. sw.bb106: br label %return
  565. sw.bb107: br label %return
  566. sw.bb108: br label %return
  567. sw.bb109: br label %return
  568. sw.bb110: br label %return
  569. sw.bb111: br label %return
  570. sw.bb112: br label %return
  571. sw.bb113: br label %return
  572. sw.bb114: br label %return
  573. sw.bb115: br label %return
  574. sw.bb116: br label %return
  575. sw.bb117: br label %return
  576. sw.bb118: br label %return
  577. sw.bb119: br label %return
  578. sw.bb120: br label %return
  579. sw.bb121: br label %return
  580. sw.bb122: br label %return
  581. sw.bb123: br label %return
  582. sw.bb124: br label %return
  583. sw.bb125: br label %return
  584. sw.bb126: br label %return
  585. sw.bb127: br label %return
  586. sw.bb128: br label %return
  587. sw.bb129: br label %return
  588. sw.bb130: br label %return
  589. sw.bb131: br label %return
  590. sw.bb132: br label %return
  591. sw.bb133: br label %return
  592. sw.bb134: br label %return
  593. sw.bb135: br label %return
  594. sw.bb136: br label %return
  595. sw.bb137: br label %return
  596. sw.bb138: br label %return
  597. sw.bb139: br label %return
  598. sw.bb140: br label %return
  599. sw.bb141: br label %return
  600. sw.bb142: br label %return
  601. sw.bb143: br label %return
  602. sw.bb144: br label %return
  603. sw.bb145: br label %return
  604. sw.bb146: br label %return
  605. sw.bb147: br label %return
  606. sw.bb148: br label %return
  607. sw.bb149: br label %return
  608. sw.bb150: br label %return
  609. sw.bb151: br label %return
  610. sw.bb152: br label %return
  611. sw.bb153: br label %return
  612. sw.bb154: br label %return
  613. sw.bb155: br label %return
  614. sw.bb156: br label %return
  615. sw.bb157: br label %return
  616. sw.bb158: br label %return
  617. sw.bb159: br label %return
  618. sw.bb160: br label %return
  619. sw.bb161: br label %return
  620. sw.bb162: br label %return
  621. sw.bb163: br label %return
  622. sw.bb164: br label %return
  623. sw.bb165: br label %return
  624. sw.bb166: br label %return
  625. sw.bb167: br label %return
  626. sw.bb168: br label %return
  627. sw.bb169: br label %return
  628. sw.bb170: br label %return
  629. sw.bb171: br label %return
  630. sw.bb172: br label %return
  631. sw.bb173: br label %return
  632. sw.bb174: br label %return
  633. sw.bb175: br label %return
  634. sw.bb176: br label %return
  635. sw.bb177: br label %return
  636. sw.bb178: br label %return
  637. sw.bb179: br label %return
  638. sw.bb180: br label %return
  639. sw.bb181: br label %return
  640. sw.bb182: br label %return
  641. sw.bb183: br label %return
  642. sw.bb184: br label %return
  643. sw.bb185: br label %return
  644. sw.bb186: br label %return
  645. sw.bb187: br label %return
  646. sw.bb188: br label %return
  647. sw.bb189: br label %return
  648. sw.bb190: br label %return
  649. sw.bb191: br label %return
  650. sw.bb192: br label %return
  651. sw.bb193: br label %return
  652. sw.bb194: br label %return
  653. sw.bb195: br label %return
  654. sw.bb196: br label %return
  655. sw.bb197: br label %return
  656. sw.bb198: br label %return
  657. sw.bb199: br label %return
  658. sw.bb200: br label %return
  659. sw.bb201: br label %return
  660. sw.bb202: br label %return
  661. sw.bb203: br label %return
  662. return:
  663. %retval.0 = phi i32 [ 39204, %sw.bb202 ], [ 38809, %sw.bb201 ], [ 38416, %sw.bb200 ], [ 38025, %sw.bb199 ], [ 37636, %sw.bb198 ], [ 37249, %sw.bb197 ], [ 36864, %sw.bb196 ], [ 36481, %sw.bb195 ], [ 36100, %sw.bb194 ], [ 35721, %sw.bb193 ], [ 35344, %sw.bb192 ], [ 34969, %sw.bb191 ], [ 34596, %sw.bb190 ], [ 34225, %sw.bb189 ], [ 33856, %sw.bb188 ], [ 33489, %sw.bb187 ], [ 33124, %sw.bb186 ], [ 32761, %sw.bb185 ], [ 32400, %sw.bb184 ], [ 32041, %sw.bb183 ], [ 31684, %sw.bb182 ], [ 31329, %sw.bb181 ], [ 30976, %sw.bb180 ], [ 30625, %sw.bb179 ], [ 30276, %sw.bb178 ], [ 29929, %sw.bb177 ], [ 29584, %sw.bb176 ], [ 29241, %sw.bb175 ], [ 28900, %sw.bb174 ], [ 28561, %sw.bb173 ], [ 28224, %sw.bb172 ], [ 27889, %sw.bb171 ], [ 27556, %sw.bb170 ], [ 27225, %sw.bb169 ], [ 26896, %sw.bb168 ], [ 26569, %sw.bb167 ], [ 26244, %sw.bb166 ], [ 25921, %sw.bb165 ], [ 25600, %sw.bb164 ], [ 25281, %sw.bb163 ], [ 24964, %sw.bb162 ], [ 24649, %sw.bb161 ], [ 24336, %sw.bb160 ], [ 24025, %sw.bb159 ], [ 23716, %sw.bb158 ], [ 23409, %sw.bb157 ], [ 23104, %sw.bb156 ], [ 22801, %sw.bb155 ], [ 22500, %sw.bb154 ], [ 22201, %sw.bb153 ], [ 21904, %sw.bb152 ], [ 21609, %sw.bb151 ], [ 21316, %sw.bb150 ], [ 21025, %sw.bb149 ], [ 20736, %sw.bb148 ], [ 20449, %sw.bb147 ], [ 20164, %sw.bb146 ], [ 19881, %sw.bb145 ], [ 19600, %sw.bb144 ], [ 19321, %sw.bb143 ], [ 19044, %sw.bb142 ], [ 18769, %sw.bb141 ], [ 18496, %sw.bb140 ], [ 18225, %sw.bb139 ], [ 17956, %sw.bb138 ], [ 17689, %sw.bb137 ], [ 17424, %sw.bb136 ], [ 17161, %sw.bb135 ], [ 16900, %sw.bb134 ], [ 16641, %sw.bb133 ], [ 16384, %sw.bb132 ], [ 16129, %sw.bb131 ], [ 15876, %sw.bb130 ], [ 15625, %sw.bb129 ], [ 15376, %sw.bb128 ], [ 15129, %sw.bb127 ], [ 14884, %sw.bb126 ], [ 14641, %sw.bb125 ], [ 14400, %sw.bb124 ], [ 14161, %sw.bb123 ], [ 13924, %sw.bb122 ], [ 13689, %sw.bb121 ], [ 13456, %sw.bb120 ], [ 13225, %sw.bb119 ], [ 12996, %sw.bb118 ], [ 12769, %sw.bb117 ], [ 12544, %sw.bb116 ], [ 12321, %sw.bb115 ], [ 12100, %sw.bb114 ], [ 11881, %sw.bb113 ], [ 11664, %sw.bb112 ], [ 11449, %sw.bb111 ], [ 11236, %sw.bb110 ], [ 11025, %sw.bb109 ], [ 10816, %sw.bb108 ], [ 10609, %sw.bb107 ], [ 10404, %sw.bb106 ], [ 10201, %sw.bb105 ], [ 10000, %sw.bb104 ], [ 9801, %sw.bb103 ], [ 9604, %sw.bb102 ], [ 9409, %sw.bb101 ], [ 9216, %sw.bb100 ], [ 9025, %sw.bb99 ], [ 8836, %sw.bb98 ], [ 8649, %sw.bb97 ], [ 8464, %sw.bb96 ], [ 8281, %sw.bb95 ], [ 8100, %sw.bb94 ], [ 7921, %sw.bb93 ], [ 7744, %sw.bb92 ], [ 7569, %sw.bb91 ], [ 7396, %sw.bb90 ], [ 7225, %sw.bb89 ], [ 7056, %sw.bb88 ], [ 6889, %sw.bb87 ], [ 6724, %sw.bb86 ], [ 6561, %sw.bb85 ], [ 6400, %sw.bb84 ], [ 6241, %sw.bb83 ], [ 6084, %sw.bb82 ], [ 5929, %sw.bb81 ], [ 5776, %sw.bb80 ], [ 5625, %sw.bb79 ], [ 5476, %sw.bb78 ], [ 5329, %sw.bb77 ], [ 5184, %sw.bb76 ], [ 5112, %sw.bb74 ], [ 4900, %sw.bb73 ], [ 4761, %sw.bb72 ], [ 4624, %sw.bb71 ], [ 4489, %sw.bb70 ], [ 4356, %sw.bb69 ], [ 4225, %sw.bb68 ], [ 4096, %sw.bb67 ], [ 3969, %sw.bb66 ], [ 3844, %sw.bb65 ], [ 3721, %sw.bb64 ], [ 3600, %sw.bb63 ], [ 3481, %sw.bb62 ], [ 3364, %sw.bb61 ], [ 3249, %sw.bb60 ], [ 3136, %sw.bb59 ], [ 3025, %sw.bb58 ], [ 2970, %sw.bb56 ], [ 2809, %sw.bb55 ], [ 2704, %sw.bb54 ], [ 2601, %sw.bb53 ], [ 2500, %sw.bb52 ], [ 2401, %sw.bb51 ], [ 2304, %sw.bb50 ], [ 2209, %sw.bb49 ], [ 2116, %sw.bb48 ], [ 2025, %sw.bb47 ], [ 1980, %sw.bb45 ], [ 1849, %sw.bb44 ], [ 1764, %sw.bb43 ], [ 1681, %sw.bb42 ], [ 1600, %sw.bb41 ], [ 1521, %sw.bb40 ], [ 1444, %sw.bb39 ], [ 1369, %sw.bb38 ], [ 1296, %sw.bb37 ], [ 1260, %sw.bb35 ], [ 1156, %sw.bb34 ], [ 1089, %sw.bb33 ], [ 1024, %sw.bb32 ], [ 961, %sw.bb31 ], [ 900, %sw.bb30 ], [ 841, %sw.bb29 ], [ 784, %sw.bb28 ], [ 729, %sw.bb27 ], [ 676, %sw.bb26 ], [ 625, %sw.bb25 ], [ 576, %sw.bb24 ], [ 529, %sw.bb23 ], [ 484, %sw.bb22 ], [ 441, %sw.bb21 ], [ 400, %sw.bb20 ], [ 361, %sw.bb19 ], [ 342, %sw.bb18 ], [ 289, %sw.bb17 ], [ 256, %sw.bb16 ], [ 225, %sw.bb15 ], [ 196, %sw.bb14 ], [ 169, %sw.bb13 ], [ 144, %sw.bb12 ], [ 121, %sw.bb11 ], [ 100, %sw.bb10 ], [ 81, %sw.bb9 ], [ 64, %sw.bb8 ], [ 49, %sw.bb7 ], [ 36, %sw.bb6 ], [ 25, %sw.bb5 ], [ 16, %sw.bb4 ], [ 9, %sw.bb3 ], [ 4, %sw.bb2 ], [ 1, %sw.bb1 ], [ 39601, %sw.bb203 ], [ 0, %if.end ]
  664. ret i32 %retval.0
  665. }
  666. define i32 @cprop(i32 %x, i32 %y) {
  667. entry:
  668. switch i32 %x, label %sw.default [
  669. i32 1, label %return
  670. i32 2, label %sw.bb1
  671. i32 3, label %sw.bb2
  672. i32 4, label %sw.bb2
  673. i32 5, label %sw.bb2
  674. i32 6, label %sw.bb3
  675. i32 7, label %sw.bb3
  676. ]
  677. sw.bb1: br label %return
  678. sw.bb2:
  679. %and = and i32 %x, 1
  680. %and.ptr = inttoptr i32 %and to i8*
  681. %tobool = icmp ne i8* %and.ptr, null
  682. %cond = select i1 %tobool, i32 -123, i32 456
  683. %sub = sub nsw i32 %x, %cond
  684. br label %return
  685. sw.bb3:
  686. %trunc = trunc i32 %x to i8
  687. %sext = sext i8 %trunc to i32
  688. %select.i = icmp sgt i32 %sext, 0
  689. %select = select i1 %select.i, i32 %sext, i32 %y
  690. br label %return
  691. sw.default:
  692. br label %return
  693. return:
  694. %retval.0 = phi i32 [ 123, %sw.default ], [ %select, %sw.bb3 ], [ %sub, %sw.bb2 ], [ 42, %sw.bb1 ], [ 5, %entry ]
  695. ret i32 %retval.0
  696. ; CHECK-LABEL: @cprop(
  697. ; CHECK: switch.lookup:
  698. ; CHECK: %switch.gep = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.5, i32 0, i32 %switch.tableidx
  699. }
  700. define i32 @unreachable_case(i32 %x) {
  701. entry:
  702. switch i32 %x, label %sw.default [
  703. i32 0, label %sw.bb
  704. i32 1, label %sw.bb
  705. i32 2, label %sw.bb
  706. i32 3, label %sw.bb1
  707. i32 4, label %sw.bb2
  708. i32 5, label %sw.bb3
  709. i32 6, label %sw.bb3
  710. i32 7, label %sw.bb3
  711. i32 8, label %sw.bb3
  712. ]
  713. sw.bb: br label %return
  714. sw.bb1: unreachable
  715. sw.bb2: br label %return
  716. sw.bb3: br label %return
  717. sw.default: br label %return
  718. return:
  719. %retval.0 = phi i32 [ 1, %sw.bb3 ], [ -1, %sw.bb2 ], [ 0, %sw.bb ], [ 2, %sw.default ]
  720. ret i32 %retval.0
  721. ; CHECK-LABEL: @unreachable_case(
  722. ; CHECK: switch.lookup:
  723. ; CHECK: getelementptr inbounds [9 x i32], [9 x i32]* @switch.table.6, i32 0, i32 %switch.tableidx
  724. }
  725. define i32 @unreachable_default(i32 %x) {
  726. entry:
  727. switch i32 %x, label %default [
  728. i32 0, label %bb0
  729. i32 1, label %bb1
  730. i32 2, label %bb2
  731. i32 3, label %bb3
  732. ]
  733. bb0: br label %return
  734. bb1: br label %return
  735. bb2: br label %return
  736. bb3: br label %return
  737. default: unreachable
  738. return:
  739. %retval = phi i32 [ 42, %bb0 ], [ 52, %bb1 ], [ 1, %bb2 ], [ 2, %bb3 ]
  740. ret i32 %retval
  741. ; CHECK-LABEL: @unreachable_default(
  742. ; CHECK: entry:
  743. ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0
  744. ; CHECK-NOT: icmp
  745. ; CHECK-NOT: br 1i
  746. ; CHECK-NEXT: %switch.gep = getelementptr inbounds [4 x i32], [4 x i32]* @switch.table.7, i32 0, i32 %switch.tableidx
  747. ; CHECK-NEXT: %switch.load = load i32, i32* %switch.gep
  748. ; CHECK-NEXT: ret i32 %switch.load
  749. }
  750. ; Don't create a table with illegal type
  751. define i96 @illegaltype(i32 %c) {
  752. entry:
  753. switch i32 %c, label %sw.default [
  754. i32 42, label %return
  755. i32 43, label %sw.bb1
  756. i32 44, label %sw.bb2
  757. i32 45, label %sw.bb3
  758. i32 46, label %sw.bb4
  759. ]
  760. sw.bb1: br label %return
  761. sw.bb2: br label %return
  762. sw.bb3: br label %return
  763. sw.bb4: br label %return
  764. sw.default: br label %return
  765. return:
  766. %retval.0 = phi i96 [ 15, %sw.default ], [ 27, %sw.bb4 ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ]
  767. ret i96 %retval.0
  768. ; CHECK-LABEL: @illegaltype(
  769. ; CHECK-NOT: @switch.table
  770. ; CHECK: switch i32 %c
  771. }
  772. ; If we can build a lookup table without any holes, we don't need a default result.
  773. declare void @exit(i32)
  774. define i32 @nodefaultnoholes(i32 %c) {
  775. entry:
  776. switch i32 %c, label %sw.default [
  777. i32 0, label %return
  778. i32 1, label %sw.bb1
  779. i32 2, label %sw.bb2
  780. i32 3, label %sw.bb3
  781. ]
  782. sw.bb1: br label %return
  783. sw.bb2: br label %return
  784. sw.bb3: br label %return
  785. sw.default: call void @exit(i32 1)
  786. unreachable
  787. return:
  788. %x = phi i32 [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ]
  789. ret i32 %x
  790. ; CHECK-LABEL: @nodefaultnoholes(
  791. ; CHECK: @switch.table
  792. ; CHECK-NOT: switch i32
  793. }
  794. ; This lookup table will have holes, so we need to test for the holes.
  795. define i32 @nodefaultwithholes(i32 %c) {
  796. entry:
  797. switch i32 %c, label %sw.default [
  798. i32 0, label %return
  799. i32 1, label %sw.bb1
  800. i32 2, label %sw.bb2
  801. i32 3, label %sw.bb3
  802. i32 5, label %sw.bb3
  803. ]
  804. sw.bb1: br label %return
  805. sw.bb2: br label %return
  806. sw.bb3: br label %return
  807. sw.default: call void @exit(i32 1)
  808. unreachable
  809. return:
  810. %x = phi i32 [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ]
  811. ret i32 %x
  812. ; CHECK-LABEL: @nodefaultwithholes(
  813. ; CHECK: entry:
  814. ; CHECK: br i1 %{{.*}}, label %switch.hole_check, label %sw.default
  815. ; CHECK: switch.hole_check:
  816. ; CHECK-NEXT: %switch.maskindex = trunc i32 %switch.tableidx to i8
  817. ; CHECK-NEXT: %switch.shifted = lshr i8 47, %switch.maskindex
  818. ; The mask is binary 101111.
  819. ; CHECK-NEXT: %switch.lobit = trunc i8 %switch.shifted to i1
  820. ; CHECK-NEXT: br i1 %switch.lobit, label %switch.lookup, label %sw.default
  821. ; CHECK-NOT: switch i32
  822. }
  823. ; We don't build lookup tables with holes for switches with less than four cases.
  824. define i32 @threecasesholes(i32 %c) {
  825. entry:
  826. switch i32 %c, label %sw.default [
  827. i32 0, label %return
  828. i32 1, label %sw.bb1
  829. i32 3, label %sw.bb2
  830. ]
  831. sw.bb1: br label %return
  832. sw.bb2: br label %return
  833. sw.default: br label %return
  834. return:
  835. %x = phi i32 [ %c, %sw.default ], [ 5, %sw.bb2 ], [ 7, %sw.bb1 ], [ 9, %entry ]
  836. ret i32 %x
  837. ; CHECK-LABEL: @threecasesholes(
  838. ; CHECK: switch i32
  839. ; CHECK-NOT: @switch.table
  840. }
  841. ; We build lookup tables for switches with three or more cases.
  842. define i32 @threecases(i32 %c) {
  843. entry:
  844. switch i32 %c, label %sw.default [
  845. i32 0, label %return
  846. i32 1, label %sw.bb1
  847. i32 2, label %sw.bb2
  848. ]
  849. sw.bb1: br label %return
  850. sw.bb2: br label %return
  851. sw.default: br label %return
  852. return:
  853. %x = phi i32 [ 3, %sw.default ], [ 5, %sw.bb2 ], [ 7, %sw.bb1 ], [ 10, %entry ]
  854. ret i32 %x
  855. ; CHECK-LABEL: @threecases(
  856. ; CHECK-NOT: switch i32
  857. ; CHECK: @switch.table
  858. }
  859. ; We don't build tables for switches with two cases.
  860. define i32 @twocases(i32 %c) {
  861. entry:
  862. switch i32 %c, label %sw.default [
  863. i32 0, label %return
  864. i32 1, label %sw.bb1
  865. ]
  866. sw.bb1: br label %return
  867. sw.default: br label %return
  868. return:
  869. %x = phi i32 [ 3, %sw.default ], [ 7, %sw.bb1 ], [ 9, %entry ]
  870. ret i32 %x
  871. ; CHECK-LABEL: @twocases(
  872. ; CHECK-NOT: switch i32
  873. ; CHECK-NOT: @switch.table
  874. ; CHECK: %switch.selectcmp
  875. ; CHECK-NEXT: %switch.select
  876. ; CHECK-NEXT: %switch.selectcmp1
  877. ; CHECK-NEXT: %switch.select2
  878. }
  879. ; Don't build tables for switches with TLS variables.
  880. @tls_a = thread_local global i32 0
  881. @tls_b = thread_local global i32 0
  882. @tls_c = thread_local global i32 0
  883. @tls_d = thread_local global i32 0
  884. define i32* @tls(i32 %x) {
  885. entry:
  886. switch i32 %x, label %sw.default [
  887. i32 0, label %return
  888. i32 1, label %sw.bb1
  889. i32 2, label %sw.bb2
  890. ]
  891. sw.bb1:
  892. br label %return
  893. sw.bb2:
  894. br label %return
  895. sw.default:
  896. br label %return
  897. return:
  898. %retval.0 = phi i32* [ @tls_d, %sw.default ], [ @tls_c, %sw.bb2 ], [ @tls_b, %sw.bb1 ], [ @tls_a, %entry ]
  899. ret i32* %retval.0
  900. ; CHECK-LABEL: @tls(
  901. ; CHECK: switch i32
  902. ; CHECK-NOT: @switch.table
  903. }
  904. ; Don't build tables for switches with dllimport variables.
  905. @dllimport_a = external dllimport global [3x i32]
  906. @dllimport_b = external dllimport global [3x i32]
  907. @dllimport_c = external dllimport global [3x i32]
  908. @dllimport_d = external dllimport global [3x i32]
  909. define i32* @dllimport(i32 %x) {
  910. entry:
  911. switch i32 %x, label %sw.default [
  912. i32 0, label %return
  913. i32 1, label %sw.bb1
  914. i32 2, label %sw.bb2
  915. ]
  916. sw.bb1:
  917. br label %return
  918. sw.bb2:
  919. br label %return
  920. sw.default:
  921. br label %return
  922. return:
  923. %retval.0 = phi i32* [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_d, i32 0, i32 0), %sw.default ],
  924. [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_c, i32 0, i32 0), %sw.bb2 ],
  925. [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_b, i32 0, i32 0), %sw.bb1 ],
  926. [ getelementptr inbounds ([3 x i32], [3 x i32]* @dllimport_a, i32 0, i32 0), %entry ]
  927. ret i32* %retval.0
  928. ; CHECK-LABEL: @dllimport(
  929. ; CHECK: switch i32
  930. ; CHECK-NOT: @switch.table
  931. }
  932. ; We can use linear mapping.
  933. define i8 @linearmap1(i32 %c) {
  934. entry:
  935. switch i32 %c, label %sw.default [
  936. i32 10, label %return
  937. i32 11, label %sw.bb1
  938. i32 12, label %sw.bb2
  939. i32 13, label %sw.bb3
  940. ]
  941. sw.bb1: br label %return
  942. sw.bb2: br label %return
  943. sw.bb3: br label %return
  944. sw.default: br label %return
  945. return:
  946. %x = phi i8 [ 3, %sw.default ], [ 3, %sw.bb3 ], [ 8, %sw.bb2 ], [ 13, %sw.bb1 ], [ 18, %entry ]
  947. ret i8 %x
  948. ; CHECK-LABEL: @linearmap1(
  949. ; CHECK: entry:
  950. ; CHECK-NEXT: %switch.tableidx = sub i32 %c, 10
  951. ; CHECK: switch.lookup:
  952. ; CHECK-NEXT: %switch.idx.cast = trunc i32 %switch.tableidx to i8
  953. ; CHECK-NEXT: %switch.idx.mult = mul i8 %switch.idx.cast, -5
  954. ; CHECK-NEXT: %switch.offset = add i8 %switch.idx.mult, 18
  955. ; CHECK-NEXT: ret i8 %switch.offset
  956. }
  957. ; Linear mapping in a different configuration.
  958. define i32 @linearmap2(i8 %c) {
  959. entry:
  960. switch i8 %c, label %sw.default [
  961. i8 -10, label %return
  962. i8 -11, label %sw.bb1
  963. i8 -12, label %sw.bb2
  964. i8 -13, label %sw.bb3
  965. ]
  966. sw.bb1: br label %return
  967. sw.bb2: br label %return
  968. sw.bb3: br label %return
  969. sw.default: br label %return
  970. return:
  971. %x = phi i32 [ 3, %sw.default ], [ 18, %sw.bb3 ], [ 19, %sw.bb2 ], [ 20, %sw.bb1 ], [ 21, %entry ]
  972. ret i32 %x
  973. ; CHECK-LABEL: @linearmap2(
  974. ; CHECK: entry:
  975. ; CHECK-NEXT: %switch.tableidx = sub i8 %c, -13
  976. ; CHECK: switch.lookup:
  977. ; CHECK-NEXT: %switch.idx.cast = zext i8 %switch.tableidx to i32
  978. ; CHECK-NEXT: %switch.offset = add i32 %switch.idx.cast, 18
  979. ; CHECK-NEXT: ret i32 %switch.offset
  980. }
  981. ; Linear mapping with overflows.
  982. define i8 @linearmap3(i32 %c) {
  983. entry:
  984. switch i32 %c, label %sw.default [
  985. i32 10, label %return
  986. i32 11, label %sw.bb1
  987. i32 12, label %sw.bb2
  988. i32 13, label %sw.bb3
  989. ]
  990. sw.bb1: br label %return
  991. sw.bb2: br label %return
  992. sw.bb3: br label %return
  993. sw.default: br label %return
  994. return:
  995. %x = phi i8 [ 3, %sw.default ], [ 44, %sw.bb3 ], [ -56, %sw.bb2 ], [ 100, %sw.bb1 ], [ 0, %entry ]
  996. ret i8 %x
  997. ; CHECK-LABEL: @linearmap3(
  998. ; CHECK: entry:
  999. ; CHECK-NEXT: %switch.tableidx = sub i32 %c, 10
  1000. ; CHECK: switch.lookup:
  1001. ; CHECK-NEXT: %switch.idx.cast = trunc i32 %switch.tableidx to i8
  1002. ; CHECK-NEXT: %switch.idx.mult = mul i8 %switch.idx.cast, 100
  1003. ; CHECK-NEXT: ret i8 %switch.idx.mult
  1004. }
  1005. ; Linear mapping with with multiplier 1 and offset 0.
  1006. define i8 @linearmap4(i32 %c) {
  1007. entry:
  1008. switch i32 %c, label %sw.default [
  1009. i32 -2, label %return
  1010. i32 -1, label %sw.bb1
  1011. i32 0, label %sw.bb2
  1012. i32 1, label %sw.bb3
  1013. ]
  1014. sw.bb1: br label %return
  1015. sw.bb2: br label %return
  1016. sw.bb3: br label %return
  1017. sw.default: br label %return
  1018. return:
  1019. %x = phi i8 [ 3, %sw.default ], [ 3, %sw.bb3 ], [ 2, %sw.bb2 ], [ 1, %sw.bb1 ], [ 0, %entry ]
  1020. ret i8 %x
  1021. ; CHECK-LABEL: @linearmap4(
  1022. ; CHECK: entry:
  1023. ; CHECK-NEXT: %switch.tableidx = sub i32 %c, -2
  1024. ; CHECK: switch.lookup:
  1025. ; CHECK-NEXT: %switch.idx.cast = trunc i32 %switch.tableidx to i8
  1026. ; CHECK-NEXT: ret i8 %switch.idx.cast
  1027. }
  1028. ; Reuse the inverted table range compare.
  1029. define i32 @reuse_cmp1(i32 %x) {
  1030. entry:
  1031. switch i32 %x, label %sw.default [
  1032. i32 0, label %sw.bb
  1033. i32 1, label %sw.bb1
  1034. i32 2, label %sw.bb2
  1035. i32 3, label %sw.bb3
  1036. ]
  1037. sw.bb: br label %sw.epilog
  1038. sw.bb1: br label %sw.epilog
  1039. sw.bb2: br label %sw.epilog
  1040. sw.bb3: br label %sw.epilog
  1041. sw.default: br label %sw.epilog
  1042. sw.epilog:
  1043. %r.0 = phi i32 [ 0, %sw.default ], [ 13, %sw.bb3 ], [ 12, %sw.bb2 ], [ 11, %sw.bb1 ], [ 10, %sw.bb ]
  1044. %cmp = icmp eq i32 %r.0, 0 ; This compare can be "replaced".
  1045. br i1 %cmp, label %if.then, label %if.end
  1046. if.then: br label %return
  1047. if.end: br label %return
  1048. return:
  1049. %retval.0 = phi i32 [ 100, %if.then ], [ %r.0, %if.end ]
  1050. ret i32 %retval.0
  1051. ; CHECK-LABEL: @reuse_cmp1(
  1052. ; CHECK: entry:
  1053. ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0
  1054. ; CHECK-NEXT: [[C:%.+]] = icmp ult i32 %switch.tableidx, 4
  1055. ; CHECK-NEXT: %inverted.cmp = xor i1 [[C]], true
  1056. ; CHECK: [[R:%.+]] = select i1 %inverted.cmp, i32 100, i32 {{.*}}
  1057. ; CHECK-NEXT: ret i32 [[R]]
  1058. }
  1059. ; Reuse the table range compare.
  1060. define i32 @reuse_cmp2(i32 %x) {
  1061. entry:
  1062. switch i32 %x, label %sw.default [
  1063. i32 0, label %sw.bb
  1064. i32 1, label %sw.bb1
  1065. i32 2, label %sw.bb2
  1066. i32 3, label %sw.bb3
  1067. ]
  1068. sw.bb: br label %sw.epilog
  1069. sw.bb1: br label %sw.epilog
  1070. sw.bb2: br label %sw.epilog
  1071. sw.bb3: br label %sw.epilog
  1072. sw.default: br label %sw.epilog
  1073. sw.epilog:
  1074. %r.0 = phi i32 [ 4, %sw.default ], [ 3, %sw.bb3 ], [ 2, %sw.bb2 ], [ 1, %sw.bb1 ], [ 0, %sw.bb ]
  1075. %cmp = icmp ne i32 %r.0, 4 ; This compare can be "replaced".
  1076. br i1 %cmp, label %if.then, label %if.end
  1077. if.then: br label %return
  1078. if.end: br label %return
  1079. return:
  1080. %retval.0 = phi i32 [ %r.0, %if.then ], [ 100, %if.end ]
  1081. ret i32 %retval.0
  1082. ; CHECK-LABEL: @reuse_cmp2(
  1083. ; CHECK: entry:
  1084. ; CHECK-NEXT: %switch.tableidx = sub i32 %x, 0
  1085. ; CHECK-NEXT: [[C:%.+]] = icmp ult i32 %switch.tableidx, 4
  1086. ; CHECK: [[R:%.+]] = select i1 [[C]], i32 {{.*}}, i32 100
  1087. ; CHECK-NEXT: ret i32 [[R]]
  1088. }
  1089. ; Cannot reuse the table range compare, because the default value is the same
  1090. ; as one of the case values.
  1091. define i32 @no_reuse_cmp(i32 %x) {
  1092. entry:
  1093. switch i32 %x, label %sw.default [
  1094. i32 0, label %sw.bb
  1095. i32 1, label %sw.bb1
  1096. i32 2, label %sw.bb2
  1097. i32 3, label %sw.bb3
  1098. ]
  1099. sw.bb: br label %sw.epilog
  1100. sw.bb1: br label %sw.epilog
  1101. sw.bb2: br label %sw.epilog
  1102. sw.bb3: br label %sw.epilog
  1103. sw.default: br label %sw.epilog
  1104. sw.epilog:
  1105. %r.0 = phi i32 [ 12, %sw.default ], [ 13, %sw.bb3 ], [ 12, %sw.bb2 ], [ 11, %sw.bb1 ], [ 10, %sw.bb ]
  1106. %cmp = icmp ne i32 %r.0, 0
  1107. br i1 %cmp, label %if.then, label %if.end
  1108. if.then: br label %return
  1109. if.end: br label %return
  1110. return:
  1111. %retval.0 = phi i32 [ %r.0, %if.then ], [ 100, %if.end ]
  1112. ret i32 %retval.0
  1113. ; CHECK-LABEL: @no_reuse_cmp(
  1114. ; CHECK: [[S:%.+]] = select
  1115. ; CHECK-NEXT: %cmp = icmp ne i32 [[S]], 0
  1116. ; CHECK-NEXT: [[R:%.+]] = select i1 %cmp, i32 [[S]], i32 100
  1117. ; CHECK-NEXT: ret i32 [[R]]
  1118. }
  1119. ; Cannot reuse the table range compare, because the phi at the switch merge
  1120. ; point is not dominated by the switch.
  1121. define i32 @no_reuse_cmp2(i32 %x, i32 %y) {
  1122. entry:
  1123. %ec = icmp ne i32 %y, 0
  1124. br i1 %ec, label %switch.entry, label %sw.epilog
  1125. switch.entry:
  1126. switch i32 %x, label %sw.default [
  1127. i32 0, label %sw.bb
  1128. i32 1, label %sw.bb1
  1129. i32 2, label %sw.bb2
  1130. i32 3, label %sw.bb3
  1131. ]
  1132. sw.bb: br label %sw.epilog
  1133. sw.bb1: br label %sw.epilog
  1134. sw.bb2: br label %sw.epilog
  1135. sw.bb3: br label %sw.epilog
  1136. sw.default: br label %sw.epilog
  1137. sw.epilog:
  1138. %r.0 = phi i32 [100, %entry], [ 0, %sw.default ], [ 13, %sw.bb3 ], [ 12, %sw.bb2 ], [ 11, %sw.bb1 ], [ 10, %sw.bb ]
  1139. %cmp = icmp eq i32 %r.0, 0 ; This compare can be "replaced".
  1140. br i1 %cmp, label %if.then, label %if.end
  1141. if.then: br label %return
  1142. if.end: br label %return
  1143. return:
  1144. %retval.0 = phi i32 [ 100, %if.then ], [ %r.0, %if.end ]
  1145. ret i32 %retval.0
  1146. ; CHECK-LABEL: @no_reuse_cmp2(
  1147. ; CHECK: %r.0 = phi
  1148. ; CHECK-NEXT: %cmp = icmp eq i32 %r.0, 0
  1149. ; CHECK-NEXT: [[R:%.+]] = select i1 %cmp
  1150. ; CHECK-NEXT: ret i32 [[R]]
  1151. }
  1152. define void @pr20210(i8 %x, i1 %y) {
  1153. ; %z has uses outside of its BB or the phi it feeds into,
  1154. ; so doing a table lookup and jumping directly to while.cond would
  1155. ; cause %z to cease dominating all its uses.
  1156. entry:
  1157. br i1 %y, label %sw, label %intermediate
  1158. sw:
  1159. switch i8 %x, label %end [
  1160. i8 7, label %intermediate
  1161. i8 3, label %intermediate
  1162. i8 2, label %intermediate
  1163. i8 1, label %intermediate
  1164. i8 0, label %intermediate
  1165. ]
  1166. intermediate:
  1167. %z = zext i8 %x to i32
  1168. br label %while.cond
  1169. while.cond:
  1170. %i = phi i32 [ %z, %intermediate ], [ %j, %while.body ]
  1171. %b = icmp ne i32 %i, 7
  1172. br i1 %b, label %while.body, label %while.end
  1173. while.body:
  1174. %j = add i32 %i, 1
  1175. br label %while.cond
  1176. while.end:
  1177. call void @exit(i32 %z)
  1178. unreachable
  1179. end:
  1180. ret void
  1181. ; CHECK-LABEL: @pr20210
  1182. ; CHECK: switch i8 %x
  1183. }
  1184. ; Make sure we do not crash due to trying to generate an unguarded
  1185. ; lookup (since i3 can only hold values in the range of explicit
  1186. ; values) and simultaneously trying to generate a branch to deal with
  1187. ; the fact that we have holes in the range.
  1188. define i32 @covered_switch_with_bit_tests(i3) {
  1189. entry:
  1190. switch i3 %0, label %l6 [
  1191. i3 -3, label %l5
  1192. i3 -4, label %l5
  1193. i3 3, label %l1
  1194. i3 2, label %l1
  1195. ]
  1196. l1: br label %l2
  1197. l2:
  1198. %x = phi i32 [ 1, %l1 ], [ 2, %l5 ]
  1199. br label %l6
  1200. l5: br label %l2
  1201. l6:
  1202. %r = phi i32 [ %x, %l2 ], [ 0, %entry ]
  1203. ret i32 %r
  1204. ; CHECK-LABEL: @covered_switch_with_bit_tests
  1205. ; CHECK: entry
  1206. ; CHECK-NEXT: switch
  1207. }