186 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 i1 @test_switch_with_shl_mask(i32 %a) {5; CHECK-LABEL: define i1 @test_switch_with_shl_mask(6; CHECK-SAME: i32 [[A:%.*]]) {7; CHECK-NEXT: entry:8; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[A]] to i89; CHECK-NEXT: switch i8 [[TRUNC]], label [[SW_DEFAULT:%.*]] [10; CHECK-NEXT: i8 0, label [[SW_BB:%.*]]11; CHECK-NEXT: i8 1, label [[SW_BB]]12; CHECK-NEXT: i8 -128, label [[SW_BB]]13; CHECK-NEXT: ]14; CHECK: sw.bb:15; CHECK-NEXT: ret i1 true16; CHECK: sw.default:17; CHECK-NEXT: ret i1 false18;19entry:20 %b = shl i32 %a, 2421 switch i32 %b, label %sw.default [22 i32 0, label %sw.bb23 i32 16777216, label %sw.bb24 i32 2147483648, label %sw.bb25 ]26 27sw.bb:28 ret i1 true29sw.default:30 ret i1 false31}32 33define i1 @test_switch_with_shl_nuw_multiuse(i32 %a) {34; CHECK-LABEL: define i1 @test_switch_with_shl_nuw_multiuse(35; CHECK-SAME: i32 [[A:%.*]]) {36; CHECK-NEXT: entry:37; CHECK-NEXT: [[B:%.*]] = shl nuw i32 [[A]], 2438; CHECK-NEXT: call void @use(i32 [[B]])39; CHECK-NEXT: switch i32 [[A]], label [[SW_DEFAULT:%.*]] [40; CHECK-NEXT: i32 0, label [[SW_BB:%.*]]41; CHECK-NEXT: i32 1, label [[SW_BB]]42; CHECK-NEXT: i32 128, label [[SW_BB]]43; CHECK-NEXT: ]44; CHECK: sw.bb:45; CHECK-NEXT: ret i1 true46; CHECK: sw.default:47; CHECK-NEXT: ret i1 false48;49entry:50 %b = shl nuw i32 %a, 2451 call void @use(i32 %b)52 switch i32 %b, label %sw.default [53 i32 0, label %sw.bb54 i32 16777216, label %sw.bb55 i32 2147483648, label %sw.bb56 ]57 58sw.bb:59 ret i1 true60sw.default:61 ret i1 false62}63 64define i1 @test_switch_with_shl_nsw_multiuse(i32 %a) {65; CHECK-LABEL: define i1 @test_switch_with_shl_nsw_multiuse(66; CHECK-SAME: i32 [[A:%.*]]) {67; CHECK-NEXT: entry:68; CHECK-NEXT: [[B:%.*]] = shl nsw i32 [[A]], 2469; CHECK-NEXT: call void @use(i32 [[B]])70; CHECK-NEXT: switch i32 [[A]], label [[SW_DEFAULT:%.*]] [71; CHECK-NEXT: i32 0, label [[SW_BB:%.*]]72; CHECK-NEXT: i32 1, label [[SW_BB]]73; CHECK-NEXT: i32 -128, label [[SW_BB]]74; CHECK-NEXT: ]75; CHECK: sw.bb:76; CHECK-NEXT: ret i1 true77; CHECK: sw.default:78; CHECK-NEXT: ret i1 false79;80entry:81 %b = shl nsw i32 %a, 2482 call void @use(i32 %b)83 switch i32 %b, label %sw.default [84 i32 0, label %sw.bb85 i32 16777216, label %sw.bb86 i32 2147483648, label %sw.bb87 ]88 89sw.bb:90 ret i1 true91sw.default:92 ret i1 false93}94 95; Negative tests96 97define i1 @test_switch_with_shl_mask_multiuse(i32 %a) {98; CHECK-LABEL: define i1 @test_switch_with_shl_mask_multiuse(99; CHECK-SAME: i32 [[A:%.*]]) {100; CHECK-NEXT: entry:101; CHECK-NEXT: [[B:%.*]] = shl i32 [[A]], 24102; CHECK-NEXT: call void @use(i32 [[B]])103; CHECK-NEXT: switch i32 [[B]], label [[SW_DEFAULT:%.*]] [104; CHECK-NEXT: i32 0, label [[SW_BB:%.*]]105; CHECK-NEXT: i32 16777216, label [[SW_BB]]106; CHECK-NEXT: i32 -2147483648, label [[SW_BB]]107; CHECK-NEXT: ]108; CHECK: sw.bb:109; CHECK-NEXT: ret i1 true110; CHECK: sw.default:111; CHECK-NEXT: ret i1 false112;113entry:114 %b = shl i32 %a, 24115 call void @use(i32 %b)116 switch i32 %b, label %sw.default [117 i32 0, label %sw.bb118 i32 16777216, label %sw.bb119 i32 2147483648, label %sw.bb120 ]121 122sw.bb:123 ret i1 true124sw.default:125 ret i1 false126}127 128define i1 @test_switch_with_shl_mask_unknown_shamt(i32 %a, i32 %shamt) {129; CHECK-LABEL: define i1 @test_switch_with_shl_mask_unknown_shamt(130; CHECK-SAME: i32 [[A:%.*]], i32 [[SHAMT:%.*]]) {131; CHECK-NEXT: entry:132; CHECK-NEXT: [[B:%.*]] = shl i32 [[A]], [[SHAMT]]133; CHECK-NEXT: switch i32 [[B]], label [[SW_DEFAULT:%.*]] [134; CHECK-NEXT: i32 0, label [[SW_BB:%.*]]135; CHECK-NEXT: i32 16777216, label [[SW_BB]]136; CHECK-NEXT: i32 -2147483648, label [[SW_BB]]137; CHECK-NEXT: ]138; CHECK: sw.bb:139; CHECK-NEXT: ret i1 true140; CHECK: sw.default:141; CHECK-NEXT: ret i1 false142;143entry:144 %b = shl i32 %a, %shamt145 switch i32 %b, label %sw.default [146 i32 0, label %sw.bb147 i32 16777216, label %sw.bb148 i32 2147483648, label %sw.bb149 ]150 151sw.bb:152 ret i1 true153sw.default:154 ret i1 false155}156 157define i1 @test_switch_with_shl_mask_poison(i32 %a) {158; CHECK-LABEL: define i1 @test_switch_with_shl_mask_poison(159; CHECK-SAME: i32 [[A:%.*]]) {160; CHECK-NEXT: entry:161; CHECK-NEXT: switch i32 poison, label [[SW_DEFAULT:%.*]] [162; CHECK-NEXT: i32 0, label [[SW_BB:%.*]]163; CHECK-NEXT: i32 16777216, label [[SW_BB]]164; CHECK-NEXT: i32 -2147483648, label [[SW_BB]]165; CHECK-NEXT: ]166; CHECK: sw.bb:167; CHECK-NEXT: ret i1 true168; CHECK: sw.default:169; CHECK-NEXT: ret i1 false170;171entry:172 %b = shl i32 %a, 32173 switch i32 %b, label %sw.default [174 i32 0, label %sw.bb175 i32 16777216, label %sw.bb176 i32 2147483648, label %sw.bb177 ]178 179sw.bb:180 ret i1 true181sw.default:182 ret i1 false183}184 185declare void @use(i32)186