203 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt %s -S -passes=inline -inline-threshold=16 -min-jump-table-entries=4 | FileCheck %s -check-prefix=LOOKUPTABLE3; RUN: opt %s -S -passes=inline -inline-threshold=11 -min-jump-table-entries=5 | FileCheck %s -check-prefix=SWITCH4; REQUIRES: x86-registered-target5 6target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"7target triple = "x86_64-unknown-linux-gnu"8 9; The `bar1` should not be inlined since there is a default branch.10 11define i64 @foo1(i64 %a) {12; LOOKUPTABLE-LABEL: define i64 @foo1(13; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {14; LOOKUPTABLE-NEXT: [[B:%.*]] = call i64 @bar1(i64 [[A]])15; LOOKUPTABLE-NEXT: ret i64 [[B]]16;17; SWITCH-LABEL: define i64 @foo1(18; SWITCH-SAME: i64 [[A:%.*]]) {19; SWITCH-NEXT: [[B:%.*]] = call i64 @bar1(i64 [[A]])20; SWITCH-NEXT: ret i64 [[B]]21;22 %b = call i64 @bar1(i64 %a)23 ret i64 %b24}25 26; Since the default branch is undefined behavior,27; we can inline `bar2`: https://github.com/llvm/llvm-project/issues/9092928define i64 @foo2(i64 %a) {29; LOOKUPTABLE-LABEL: define i64 @foo2(30; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {31; LOOKUPTABLE-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT_I:%.*]] [32; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0_I:%.*]]33; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2_I:%.*]]34; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4_I:%.*]]35; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6_I:%.*]]36; LOOKUPTABLE-NEXT: ]37; LOOKUPTABLE: branch_0.i:38; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT:%.*]]39; LOOKUPTABLE: branch_2.i:40; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]]41; LOOKUPTABLE: branch_4.i:42; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]]43; LOOKUPTABLE: branch_6.i:44; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]]45; LOOKUPTABLE: unreachabledefault.i:46; LOOKUPTABLE-NEXT: unreachable47; LOOKUPTABLE: bar2.exit:48; LOOKUPTABLE-NEXT: [[B_I:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ]49; LOOKUPTABLE-NEXT: ret i64 [[B_I]]50;51; SWITCH-LABEL: define i64 @foo2(52; SWITCH-SAME: i64 [[A:%.*]]) {53; SWITCH-NEXT: [[B_I:%.*]] = call i64 @bar2(i64 [[A]])54; SWITCH-NEXT: ret i64 [[B_I]]55;56 %b = call i64 @bar2(i64 %a)57 ret i64 %b58}59 60define i64 @bar1(i64 %a) {61; LOOKUPTABLE-LABEL: define i64 @bar1(62; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {63; LOOKUPTABLE-NEXT: switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [64; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0:%.*]]65; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2:%.*]]66; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4:%.*]]67; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6:%.*]]68; LOOKUPTABLE-NEXT: ]69; LOOKUPTABLE: branch_0:70; LOOKUPTABLE-NEXT: br label [[EXIT:%.*]]71; LOOKUPTABLE: branch_2:72; LOOKUPTABLE-NEXT: br label [[EXIT]]73; LOOKUPTABLE: branch_4:74; LOOKUPTABLE-NEXT: br label [[EXIT]]75; LOOKUPTABLE: branch_6:76; LOOKUPTABLE-NEXT: br label [[EXIT]]77; LOOKUPTABLE: default_branch:78; LOOKUPTABLE-NEXT: br label [[EXIT]]79; LOOKUPTABLE: exit:80; LOOKUPTABLE-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ]81; LOOKUPTABLE-NEXT: ret i64 [[B]]82;83; SWITCH-LABEL: define i64 @bar1(84; SWITCH-SAME: i64 [[A:%.*]]) {85; SWITCH-NEXT: switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [86; SWITCH-NEXT: i64 0, label [[BRANCH_0:%.*]]87; SWITCH-NEXT: i64 2, label [[BRANCH_2:%.*]]88; SWITCH-NEXT: i64 4, label [[BRANCH_4:%.*]]89; SWITCH-NEXT: i64 6, label [[BRANCH_6:%.*]]90; SWITCH-NEXT: ]91; SWITCH: branch_0:92; SWITCH-NEXT: br label [[EXIT:%.*]]93; SWITCH: branch_2:94; SWITCH-NEXT: br label [[EXIT]]95; SWITCH: branch_4:96; SWITCH-NEXT: br label [[EXIT]]97; SWITCH: branch_6:98; SWITCH-NEXT: br label [[EXIT]]99; SWITCH: default_branch:100; SWITCH-NEXT: br label [[EXIT]]101; SWITCH: exit:102; SWITCH-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ]103; SWITCH-NEXT: ret i64 [[B]]104;105 switch i64 %a, label %default_branch [106 i64 0, label %branch_0107 i64 2, label %branch_2108 i64 4, label %branch_4109 i64 6, label %branch_6110 ]111 112branch_0:113 br label %exit114 115branch_2:116 br label %exit117 118branch_4:119 br label %exit120 121branch_6:122 br label %exit123 124default_branch:125 br label %exit126 127exit:128 %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ], [ 3, %default_branch ]129 ret i64 %b130}131 132define i64 @bar2(i64 %a) {133; LOOKUPTABLE-LABEL: define i64 @bar2(134; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {135; LOOKUPTABLE-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [136; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0:%.*]]137; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2:%.*]]138; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4:%.*]]139; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6:%.*]]140; LOOKUPTABLE-NEXT: ]141; LOOKUPTABLE: branch_0:142; LOOKUPTABLE-NEXT: br label [[EXIT:%.*]]143; LOOKUPTABLE: branch_2:144; LOOKUPTABLE-NEXT: br label [[EXIT]]145; LOOKUPTABLE: branch_4:146; LOOKUPTABLE-NEXT: br label [[EXIT]]147; LOOKUPTABLE: branch_6:148; LOOKUPTABLE-NEXT: br label [[EXIT]]149; LOOKUPTABLE: unreachabledefault:150; LOOKUPTABLE-NEXT: unreachable151; LOOKUPTABLE: exit:152; LOOKUPTABLE-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ]153; LOOKUPTABLE-NEXT: ret i64 [[B]]154;155; SWITCH-LABEL: define i64 @bar2(156; SWITCH-SAME: i64 [[A:%.*]]) {157; SWITCH-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [158; SWITCH-NEXT: i64 0, label [[BRANCH_0:%.*]]159; SWITCH-NEXT: i64 2, label [[BRANCH_2:%.*]]160; SWITCH-NEXT: i64 4, label [[BRANCH_4:%.*]]161; SWITCH-NEXT: i64 6, label [[BRANCH_6:%.*]]162; SWITCH-NEXT: ]163; SWITCH: branch_0:164; SWITCH-NEXT: br label [[EXIT:%.*]]165; SWITCH: branch_2:166; SWITCH-NEXT: br label [[EXIT]]167; SWITCH: branch_4:168; SWITCH-NEXT: br label [[EXIT]]169; SWITCH: branch_6:170; SWITCH-NEXT: br label [[EXIT]]171; SWITCH: unreachabledefault:172; SWITCH-NEXT: unreachable173; SWITCH: exit:174; SWITCH-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ]175; SWITCH-NEXT: ret i64 [[B]]176;177 switch i64 %a, label %unreachabledefault [178 i64 0, label %branch_0179 i64 2, label %branch_2180 i64 4, label %branch_4181 i64 6, label %branch_6182 ]183 184branch_0:185 br label %exit186 187branch_2:188 br label %exit189 190branch_4:191 br label %exit192 193branch_6:194 br label %exit195 196unreachabledefault:197 unreachable198 199exit:200 %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ]201 ret i64 %b202}203