brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · 1cc2f2e Raw
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