; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt %s -S -passes=inline -inline-threshold=21 | FileCheck %s ; Check for scenarios without TTI. define i64 @foo1(i64 %a) { ; LOOKUPTABLE-LABEL: define i64 @foo1( ; LOOKUPTABLE-SAME: i64 [[TMP0:%.*]]) { ; LOOKUPTABLE-NEXT: switch i64 [[TMP0]], label [[DEFAULT_BRANCH_I:%.*]] [ ; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0_I:%.*]] ; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2_I:%.*]] ; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4_I:%.*]] ; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6_I:%.*]] ; LOOKUPTABLE-NEXT: ] ; LOOKUPTABLE: branch_0.i: ; LOOKUPTABLE-NEXT: br label [[BAR1_EXIT:%.*]] ; LOOKUPTABLE: branch_2.i: ; LOOKUPTABLE-NEXT: br label [[BAR1_EXIT]] ; LOOKUPTABLE: branch_4.i: ; LOOKUPTABLE-NEXT: br label [[BAR1_EXIT]] ; LOOKUPTABLE: branch_6.i: ; LOOKUPTABLE-NEXT: br label [[BAR1_EXIT]] ; LOOKUPTABLE: default_branch.i: ; LOOKUPTABLE-NEXT: br label [[BAR1_EXIT]] ; LOOKUPTABLE: bar1.exit: ; LOOKUPTABLE-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ], [ 3, [[DEFAULT_BRANCH_I]] ] ; LOOKUPTABLE-NEXT: ret i64 [[TMP2]] ; ; SWITCH-LABEL: define i64 @foo1( ; SWITCH-SAME: i64 [[TMP0:%.*]]) { ; SWITCH-NEXT: switch i64 [[TMP0]], label [[DEFAULT_BRANCH_I:%.*]] [ ; SWITCH-NEXT: i64 0, label [[BRANCH_0_I:%.*]] ; SWITCH-NEXT: i64 2, label [[BRANCH_2_I:%.*]] ; SWITCH-NEXT: i64 4, label [[BRANCH_4_I:%.*]] ; SWITCH-NEXT: i64 6, label [[BRANCH_6_I:%.*]] ; SWITCH-NEXT: ] ; SWITCH: branch_0.i: ; SWITCH-NEXT: br label [[BAR1_EXIT:%.*]] ; SWITCH: branch_2.i: ; SWITCH-NEXT: br label [[BAR1_EXIT]] ; SWITCH: branch_4.i: ; SWITCH-NEXT: br label [[BAR1_EXIT]] ; SWITCH: branch_6.i: ; SWITCH-NEXT: br label [[BAR1_EXIT]] ; SWITCH: default_branch.i: ; SWITCH-NEXT: br label [[BAR1_EXIT]] ; SWITCH: bar1.exit: ; SWITCH-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ], [ 3, [[DEFAULT_BRANCH_I]] ] ; SWITCH-NEXT: ret i64 [[TMP2]] ; ; CHECK-LABEL: define i64 @foo1( ; CHECK-SAME: i64 [[A:%.*]]) { ; CHECK-NEXT: [[B:%.*]] = call i64 @bar1(i64 [[A]]) ; CHECK-NEXT: ret i64 [[B]] ; %b = call i64 @bar1(i64 %a) ret i64 %b } define i64 @foo2(i64 %a) { ; LOOKUPTABLE-LABEL: define i64 @foo2( ; LOOKUPTABLE-SAME: i64 [[TMP0:%.*]]) { ; LOOKUPTABLE-NEXT: switch i64 [[TMP0]], label [[UNREACHABLEDEFAULT_I:%.*]] [ ; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0_I:%.*]] ; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2_I:%.*]] ; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4_I:%.*]] ; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6_I:%.*]] ; LOOKUPTABLE-NEXT: ] ; LOOKUPTABLE: branch_0.i: ; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT:%.*]] ; LOOKUPTABLE: branch_2.i: ; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]] ; LOOKUPTABLE: branch_4.i: ; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]] ; LOOKUPTABLE: branch_6.i: ; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]] ; LOOKUPTABLE: unreachabledefault.i: ; LOOKUPTABLE-NEXT: unreachable ; LOOKUPTABLE: bar2.exit: ; LOOKUPTABLE-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ] ; LOOKUPTABLE-NEXT: ret i64 [[TMP2]] ; ; SWITCH-LABEL: define i64 @foo2( ; SWITCH-SAME: i64 [[TMP0:%.*]]) { ; SWITCH-NEXT: switch i64 [[TMP0]], label [[UNREACHABLEDEFAULT_I:%.*]] [ ; SWITCH-NEXT: i64 0, label [[BRANCH_0_I:%.*]] ; SWITCH-NEXT: i64 2, label [[BRANCH_2_I:%.*]] ; SWITCH-NEXT: i64 4, label [[BRANCH_4_I:%.*]] ; SWITCH-NEXT: i64 6, label [[BRANCH_6_I:%.*]] ; SWITCH-NEXT: ] ; SWITCH: branch_0.i: ; SWITCH-NEXT: br label [[BAR2_EXIT:%.*]] ; SWITCH: branch_2.i: ; SWITCH-NEXT: br label [[BAR2_EXIT]] ; SWITCH: branch_4.i: ; SWITCH-NEXT: br label [[BAR2_EXIT]] ; SWITCH: branch_6.i: ; SWITCH-NEXT: br label [[BAR2_EXIT]] ; SWITCH: unreachabledefault.i: ; SWITCH-NEXT: unreachable ; SWITCH: bar2.exit: ; SWITCH-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ] ; SWITCH-NEXT: ret i64 [[TMP2]] ; ; CHECK-LABEL: define i64 @foo2( ; CHECK-SAME: i64 [[A:%.*]]) { ; CHECK-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT_I:%.*]] [ ; CHECK-NEXT: i64 0, label [[BRANCH_0_I:%.*]] ; CHECK-NEXT: i64 2, label [[BRANCH_2_I:%.*]] ; CHECK-NEXT: i64 4, label [[BRANCH_4_I:%.*]] ; CHECK-NEXT: i64 6, label [[BRANCH_6_I:%.*]] ; CHECK-NEXT: ] ; CHECK: branch_0.i: ; CHECK-NEXT: br label [[BAR2_EXIT:%.*]] ; CHECK: branch_2.i: ; CHECK-NEXT: br label [[BAR2_EXIT]] ; CHECK: branch_4.i: ; CHECK-NEXT: br label [[BAR2_EXIT]] ; CHECK: branch_6.i: ; CHECK-NEXT: br label [[BAR2_EXIT]] ; CHECK: unreachabledefault.i: ; CHECK-NEXT: unreachable ; CHECK: bar2.exit: ; CHECK-NEXT: [[B_I:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ] ; CHECK-NEXT: ret i64 [[B_I]] ; %b = call i64 @bar2(i64 %a) ret i64 %b } define i64 @bar1(i64 %a) { ; LOOKUPTABLE-LABEL: define i64 @bar1( ; LOOKUPTABLE-SAME: i64 [[TMP0:%.*]]) { ; LOOKUPTABLE-NEXT: switch i64 [[TMP0]], label [[DEFAULT_BRANCH:%.*]] [ ; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0:%.*]] ; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2:%.*]] ; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4:%.*]] ; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6:%.*]] ; LOOKUPTABLE-NEXT: ] ; LOOKUPTABLE: branch_0: ; LOOKUPTABLE-NEXT: br label [[EXIT:%.*]] ; LOOKUPTABLE: branch_2: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: branch_4: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: branch_6: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: default_branch: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: exit: ; LOOKUPTABLE-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ] ; LOOKUPTABLE-NEXT: ret i64 [[TMP2]] ; ; SWITCH-LABEL: define i64 @bar1( ; SWITCH-SAME: i64 [[TMP0:%.*]]) { ; SWITCH-NEXT: switch i64 [[TMP0]], label [[DEFAULT_BRANCH:%.*]] [ ; SWITCH-NEXT: i64 0, label [[BRANCH_0:%.*]] ; SWITCH-NEXT: i64 2, label [[BRANCH_2:%.*]] ; SWITCH-NEXT: i64 4, label [[BRANCH_4:%.*]] ; SWITCH-NEXT: i64 6, label [[BRANCH_6:%.*]] ; SWITCH-NEXT: ] ; SWITCH: branch_0: ; SWITCH-NEXT: br label [[EXIT:%.*]] ; SWITCH: branch_2: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: branch_4: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: branch_6: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: default_branch: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: exit: ; SWITCH-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ] ; SWITCH-NEXT: ret i64 [[TMP2]] ; ; CHECK-LABEL: define i64 @bar1( ; CHECK-SAME: i64 [[A:%.*]]) { ; CHECK-NEXT: switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [ ; CHECK-NEXT: i64 0, label [[BRANCH_0:%.*]] ; CHECK-NEXT: i64 2, label [[BRANCH_2:%.*]] ; CHECK-NEXT: i64 4, label [[BRANCH_4:%.*]] ; CHECK-NEXT: i64 6, label [[BRANCH_6:%.*]] ; CHECK-NEXT: ] ; CHECK: branch_0: ; CHECK-NEXT: br label [[EXIT:%.*]] ; CHECK: branch_2: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: branch_4: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: branch_6: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: default_branch: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ] ; CHECK-NEXT: ret i64 [[B]] ; switch i64 %a, label %default_branch [ i64 0, label %branch_0 i64 2, label %branch_2 i64 4, label %branch_4 i64 6, label %branch_6 ] branch_0: br label %exit branch_2: br label %exit branch_4: br label %exit branch_6: br label %exit default_branch: br label %exit exit: %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ], [ 3, %default_branch ] ret i64 %b } define i64 @bar2(i64 %a) { ; LOOKUPTABLE-LABEL: define i64 @bar2( ; LOOKUPTABLE-SAME: i64 [[TMP0:%.*]]) { ; LOOKUPTABLE-NEXT: switch i64 [[TMP0]], label [[UNREACHABLEDEFAULT:%.*]] [ ; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0:%.*]] ; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2:%.*]] ; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4:%.*]] ; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6:%.*]] ; LOOKUPTABLE-NEXT: ] ; LOOKUPTABLE: branch_0: ; LOOKUPTABLE-NEXT: br label [[EXIT:%.*]] ; LOOKUPTABLE: branch_2: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: branch_4: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: branch_6: ; LOOKUPTABLE-NEXT: br label [[EXIT]] ; LOOKUPTABLE: unreachabledefault: ; LOOKUPTABLE-NEXT: unreachable ; LOOKUPTABLE: exit: ; LOOKUPTABLE-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ] ; LOOKUPTABLE-NEXT: ret i64 [[TMP2]] ; ; SWITCH-LABEL: define i64 @bar2( ; SWITCH-SAME: i64 [[TMP0:%.*]]) { ; SWITCH-NEXT: switch i64 [[TMP0]], label [[UNREACHABLEDEFAULT:%.*]] [ ; SWITCH-NEXT: i64 0, label [[BRANCH_0:%.*]] ; SWITCH-NEXT: i64 2, label [[BRANCH_2:%.*]] ; SWITCH-NEXT: i64 4, label [[BRANCH_4:%.*]] ; SWITCH-NEXT: i64 6, label [[BRANCH_6:%.*]] ; SWITCH-NEXT: ] ; SWITCH: branch_0: ; SWITCH-NEXT: br label [[EXIT:%.*]] ; SWITCH: branch_2: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: branch_4: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: branch_6: ; SWITCH-NEXT: br label [[EXIT]] ; SWITCH: unreachabledefault: ; SWITCH-NEXT: unreachable ; SWITCH: exit: ; SWITCH-NEXT: [[TMP2:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ] ; SWITCH-NEXT: ret i64 [[TMP2]] ; ; CHECK-LABEL: define i64 @bar2( ; CHECK-SAME: i64 [[A:%.*]]) { ; CHECK-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [ ; CHECK-NEXT: i64 0, label [[BRANCH_0:%.*]] ; CHECK-NEXT: i64 2, label [[BRANCH_2:%.*]] ; CHECK-NEXT: i64 4, label [[BRANCH_4:%.*]] ; CHECK-NEXT: i64 6, label [[BRANCH_6:%.*]] ; CHECK-NEXT: ] ; CHECK: branch_0: ; CHECK-NEXT: br label [[EXIT:%.*]] ; CHECK: branch_2: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: branch_4: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: branch_6: ; CHECK-NEXT: br label [[EXIT]] ; CHECK: unreachabledefault: ; CHECK-NEXT: unreachable ; CHECK: exit: ; CHECK-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ] ; CHECK-NEXT: ret i64 [[B]] ; switch i64 %a, label %unreachabledefault [ i64 0, label %branch_0 i64 2, label %branch_2 i64 4, label %branch_4 i64 6, label %branch_6 ] branch_0: br label %exit branch_2: br label %exit branch_4: br label %exit branch_6: br label %exit unreachabledefault: unreachable exit: %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ] ret i64 %b }