1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define void @test_ult_rhsc(i8 %x) { 5; CHECK-LABEL: define void @test_ult_rhsc( 6; CHECK-SAME: i8 [[X:%.*]]) { 7; CHECK-NEXT: switch i8 [[X]], label [[BB1:%.*]] [ 8; CHECK-NEXT: i8 2, label [[BB2:%.*]] 9; CHECK-NEXT: i8 12, label [[BB3:%.*]] 10; CHECK-NEXT: ] 11; CHECK: bb1: 12; CHECK-NEXT: call void @func1() 13; CHECK-NEXT: unreachable 14; CHECK: bb2: 15; CHECK-NEXT: call void @func2() 16; CHECK-NEXT: unreachable 17; CHECK: bb3: 18; CHECK-NEXT: call void @func3() 19; CHECK-NEXT: unreachable 20; 21 %val = add nsw i8 %x, -2 22 %cmp = icmp ult i8 %val, 11 23 %cond = select i1 %cmp, i8 %val, i8 6 24 switch i8 %cond, label %bb1 [ 25 i8 0, label %bb2 26 i8 10, label %bb3 27 ] 28 29bb1: 30 call void @func1() 31 unreachable 32bb2: 33 call void @func2() 34 unreachable 35bb3: 36 call void @func3() 37 unreachable 38} 39 40define void @test_eq_lhsc(i8 %x) { 41; CHECK-LABEL: define void @test_eq_lhsc( 42; CHECK-SAME: i8 [[X:%.*]]) { 43; CHECK-NEXT: switch i8 [[X]], label [[BB1:%.*]] [ 44; CHECK-NEXT: i8 0, label [[BB2:%.*]] 45; CHECK-NEXT: i8 10, label [[BB3:%.*]] 46; CHECK-NEXT: ] 47; CHECK: bb1: 48; CHECK-NEXT: call void @func1() 49; CHECK-NEXT: unreachable 50; CHECK: bb2: 51; CHECK-NEXT: call void @func2() 52; CHECK-NEXT: unreachable 53; CHECK: bb3: 54; CHECK-NEXT: call void @func3() 55; CHECK-NEXT: unreachable 56; 57 %cmp = icmp eq i8 %x, 4 58 %cond = select i1 %cmp, i8 6, i8 %x 59 switch i8 %cond, label %bb1 [ 60 i8 0, label %bb2 61 i8 10, label %bb3 62 ] 63 64bb1: 65 call void @func1() 66 unreachable 67bb2: 68 call void @func2() 69 unreachable 70bb3: 71 call void @func3() 72 unreachable 73} 74 75define void @test_ult_rhsc_invalid_cond(i8 %x, i8 %y) { 76; CHECK-LABEL: define void @test_ult_rhsc_invalid_cond( 77; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { 78; CHECK-NEXT: [[VAL:%.*]] = add nsw i8 [[X]], -2 79; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y]], 11 80; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6 81; CHECK-NEXT: switch i8 [[COND]], label [[BB1:%.*]] [ 82; CHECK-NEXT: i8 0, label [[BB2:%.*]] 83; CHECK-NEXT: i8 10, label [[BB3:%.*]] 84; CHECK-NEXT: i8 13, label [[BB3]] 85; CHECK-NEXT: ] 86; CHECK: bb1: 87; CHECK-NEXT: call void @func1() 88; CHECK-NEXT: unreachable 89; CHECK: bb2: 90; CHECK-NEXT: call void @func2() 91; CHECK-NEXT: unreachable 92; CHECK: bb3: 93; CHECK-NEXT: call void @func3() 94; CHECK-NEXT: unreachable 95; 96 %val = add nsw i8 %x, -2 97 %cmp = icmp ult i8 %y, 11 98 %cond = select i1 %cmp, i8 %val, i8 6 99 switch i8 %cond, label %bb1 [ 100 i8 0, label %bb2 101 i8 10, label %bb3 102 i8 13, label %bb3 103 ] 104 105bb1: 106 call void @func1() 107 unreachable 108bb2: 109 call void @func2() 110 unreachable 111bb3: 112 call void @func3() 113 unreachable 114} 115 116define void @test_ult_rhsc_fail(i8 %x) { 117; CHECK-LABEL: define void @test_ult_rhsc_fail( 118; CHECK-SAME: i8 [[X:%.*]]) { 119; CHECK-NEXT: [[VAL:%.*]] = add nsw i8 [[X]], -2 120; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[VAL]], 11 121; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6 122; CHECK-NEXT: switch i8 [[COND]], label [[BB1:%.*]] [ 123; CHECK-NEXT: i8 0, label [[BB2:%.*]] 124; CHECK-NEXT: i8 10, label [[BB3:%.*]] 125; CHECK-NEXT: i8 13, label [[BB3]] 126; CHECK-NEXT: ] 127; CHECK: bb1: 128; CHECK-NEXT: call void @func1() 129; CHECK-NEXT: unreachable 130; CHECK: bb2: 131; CHECK-NEXT: call void @func2() 132; CHECK-NEXT: unreachable 133; CHECK: bb3: 134; CHECK-NEXT: call void @func3() 135; CHECK-NEXT: unreachable 136; 137 %val = add nsw i8 %x, -2 138 %cmp = icmp ult i8 %val, 11 139 %cond = select i1 %cmp, i8 %val, i8 6 140 switch i8 %cond, label %bb1 [ 141 i8 0, label %bb2 142 i8 10, label %bb3 143 i8 13, label %bb3 144 ] 145 146bb1: 147 call void @func1() 148 unreachable 149bb2: 150 call void @func2() 151 unreachable 152bb3: 153 call void @func3() 154 unreachable 155} 156 157declare void @func1() 158declare void @func2() 159declare void @func3() 160