xref: /llvm-project/llvm/test/Transforms/Inline/inline-switch-default.ll (revision 1fe4f2d1a4b9d16ae41076608783df4427a4d985)
15932fcc4SQuentin Dian; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2d48bf8aeSDianQK; RUN: opt %s -S -passes=inline -inline-threshold=16 -min-jump-table-entries=4 | FileCheck %s -check-prefix=LOOKUPTABLE
3d48bf8aeSDianQK; RUN: opt %s -S -passes=inline -inline-threshold=11 -min-jump-table-entries=5 | FileCheck %s -check-prefix=SWITCH
4*1fe4f2d1SMin-Yih Hsu; REQUIRES: x86-registered-target
55932fcc4SQuentin Dian
65932fcc4SQuentin Diantarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
75932fcc4SQuentin Diantarget triple = "x86_64-unknown-linux-gnu"
85932fcc4SQuentin Dian
95932fcc4SQuentin Dian; The `bar1` should not be inlined since there is a default branch.
105932fcc4SQuentin Dian
115932fcc4SQuentin Diandefine i64 @foo1(i64 %a) {
125932fcc4SQuentin Dian; LOOKUPTABLE-LABEL: define i64 @foo1(
135932fcc4SQuentin Dian; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {
145932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    [[B:%.*]] = call i64 @bar1(i64 [[A]])
155932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ret i64 [[B]]
165932fcc4SQuentin Dian;
175932fcc4SQuentin Dian; SWITCH-LABEL: define i64 @foo1(
185932fcc4SQuentin Dian; SWITCH-SAME: i64 [[A:%.*]]) {
195932fcc4SQuentin Dian; SWITCH-NEXT:    [[B:%.*]] = call i64 @bar1(i64 [[A]])
205932fcc4SQuentin Dian; SWITCH-NEXT:    ret i64 [[B]]
215932fcc4SQuentin Dian;
225932fcc4SQuentin Dian  %b = call i64 @bar1(i64 %a)
235932fcc4SQuentin Dian  ret i64 %b
245932fcc4SQuentin Dian}
255932fcc4SQuentin Dian
26d48bf8aeSDianQK; Since the default branch is undefined behavior,
27d48bf8aeSDianQK; we can inline `bar2`: https://github.com/llvm/llvm-project/issues/90929
285932fcc4SQuentin Diandefine i64 @foo2(i64 %a) {
295932fcc4SQuentin Dian; LOOKUPTABLE-LABEL: define i64 @foo2(
305932fcc4SQuentin Dian; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {
315932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    switch i64 [[A]], label [[UNREACHABLEDEFAULT_I:%.*]] [
325932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 0, label [[BRANCH_0_I:%.*]]
335932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 2, label [[BRANCH_2_I:%.*]]
345932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 4, label [[BRANCH_4_I:%.*]]
355932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 6, label [[BRANCH_6_I:%.*]]
365932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ]
375932fcc4SQuentin Dian; LOOKUPTABLE:       branch_0.i:
385932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[BAR2_EXIT:%.*]]
395932fcc4SQuentin Dian; LOOKUPTABLE:       branch_2.i:
405932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[BAR2_EXIT]]
415932fcc4SQuentin Dian; LOOKUPTABLE:       branch_4.i:
425932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[BAR2_EXIT]]
435932fcc4SQuentin Dian; LOOKUPTABLE:       branch_6.i:
445932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[BAR2_EXIT]]
455932fcc4SQuentin Dian; LOOKUPTABLE:       unreachabledefault.i:
465932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    unreachable
475932fcc4SQuentin Dian; LOOKUPTABLE:       bar2.exit:
485932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    [[B_I:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ]
495932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ret i64 [[B_I]]
505932fcc4SQuentin Dian;
515932fcc4SQuentin Dian; SWITCH-LABEL: define i64 @foo2(
525932fcc4SQuentin Dian; SWITCH-SAME: i64 [[A:%.*]]) {
53d48bf8aeSDianQK; SWITCH-NEXT:    [[B_I:%.*]] = call i64 @bar2(i64 [[A]])
545932fcc4SQuentin Dian; SWITCH-NEXT:    ret i64 [[B_I]]
555932fcc4SQuentin Dian;
565932fcc4SQuentin Dian  %b = call i64 @bar2(i64 %a)
575932fcc4SQuentin Dian  ret i64 %b
585932fcc4SQuentin Dian}
595932fcc4SQuentin Dian
605932fcc4SQuentin Diandefine i64 @bar1(i64 %a) {
615932fcc4SQuentin Dian; LOOKUPTABLE-LABEL: define i64 @bar1(
625932fcc4SQuentin Dian; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {
635932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [
645932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 0, label [[BRANCH_0:%.*]]
655932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 2, label [[BRANCH_2:%.*]]
665932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 4, label [[BRANCH_4:%.*]]
675932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 6, label [[BRANCH_6:%.*]]
685932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ]
695932fcc4SQuentin Dian; LOOKUPTABLE:       branch_0:
705932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT:%.*]]
715932fcc4SQuentin Dian; LOOKUPTABLE:       branch_2:
725932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
735932fcc4SQuentin Dian; LOOKUPTABLE:       branch_4:
745932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
755932fcc4SQuentin Dian; LOOKUPTABLE:       branch_6:
765932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
775932fcc4SQuentin Dian; LOOKUPTABLE:       default_branch:
785932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
795932fcc4SQuentin Dian; LOOKUPTABLE:       exit:
805932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ]
815932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ret i64 [[B]]
825932fcc4SQuentin Dian;
835932fcc4SQuentin Dian; SWITCH-LABEL: define i64 @bar1(
845932fcc4SQuentin Dian; SWITCH-SAME: i64 [[A:%.*]]) {
855932fcc4SQuentin Dian; SWITCH-NEXT:    switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [
865932fcc4SQuentin Dian; SWITCH-NEXT:      i64 0, label [[BRANCH_0:%.*]]
875932fcc4SQuentin Dian; SWITCH-NEXT:      i64 2, label [[BRANCH_2:%.*]]
885932fcc4SQuentin Dian; SWITCH-NEXT:      i64 4, label [[BRANCH_4:%.*]]
895932fcc4SQuentin Dian; SWITCH-NEXT:      i64 6, label [[BRANCH_6:%.*]]
905932fcc4SQuentin Dian; SWITCH-NEXT:    ]
915932fcc4SQuentin Dian; SWITCH:       branch_0:
925932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT:%.*]]
935932fcc4SQuentin Dian; SWITCH:       branch_2:
945932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
955932fcc4SQuentin Dian; SWITCH:       branch_4:
965932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
975932fcc4SQuentin Dian; SWITCH:       branch_6:
985932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
995932fcc4SQuentin Dian; SWITCH:       default_branch:
1005932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
1015932fcc4SQuentin Dian; SWITCH:       exit:
1025932fcc4SQuentin Dian; SWITCH-NEXT:    [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ]
1035932fcc4SQuentin Dian; SWITCH-NEXT:    ret i64 [[B]]
1045932fcc4SQuentin Dian;
1055932fcc4SQuentin Dian  switch i64 %a, label %default_branch [
1065932fcc4SQuentin Dian  i64 0, label %branch_0
1075932fcc4SQuentin Dian  i64 2, label %branch_2
1085932fcc4SQuentin Dian  i64 4, label %branch_4
1095932fcc4SQuentin Dian  i64 6, label %branch_6
1105932fcc4SQuentin Dian  ]
1115932fcc4SQuentin Dian
1125932fcc4SQuentin Dianbranch_0:
1135932fcc4SQuentin Dian  br label %exit
1145932fcc4SQuentin Dian
1155932fcc4SQuentin Dianbranch_2:
1165932fcc4SQuentin Dian  br label %exit
1175932fcc4SQuentin Dian
1185932fcc4SQuentin Dianbranch_4:
1195932fcc4SQuentin Dian  br label %exit
1205932fcc4SQuentin Dian
1215932fcc4SQuentin Dianbranch_6:
1225932fcc4SQuentin Dian  br label %exit
1235932fcc4SQuentin Dian
1245932fcc4SQuentin Diandefault_branch:
1255932fcc4SQuentin Dian  br label %exit
1265932fcc4SQuentin Dian
1275932fcc4SQuentin Dianexit:
1285932fcc4SQuentin Dian  %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ], [ 3, %default_branch ]
1295932fcc4SQuentin Dian  ret i64 %b
1305932fcc4SQuentin Dian}
1315932fcc4SQuentin Dian
1325932fcc4SQuentin Diandefine i64 @bar2(i64 %a) {
1335932fcc4SQuentin Dian; LOOKUPTABLE-LABEL: define i64 @bar2(
1345932fcc4SQuentin Dian; LOOKUPTABLE-SAME: i64 [[A:%.*]]) {
1355932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [
1365932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 0, label [[BRANCH_0:%.*]]
1375932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 2, label [[BRANCH_2:%.*]]
1385932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 4, label [[BRANCH_4:%.*]]
1395932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:      i64 6, label [[BRANCH_6:%.*]]
1405932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ]
1415932fcc4SQuentin Dian; LOOKUPTABLE:       branch_0:
1425932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT:%.*]]
1435932fcc4SQuentin Dian; LOOKUPTABLE:       branch_2:
1445932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
1455932fcc4SQuentin Dian; LOOKUPTABLE:       branch_4:
1465932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
1475932fcc4SQuentin Dian; LOOKUPTABLE:       branch_6:
1485932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    br label [[EXIT]]
1495932fcc4SQuentin Dian; LOOKUPTABLE:       unreachabledefault:
1505932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    unreachable
1515932fcc4SQuentin Dian; LOOKUPTABLE:       exit:
1525932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ]
1535932fcc4SQuentin Dian; LOOKUPTABLE-NEXT:    ret i64 [[B]]
1545932fcc4SQuentin Dian;
1555932fcc4SQuentin Dian; SWITCH-LABEL: define i64 @bar2(
1565932fcc4SQuentin Dian; SWITCH-SAME: i64 [[A:%.*]]) {
1575932fcc4SQuentin Dian; SWITCH-NEXT:    switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [
1585932fcc4SQuentin Dian; SWITCH-NEXT:      i64 0, label [[BRANCH_0:%.*]]
1595932fcc4SQuentin Dian; SWITCH-NEXT:      i64 2, label [[BRANCH_2:%.*]]
1605932fcc4SQuentin Dian; SWITCH-NEXT:      i64 4, label [[BRANCH_4:%.*]]
1615932fcc4SQuentin Dian; SWITCH-NEXT:      i64 6, label [[BRANCH_6:%.*]]
1625932fcc4SQuentin Dian; SWITCH-NEXT:    ]
1635932fcc4SQuentin Dian; SWITCH:       branch_0:
1645932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT:%.*]]
1655932fcc4SQuentin Dian; SWITCH:       branch_2:
1665932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
1675932fcc4SQuentin Dian; SWITCH:       branch_4:
1685932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
1695932fcc4SQuentin Dian; SWITCH:       branch_6:
1705932fcc4SQuentin Dian; SWITCH-NEXT:    br label [[EXIT]]
1715932fcc4SQuentin Dian; SWITCH:       unreachabledefault:
1725932fcc4SQuentin Dian; SWITCH-NEXT:    unreachable
1735932fcc4SQuentin Dian; SWITCH:       exit:
1745932fcc4SQuentin Dian; SWITCH-NEXT:    [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ]
1755932fcc4SQuentin Dian; SWITCH-NEXT:    ret i64 [[B]]
1765932fcc4SQuentin Dian;
1775932fcc4SQuentin Dian  switch i64 %a, label %unreachabledefault [
1785932fcc4SQuentin Dian  i64 0, label %branch_0
1795932fcc4SQuentin Dian  i64 2, label %branch_2
1805932fcc4SQuentin Dian  i64 4, label %branch_4
1815932fcc4SQuentin Dian  i64 6, label %branch_6
1825932fcc4SQuentin Dian  ]
1835932fcc4SQuentin Dian
1845932fcc4SQuentin Dianbranch_0:
1855932fcc4SQuentin Dian  br label %exit
1865932fcc4SQuentin Dian
1875932fcc4SQuentin Dianbranch_2:
1885932fcc4SQuentin Dian  br label %exit
1895932fcc4SQuentin Dian
1905932fcc4SQuentin Dianbranch_4:
1915932fcc4SQuentin Dian  br label %exit
1925932fcc4SQuentin Dian
1935932fcc4SQuentin Dianbranch_6:
1945932fcc4SQuentin Dian  br label %exit
1955932fcc4SQuentin Dian
1965932fcc4SQuentin Dianunreachabledefault:
1975932fcc4SQuentin Dian  unreachable
1985932fcc4SQuentin Dian
1995932fcc4SQuentin Dianexit:
2005932fcc4SQuentin Dian  %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ]
2015932fcc4SQuentin Dian  ret i64 %b
2025932fcc4SQuentin Dian}
203