160 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 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: unreachable14; CHECK: bb2:15; CHECK-NEXT: call void @func2()16; CHECK-NEXT: unreachable17; CHECK: bb3:18; CHECK-NEXT: call void @func3()19; CHECK-NEXT: unreachable20;21 %val = add nsw i8 %x, -222 %cmp = icmp ult i8 %val, 1123 %cond = select i1 %cmp, i8 %val, i8 624 switch i8 %cond, label %bb1 [25 i8 0, label %bb226 i8 10, label %bb327 ]28 29bb1:30 call void @func1()31 unreachable32bb2:33 call void @func2()34 unreachable35bb3:36 call void @func3()37 unreachable38}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: unreachable50; CHECK: bb2:51; CHECK-NEXT: call void @func2()52; CHECK-NEXT: unreachable53; CHECK: bb3:54; CHECK-NEXT: call void @func3()55; CHECK-NEXT: unreachable56;57 %cmp = icmp eq i8 %x, 458 %cond = select i1 %cmp, i8 6, i8 %x59 switch i8 %cond, label %bb1 [60 i8 0, label %bb261 i8 10, label %bb362 ]63 64bb1:65 call void @func1()66 unreachable67bb2:68 call void @func2()69 unreachable70bb3:71 call void @func3()72 unreachable73}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]], -279; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y]], 1180; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 681; 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: unreachable89; CHECK: bb2:90; CHECK-NEXT: call void @func2()91; CHECK-NEXT: unreachable92; CHECK: bb3:93; CHECK-NEXT: call void @func3()94; CHECK-NEXT: unreachable95;96 %val = add nsw i8 %x, -297 %cmp = icmp ult i8 %y, 1198 %cond = select i1 %cmp, i8 %val, i8 699 switch i8 %cond, label %bb1 [100 i8 0, label %bb2101 i8 10, label %bb3102 i8 13, label %bb3103 ]104 105bb1:106 call void @func1()107 unreachable108bb2:109 call void @func2()110 unreachable111bb3:112 call void @func3()113 unreachable114}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]], -2120; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[VAL]], 11121; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6122; 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: unreachable130; CHECK: bb2:131; CHECK-NEXT: call void @func2()132; CHECK-NEXT: unreachable133; CHECK: bb3:134; CHECK-NEXT: call void @func3()135; CHECK-NEXT: unreachable136;137 %val = add nsw i8 %x, -2138 %cmp = icmp ult i8 %val, 11139 %cond = select i1 %cmp, i8 %val, i8 6140 switch i8 %cond, label %bb1 [141 i8 0, label %bb2142 i8 10, label %bb3143 i8 13, label %bb3144 ]145 146bb1:147 call void @func1()148 unreachable149bb2:150 call void @func2()151 unreachable152bb3:153 call void @func3()154 unreachable155}156 157declare void @func1()158declare void @func2()159declare void @func3()160