brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.4 KiB · c6f5940 Raw
295 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 42; RUN: opt < %s -passes=jump-table-to-switch -verify-dom-info -S | FileCheck %s3; RUN: opt < %s -passes=jump-table-to-switch -jump-table-to-switch-size-threshold=0 -verify-dom-info -S | FileCheck %s --check-prefix=THRESHOLD-04 5@func_array = constant [2 x ptr] [ptr @func0, ptr @func1]6 7;.8; CHECK: @func_array = constant [2 x ptr] [ptr @func0, ptr @func1]9; CHECK: @void_func_array = constant [2 x ptr] [ptr @void_func0, ptr @void_func1]10; CHECK: @func_array_addrspace_42 = addrspace(42) constant [2 x ptr addrspace(42)] [ptr addrspace(42) @func0_addrspace_42, ptr addrspace(42) @func1_addrspace_42]11;.12; THRESHOLD-0: @func_array = constant [2 x ptr] [ptr @func0, ptr @func1]13; THRESHOLD-0: @void_func_array = constant [2 x ptr] [ptr @void_func0, ptr @void_func1]14; THRESHOLD-0: @func_array_addrspace_42 = addrspace(42) constant [2 x ptr addrspace(42)] [ptr addrspace(42) @func0_addrspace_42, ptr addrspace(42) @func1_addrspace_42]15;.16define i32 @func0() !guid !0 {17; CHECK-LABEL: define i32 @func0(18; CHECK-SAME: ) !guid [[META0:![0-9]+]] {19; CHECK-NEXT:    ret i32 120;21; THRESHOLD-0-LABEL: define i32 @func0(22; THRESHOLD-0-SAME: ) !guid [[META0:![0-9]+]] {23; THRESHOLD-0-NEXT:    ret i32 124;25  ret i32 126}27 28define i32 @func1() !guid !1 {29; CHECK-LABEL: define i32 @func1(30; CHECK-SAME: ) !guid [[META1:![0-9]+]] {31; CHECK-NEXT:    ret i32 232;33; THRESHOLD-0-LABEL: define i32 @func1(34; THRESHOLD-0-SAME: ) !guid [[META1:![0-9]+]] {35; THRESHOLD-0-NEXT:    ret i32 236;37  ret i32 238}39 40define i32 @function_with_jump_table(i32 %index) {41; CHECK-LABEL: define i32 @function_with_jump_table(42; CHECK-SAME: i32 [[INDEX:%.*]]) {43; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]44; CHECK-NEXT:    [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 845; CHECK-NEXT:    switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [46; CHECK-NEXT:      i32 0, label [[CALL_0:%.*]]47; CHECK-NEXT:      i32 1, label [[CALL_1:%.*]]48; CHECK-NEXT:    ], !prof [[PROF2:![0-9]+]]49; CHECK:       default.switch.case.unreachable:50; CHECK-NEXT:    unreachable51; CHECK:       call.0:52; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @func0()53; CHECK-NEXT:    br label [[DOTTAIL:%.*]]54; CHECK:       call.1:55; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @func1()56; CHECK-NEXT:    br label [[DOTTAIL]]57; CHECK:       .tail:58; CHECK-NEXT:    [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[CALL_0]] ], [ [[TMP2]], [[CALL_1]] ]59; CHECK-NEXT:    ret i32 [[TMP3]]60;61; THRESHOLD-0-LABEL: define i32 @function_with_jump_table(62; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) {63; THRESHOLD-0-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]64; THRESHOLD-0-NEXT:    [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 865; THRESHOLD-0-NEXT:    [[RESULT:%.*]] = call i32 [[FUNC_PTR]](), !prof [[PROF2:![0-9]+]]66; THRESHOLD-0-NEXT:    ret i32 [[RESULT]]67;68  %gep = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index69  %func_ptr = load ptr, ptr %gep70  %result = call i32 %func_ptr(), !prof !271  ret i32 %result72}73 74define i32 @basic_block_splitted_twice(i32 %index) {75; CHECK-LABEL: define i32 @basic_block_splitted_twice(76; CHECK-SAME: i32 [[INDEX:%.*]]) {77; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]78; CHECK-NEXT:    [[FUNC_PTR1:%.*]] = load ptr, ptr [[GEP1]], align 879; CHECK-NEXT:    switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [80; CHECK-NEXT:      i32 0, label [[CALL_0:%.*]]81; CHECK-NEXT:      i32 1, label [[CALL_1:%.*]]82; CHECK-NEXT:    ], !prof [[PROF3:![0-9]+]]83; CHECK:       default.switch.case.unreachable:84; CHECK-NEXT:    unreachable85; CHECK:       call.0:86; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @func0()87; CHECK-NEXT:    br label [[DOTTAIL:%.*]]88; CHECK:       call.1:89; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @func1()90; CHECK-NEXT:    br label [[DOTTAIL]]91; CHECK:       .tail:92; CHECK-NEXT:    [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[CALL_0]] ], [ [[TMP2]], [[CALL_1]] ]93; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]94; CHECK-NEXT:    [[FUNC_PTR2:%.*]] = load ptr, ptr [[GEP2]], align 895; CHECK-NEXT:    switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE1:%.*]] [96; CHECK-NEXT:      i32 0, label [[CALL_02:%.*]]97; CHECK-NEXT:      i32 1, label [[CALL_13:%.*]]98; CHECK-NEXT:    ], !prof [[PROF3]]99; CHECK:       default.switch.case.unreachable1:100; CHECK-NEXT:    unreachable101; CHECK:       call.02:102; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @func0()103; CHECK-NEXT:    br label [[DOTTAIL_TAIL:%.*]]104; CHECK:       call.13:105; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @func1()106; CHECK-NEXT:    br label [[DOTTAIL_TAIL]]107; CHECK:       .tail.tail:108; CHECK-NEXT:    [[TMP6:%.*]] = phi i32 [ [[TMP4]], [[CALL_02]] ], [ [[TMP5]], [[CALL_13]] ]109; CHECK-NEXT:    [[RESULT:%.*]] = add i32 [[TMP3]], [[TMP6]]110; CHECK-NEXT:    ret i32 [[RESULT]]111;112; THRESHOLD-0-LABEL: define i32 @basic_block_splitted_twice(113; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) {114; THRESHOLD-0-NEXT:    [[GEP1:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]115; THRESHOLD-0-NEXT:    [[FUNC_PTR1:%.*]] = load ptr, ptr [[GEP1]], align 8116; THRESHOLD-0-NEXT:    [[RESULT1:%.*]] = call i32 [[FUNC_PTR1]]()117; THRESHOLD-0-NEXT:    [[GEP2:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]118; THRESHOLD-0-NEXT:    [[FUNC_PTR2:%.*]] = load ptr, ptr [[GEP2]], align 8119; THRESHOLD-0-NEXT:    [[RESULT2:%.*]] = call i32 [[FUNC_PTR2]]()120; THRESHOLD-0-NEXT:    [[RESULT:%.*]] = add i32 [[RESULT1]], [[RESULT2]]121; THRESHOLD-0-NEXT:    ret i32 [[RESULT]]122;123  %gep1 = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index124  %func_ptr1 = load ptr, ptr %gep1125  %result1 = call i32 %func_ptr1()126  %gep2 = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index127  %func_ptr2 = load ptr, ptr %gep2128  %result2 = call i32 %func_ptr2()129  %result = add i32 %result1, %result2130  ret i32 %result131}132 133define void @void_func0() {134; CHECK-LABEL: define void @void_func0() {135; CHECK-NEXT:    ret void136;137; THRESHOLD-0-LABEL: define void @void_func0() {138; THRESHOLD-0-NEXT:    ret void139;140  ret void141}142 143define void @void_func1() {144; CHECK-LABEL: define void @void_func1() {145; CHECK-NEXT:    ret void146;147; THRESHOLD-0-LABEL: define void @void_func1() {148; THRESHOLD-0-NEXT:    ret void149;150  ret void151}152 153@void_func_array = constant [2 x ptr] [ptr @void_func0, ptr @void_func1]154 155define void @void_function_with_jump_table(i32 %index) {156; CHECK-LABEL: define void @void_function_with_jump_table(157; CHECK-SAME: i32 [[INDEX:%.*]]) {158; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]]159; CHECK-NEXT:    [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8160; CHECK-NEXT:    switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [161; CHECK-NEXT:      i32 0, label [[CALL_0:%.*]]162; CHECK-NEXT:      i32 1, label [[CALL_1:%.*]]163; CHECK-NEXT:    ], !prof [[PROF3]]164; CHECK:       default.switch.case.unreachable:165; CHECK-NEXT:    unreachable166; CHECK:       call.0:167; CHECK-NEXT:    call void @void_func0()168; CHECK-NEXT:    br label [[DOTTAIL:%.*]]169; CHECK:       call.1:170; CHECK-NEXT:    call void @void_func1()171; CHECK-NEXT:    br label [[DOTTAIL]]172; CHECK:       .tail:173; CHECK-NEXT:    ret void174;175; THRESHOLD-0-LABEL: define void @void_function_with_jump_table(176; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) {177; THRESHOLD-0-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]]178; THRESHOLD-0-NEXT:    [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8179; THRESHOLD-0-NEXT:    call void [[FUNC_PTR]]()180; THRESHOLD-0-NEXT:    ret void181;182  %gep = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 %index183  %func_ptr = load ptr, ptr %gep184  call void %func_ptr()185  ret void186}187 188define void @void_function_with_jump_table_and_call_site_attr(i32 %index) {189; CHECK-LABEL: define void @void_function_with_jump_table_and_call_site_attr(190; CHECK-SAME: i32 [[INDEX:%.*]]) {191; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]]192; CHECK-NEXT:    [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8193; CHECK-NEXT:    switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [194; CHECK-NEXT:      i32 0, label [[CALL_0:%.*]]195; CHECK-NEXT:      i32 1, label [[CALL_1:%.*]]196; CHECK-NEXT:    ], !prof [[PROF3]]197; CHECK:       default.switch.case.unreachable:198; CHECK-NEXT:    unreachable199; CHECK:       call.0:200; CHECK-NEXT:    call void @void_func0() #[[ATTR0:[0-9]+]]201; CHECK-NEXT:    br label [[DOTTAIL:%.*]]202; CHECK:       call.1:203; CHECK-NEXT:    call void @void_func1() #[[ATTR0]]204; CHECK-NEXT:    br label [[DOTTAIL]]205; CHECK:       .tail:206; CHECK-NEXT:    ret void207;208; THRESHOLD-0-LABEL: define void @void_function_with_jump_table_and_call_site_attr(209; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) {210; THRESHOLD-0-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]]211; THRESHOLD-0-NEXT:    [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8212; THRESHOLD-0-NEXT:    call void [[FUNC_PTR]]() #[[ATTR0:[0-9]+]]213; THRESHOLD-0-NEXT:    ret void214;215  %gep = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 %index216  %func_ptr = load ptr, ptr %gep217  call void %func_ptr() nounwind218  ret void219}220 221 222define i32 @func0_addrspace_42() addrspace(42) {223; CHECK-LABEL: define i32 @func0_addrspace_42() addrspace(42) {224; CHECK-NEXT:    ret i32 1225;226; THRESHOLD-0-LABEL: define i32 @func0_addrspace_42() addrspace(42) {227; THRESHOLD-0-NEXT:    ret i32 1228;229  ret i32 1230}231 232define i32 @func1_addrspace_42() addrspace(42) {233; CHECK-LABEL: define i32 @func1_addrspace_42() addrspace(42) {234; CHECK-NEXT:    ret i32 2235;236; THRESHOLD-0-LABEL: define i32 @func1_addrspace_42() addrspace(42) {237; THRESHOLD-0-NEXT:    ret i32 2238;239  ret i32 2240}241 242@func_array_addrspace_42 = addrspace(42) constant [2 x ptr addrspace(42)] [ptr addrspace(42) @func0_addrspace_42, ptr addrspace(42) @func1_addrspace_42]243 244define i32 @function_with_jump_table_addrspace_42(i32 %index) addrspace(42) {245; CHECK-LABEL: define i32 @function_with_jump_table_addrspace_42(246; CHECK-SAME: i32 [[INDEX:%.*]]) addrspace(42) {247; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr addrspace(42)], ptr addrspace(42) @func_array_addrspace_42, i32 0, i32 [[INDEX]]248; CHECK-NEXT:    [[FUNC_PTR:%.*]] = load ptr addrspace(42), ptr addrspace(42) [[GEP]], align 8249; CHECK-NEXT:    switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [250; CHECK-NEXT:      i32 0, label [[CALL_0:%.*]]251; CHECK-NEXT:      i32 1, label [[CALL_1:%.*]]252; CHECK-NEXT:    ], !prof [[PROF3]]253; CHECK:       default.switch.case.unreachable:254; CHECK-NEXT:    unreachable255; CHECK:       call.0:256; CHECK-NEXT:    [[TMP1:%.*]] = call addrspace(42) i32 @func0_addrspace_42()257; CHECK-NEXT:    br label [[DOTTAIL:%.*]]258; CHECK:       call.1:259; CHECK-NEXT:    [[TMP2:%.*]] = call addrspace(42) i32 @func1_addrspace_42()260; CHECK-NEXT:    br label [[DOTTAIL]]261; CHECK:       .tail:262; CHECK-NEXT:    [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[CALL_0]] ], [ [[TMP2]], [[CALL_1]] ]263; CHECK-NEXT:    ret i32 [[TMP3]]264;265; THRESHOLD-0-LABEL: define i32 @function_with_jump_table_addrspace_42(266; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) addrspace(42) {267; THRESHOLD-0-NEXT:    [[GEP:%.*]] = getelementptr inbounds [2 x ptr addrspace(42)], ptr addrspace(42) @func_array_addrspace_42, i32 0, i32 [[INDEX]]268; THRESHOLD-0-NEXT:    [[FUNC_PTR:%.*]] = load ptr addrspace(42), ptr addrspace(42) [[GEP]], align 8269; THRESHOLD-0-NEXT:    [[RESULT:%.*]] = call addrspace(42) i32 [[FUNC_PTR]]()270; THRESHOLD-0-NEXT:    ret i32 [[RESULT]]271;272  %gep = getelementptr inbounds [2 x ptr addrspace(42)], ptr addrspace(42) @func_array_addrspace_42, i32 0, i32 %index273  %func_ptr = load ptr addrspace(42), ptr addrspace(42) %gep, align 8274  %result = call addrspace(42) i32 %func_ptr()275  ret i32 %result276}277 278!0 = !{i64 5678}279!1 = !{i64 5555}280!2 = !{!"VP", i32 0, i64 25, i64 5678, i64 20, i64 5555, i64 5}281;.282; CHECK: attributes #[[ATTR0]] = { nounwind }283;.284; THRESHOLD-0: attributes #[[ATTR0]] = { nounwind }285;.286; CHECK: [[META0]] = !{i64 5678}287; CHECK: [[META1]] = !{i64 5555}288; CHECK: [[PROF2]] = !{!"branch_weights", i32 0, i32 20, i32 5}289; CHECK: [[PROF3]] = !{!"unknown", !"jump-table-to-switch"}290;.291; THRESHOLD-0: [[META0]] = !{i64 5678}292; THRESHOLD-0: [[META1]] = !{i64 5555}293; THRESHOLD-0: [[PROF2]] = !{!"VP", i32 0, i64 25, i64 5678, i64 20, i64 5555, i64 5}294;.295