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