339 lines · plain
1; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -aarch64-min-jump-table-entries=4 -jump-table-density=40 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK0 < %t2; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -aarch64-min-jump-table-entries=4 -jump-table-density=40 -max-jump-table-size=4 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK4 < %t3; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -aarch64-min-jump-table-entries=4 -jump-table-density=40 -max-jump-table-size=8 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK8 < %t4; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -aarch64-min-jump-table-entries=4 -jump-table-density=40 -max-jump-table-size=16 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK16 < %t5; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -aarch64-min-jump-table-entries=4 -jump-table-density=40 -mcpu=exynos-m3 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECKM3 < %t6 7declare void @ext(i32, i32)8 9define i32 @jt1(i32 %a, i32 %b) {10entry:11 switch i32 %a, label %return [12 i32 1, label %bb113 i32 2, label %bb214 i32 3, label %bb315 i32 4, label %bb416 i32 5, label %bb517 i32 6, label %bb618 i32 7, label %bb719 i32 8, label %bb820 i32 9, label %bb921 i32 10, label %bb1022 i32 11, label %bb1123 i32 12, label %bb1224 i32 13, label %bb1325 i32 14, label %bb1426 i32 15, label %bb1527 i32 16, label %bb1628 i32 17, label %bb1729 ]30; CHECK-LABEL: function jt1:31; CHECK-NEXT: Jump Tables:32; CHECK0-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.1733; CHECK0-NOT: %jump-table.1:34; CHECK4-NEXT: %jump-table.0: %bb.2 %bb.3 %bb.4 %bb.535; CHECK4-NEXT: %jump-table.1: %bb.6 %bb.7 %bb.8 %bb.936; CHECK4-NEXT: %jump-table.2: %bb.10 %bb.11 %bb.12 %bb.1337; CHECK4-NEXT: %jump-table.3: %bb.14 %bb.15 %bb.16 %bb.1738; CHECK4-NOT: %jump-table.4:39; CHECK8-NEXT: %jump-table.0: %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.940; CHECK8-NEXT: %jump-table.1: %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.1741; CHECK8-NOT: %jump-table.2:42; CHECK16-NEXT: %jump-table.0: %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.1743; CHECK16-NOT: %jump-table.1:44; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.1745; CHECKM3-NOT: %jump-table.1:46 47bb1: tail call void @ext(i32 1, i32 0) br label %return48bb2: tail call void @ext(i32 2, i32 2) br label %return49bb3: tail call void @ext(i32 3, i32 4) br label %return50bb4: tail call void @ext(i32 4, i32 6) br label %return51bb5: tail call void @ext(i32 5, i32 8) br label %return52bb6: tail call void @ext(i32 6, i32 10) br label %return53bb7: tail call void @ext(i32 7, i32 12) br label %return54bb8: tail call void @ext(i32 8, i32 14) br label %return55bb9: tail call void @ext(i32 9, i32 16) br label %return56bb10: tail call void @ext(i32 1, i32 18) br label %return57bb11: tail call void @ext(i32 2, i32 20) br label %return58bb12: tail call void @ext(i32 3, i32 22) br label %return59bb13: tail call void @ext(i32 4, i32 24) br label %return60bb14: tail call void @ext(i32 5, i32 26) br label %return61bb15: tail call void @ext(i32 6, i32 28) br label %return62bb16: tail call void @ext(i32 7, i32 30) br label %return63bb17: tail call void @ext(i32 8, i32 32) br label %return64 65return: ret i32 %b66}67 68define void @jt2(i32 %x) {69entry:70 switch i32 %x, label %return [71 i32 1, label %bb172 i32 2, label %bb273 i32 3, label %bb374 i32 4, label %bb475 76 i32 14, label %bb577 i32 15, label %bb678 ]79; CHECK-LABEL: function jt2:80; CHECK-NEXT: Jump Tables:81; CHECK0-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.5 %bb.6{{$}}82; CHECK0-NOT: %jump-table.1:83; CHECK4-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4{{$}}84; CHECK4-NOT: %jump-table.1:85; CHECK8-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4{{$}}86; CHECK8-NOT: %jump-table.1:87; CHECK16-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.5 %bb.6{{$}}88; CHECK16-NOT: %jump-table.1:89; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.5 %bb.6{{$}}90; CHECKM3-NOT: %jump-table.1:91; CHECK-DAG: End machine code for function jt2.92 93bb1: tail call void @ext(i32 6, i32 1) br label %return94bb2: tail call void @ext(i32 5, i32 2) br label %return95bb3: tail call void @ext(i32 4, i32 3) br label %return96bb4: tail call void @ext(i32 3, i32 4) br label %return97bb5: tail call void @ext(i32 2, i32 5) br label %return98bb6: tail call void @ext(i32 1, i32 6) br label %return99return: ret void100}101 102define void @jt3(i32 %x) {103entry:104 switch i32 %x, label %return [105 i32 1, label %bb1106 i32 2, label %bb2107 i32 3, label %bb3108 i32 4, label %bb4109 110 i32 14, label %bb5111 i32 15, label %bb6112 i32 16, label %bb7113 i32 17, label %bb8114 115 i32 19, label %bb9116 i32 20, label %bb10117 118 i32 22, label %bb11119 i32 23, label %bb12120 ]121; CHECK-LABEL: function jt3:122; CHECK-NEXT: Jump Tables:123; CHECK0-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.5 %bb.6 %bb.7 %bb.8 %bb.13 %bb.9 %bb.10 %bb.13 %bb.11 %bb.12124; CHECK0-NOT: %jump-table.1:125; CHECK4-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4126; CHECK4-NEXT: %jump-table.1: %bb.5 %bb.6 %bb.7 %bb.8127; CHECK4-NOT: %jump-table.2:128; CHECK8-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4129; CHECK8-NEXT: %jump-table.1: %bb.5 %bb.6 %bb.7 %bb.8 %bb.13 %bb.9 %bb.10130; CHECK8-NOT: %jump-table.2:131; CHECK16-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.5 %bb.6 %bb.7132; CHECK16-NEXT: %jump-table.1: %bb.8 %bb.13 %bb.9 %bb.10 %bb.13 %bb.11 %bb.12133; CHECK16-NOT: %jump-table.2:134; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.5 %bb.6 %bb.7 %bb.8 %bb.13 %bb.9 %bb.10135; CHECKM3-NOT: %jump-table.1:136; CHECK-DAG: End machine code for function jt3.137 138bb1: tail call void @ext(i32 1, i32 12) br label %return139bb2: tail call void @ext(i32 2, i32 11) br label %return140bb3: tail call void @ext(i32 3, i32 10) br label %return141bb4: tail call void @ext(i32 4, i32 9) br label %return142bb5: tail call void @ext(i32 5, i32 8) br label %return143bb6: tail call void @ext(i32 6, i32 7) br label %return144bb7: tail call void @ext(i32 7, i32 6) br label %return145bb8: tail call void @ext(i32 8, i32 5) br label %return146bb9: tail call void @ext(i32 9, i32 4) br label %return147bb10: tail call void @ext(i32 10, i32 3) br label %return148bb11: tail call void @ext(i32 11, i32 2) br label %return149bb12: tail call void @ext(i32 12, i32 1) br label %return150 151return: ret void152}153 154define void @jt4(i32 %x) {155entry:156 switch i32 %x, label %default [157 i32 1, label %bb1158 i32 2, label %bb2159 i32 3, label %bb3160 i32 4, label %bb4161 162 i32 14, label %bb5163 i32 15, label %bb6164 i32 16, label %bb7165 i32 17, label %bb8166 167 i32 19, label %bb9168 i32 20, label %bb10169 170 i32 22, label %bb11171 i32 23, label %bb12172 ]173; CHECK-LABEL: function jt4:174; CHECK-NEXT: Jump Tables:175; CHECK0-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.5 %bb.6 %bb.7 %bb.8 %bb.13 %bb.9 %bb.10 %bb.13 %bb.11 %bb.12176; CHECK0-NOT: %jump-table.1:177; CHECK4-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4178; CHECK4-NEXT: %jump-table.1: %bb.5 %bb.6 %bb.7 %bb.8179; CHECK4-NOT: %jump-table.2:180; CHECK8-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4181; CHECK8-NEXT: %jump-table.1: %bb.5 %bb.6 %bb.7 %bb.8 %bb.13 %bb.9 %bb.10182; CHECK8-NOT: %jump-table.2:183; CHECK16-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.5 %bb.6 %bb.7184; CHECK16-NEXT: %jump-table.1: %bb.8 %bb.13 %bb.9 %bb.10 %bb.13 %bb.11 %bb.12185; CHECK16-NOT: %jump-table.2:186; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.13 %bb.5 %bb.6 %bb.7 %bb.8 %bb.13 %bb.9 %bb.10187; CHECKM3-NOT: %jump-table.1:188; CHECK-DAG: End machine code for function jt4.189 190bb1: tail call void @ext(i32 1, i32 12) br label %return191bb2: tail call void @ext(i32 2, i32 11) br label %return192bb3: tail call void @ext(i32 3, i32 10) br label %return193bb4: tail call void @ext(i32 4, i32 9) br label %return194bb5: tail call void @ext(i32 5, i32 8) br label %return195bb6: tail call void @ext(i32 6, i32 7) br label %return196bb7: tail call void @ext(i32 7, i32 6) br label %return197bb8: tail call void @ext(i32 8, i32 5) br label %return198bb9: tail call void @ext(i32 9, i32 4) br label %return199bb10: tail call void @ext(i32 10, i32 3) br label %return200bb11: tail call void @ext(i32 11, i32 2) br label %return201bb12: tail call void @ext(i32 12, i32 1) br label %return202default: unreachable203 204return: ret void205}206 207define i32 @jt1_optsize(i32 %a, i32 %b) optsize {208entry:209 switch i32 %a, label %return [210 i32 1, label %bb1211 i32 2, label %bb2212 i32 3, label %bb3213 i32 4, label %bb4214 i32 5, label %bb5215 i32 6, label %bb6216 i32 7, label %bb7217 i32 8, label %bb8218 i32 9, label %bb9219 i32 10, label %bb10220 i32 11, label %bb11221 i32 12, label %bb12222 i32 13, label %bb13223 i32 14, label %bb14224 i32 15, label %bb15225 i32 16, label %bb16226 i32 17, label %bb17227 ]228; CHECK-LABEL: function jt1_optsize:229; CHECK-NEXT: Jump Tables:230; CHECK0-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17231; CHECK0-NOT: %jump-table.1:232; CHECK4-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17233; CHECK4-NOT: %jump-table.1:234; CHECK8-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17235; CHECK8-NOT: %jump-table.1:236; CHECK16-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17237; CHECK16-NOT: %jump-table.1:238; CHECKM1-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17239; CHECKM1-NOT: %jump-table.1:240; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17241; CHECKM3-NOT: %jump-table.1:242; CHECK-DAG: End machine code for function jt1_optsize.243 244bb1: tail call void @ext(i32 1, i32 0) br label %return245bb2: tail call void @ext(i32 2, i32 2) br label %return246bb3: tail call void @ext(i32 3, i32 4) br label %return247bb4: tail call void @ext(i32 4, i32 6) br label %return248bb5: tail call void @ext(i32 5, i32 8) br label %return249bb6: tail call void @ext(i32 6, i32 10) br label %return250bb7: tail call void @ext(i32 7, i32 12) br label %return251bb8: tail call void @ext(i32 8, i32 14) br label %return252bb9: tail call void @ext(i32 9, i32 16) br label %return253bb10: tail call void @ext(i32 1, i32 18) br label %return254bb11: tail call void @ext(i32 2, i32 20) br label %return255bb12: tail call void @ext(i32 3, i32 22) br label %return256bb13: tail call void @ext(i32 4, i32 24) br label %return257bb14: tail call void @ext(i32 5, i32 26) br label %return258bb15: tail call void @ext(i32 6, i32 28) br label %return259bb16: tail call void @ext(i32 7, i32 30) br label %return260bb17: tail call void @ext(i32 8, i32 32) br label %return261 262return: ret i32 %b263}264 265define i32 @jt1_pgso(i32 %a, i32 %b) !prof !14 {266entry:267 switch i32 %a, label %return [268 i32 1, label %bb1269 i32 2, label %bb2270 i32 3, label %bb3271 i32 4, label %bb4272 i32 5, label %bb5273 i32 6, label %bb6274 i32 7, label %bb7275 i32 8, label %bb8276 i32 9, label %bb9277 i32 10, label %bb10278 i32 11, label %bb11279 i32 12, label %bb12280 i32 13, label %bb13281 i32 14, label %bb14282 i32 15, label %bb15283 i32 16, label %bb16284 i32 17, label %bb17285 ]286; CHECK-LABEL: function jt1_pgso:287; CHECK-NEXT: Jump Tables:288; CHECK0-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17289; CHECK0-NOT: %jump-table.1:290; CHECK4-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17291; CHECK4-NOT: %jump-table.1:292; CHECK8-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17293; CHECK8-NOT: %jump-table.1:294; CHECK16-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17295; CHECK16-NOT: %jump-table.1:296; CHECKM1-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17297; CHECKM1-NOT: %jump-table.1:298; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.5 %bb.6 %bb.7 %bb.8 %bb.9 %bb.10 %bb.11 %bb.12 %bb.13 %bb.14 %bb.15 %bb.16 %bb.17299; CHECKM3-NOT: %jump-table.1:300; CHECK-DAG: End machine code for function jt1_pgso.301 302bb1: tail call void @ext(i32 1, i32 0) br label %return303bb2: tail call void @ext(i32 2, i32 2) br label %return304bb3: tail call void @ext(i32 3, i32 4) br label %return305bb4: tail call void @ext(i32 4, i32 6) br label %return306bb5: tail call void @ext(i32 5, i32 8) br label %return307bb6: tail call void @ext(i32 6, i32 10) br label %return308bb7: tail call void @ext(i32 7, i32 12) br label %return309bb8: tail call void @ext(i32 8, i32 14) br label %return310bb9: tail call void @ext(i32 9, i32 16) br label %return311bb10: tail call void @ext(i32 1, i32 18) br label %return312bb11: tail call void @ext(i32 2, i32 20) br label %return313bb12: tail call void @ext(i32 3, i32 22) br label %return314bb13: tail call void @ext(i32 4, i32 24) br label %return315bb14: tail call void @ext(i32 5, i32 26) br label %return316bb15: tail call void @ext(i32 6, i32 28) br label %return317bb16: tail call void @ext(i32 7, i32 30) br label %return318bb17: tail call void @ext(i32 8, i32 32) br label %return319 320return: ret i32 %b321}322 323!llvm.module.flags = !{!0}324!0 = !{i32 1, !"ProfileSummary", !1}325!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}326!2 = !{!"ProfileFormat", !"InstrProf"}327!3 = !{!"TotalCount", i64 10000}328!4 = !{!"MaxCount", i64 10}329!5 = !{!"MaxInternalCount", i64 1}330!6 = !{!"MaxFunctionCount", i64 1000}331!7 = !{!"NumCounts", i64 3}332!8 = !{!"NumFunctions", i64 3}333!9 = !{!"DetailedSummary", !10}334!10 = !{!11, !12, !13}335!11 = !{i32 10000, i64 100, i32 1}336!12 = !{i32 999000, i64 100, i32 1}337!13 = !{i32 999999, i64 1, i32 2}338!14 = !{!"function_entry_count", i64 0}339