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