123 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_zext(i16 %a, i1 %b, i1 %c) {5; CHECK-LABEL: define i1 @test_switch_with_zext(6; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {7; CHECK-NEXT: entry:8; CHECK-NEXT: switch i16 [[A]], label [[SW_DEFAULT:%.*]] [9; CHECK-NEXT: i16 37, label [[SW_BB:%.*]]10; CHECK-NEXT: i16 38, label [[SW_BB]]11; CHECK-NEXT: i16 39, label [[SW_BB]]12; CHECK-NEXT: ]13; CHECK: sw.bb:14; CHECK-NEXT: ret i1 [[B]]15; CHECK: sw.default:16; CHECK-NEXT: ret i1 [[C]]17;18entry:19 %a.ext = zext i16 %a to i3220 switch i32 %a.ext, label %sw.default [21 i32 37, label %sw.bb22 i32 38, label %sw.bb23 i32 39, label %sw.bb24 ]25 26sw.bb:27 ret i1 %b28sw.default:29 ret i1 %c30}31 32define i1 @test_switch_with_sext(i16 %a, i1 %b, i1 %c) {33; CHECK-LABEL: define i1 @test_switch_with_sext(34; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {35; CHECK-NEXT: entry:36; CHECK-NEXT: switch i16 [[A]], label [[SW_DEFAULT:%.*]] [37; CHECK-NEXT: i16 37, label [[SW_BB:%.*]]38; CHECK-NEXT: i16 38, label [[SW_BB]]39; CHECK-NEXT: i16 39, label [[SW_BB]]40; CHECK-NEXT: ]41; CHECK: sw.bb:42; CHECK-NEXT: ret i1 [[B]]43; CHECK: sw.default:44; CHECK-NEXT: ret i1 [[C]]45;46entry:47 %a.ext = sext i16 %a to i3248 switch i32 %a.ext, label %sw.default [49 i32 37, label %sw.bb50 i32 38, label %sw.bb51 i32 39, label %sw.bb52 ]53 54sw.bb:55 ret i1 %b56sw.default:57 ret i1 %c58}59 60; Negative tests61 62define i1 @test_switch_with_zext_unreachable_case(i16 %a, i1 %b, i1 %c) {63; CHECK-LABEL: define i1 @test_switch_with_zext_unreachable_case(64; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {65; CHECK-NEXT: entry:66; CHECK-NEXT: [[A_EXT:%.*]] = zext i16 [[A]] to i3267; CHECK-NEXT: switch i32 [[A_EXT]], label [[SW_DEFAULT:%.*]] [68; CHECK-NEXT: i32 37, label [[SW_BB:%.*]]69; CHECK-NEXT: i32 38, label [[SW_BB]]70; CHECK-NEXT: i32 39, label [[SW_BB]]71; CHECK-NEXT: i32 65537, label [[SW_BB]]72; CHECK-NEXT: ]73; CHECK: sw.bb:74; CHECK-NEXT: ret i1 [[B]]75; CHECK: sw.default:76; CHECK-NEXT: ret i1 [[C]]77;78entry:79 %a.ext = zext i16 %a to i3280 switch i32 %a.ext, label %sw.default [81 i32 37, label %sw.bb82 i32 38, label %sw.bb83 i32 39, label %sw.bb84 i32 65537, label %sw.bb85 ]86 87sw.bb:88 ret i1 %b89sw.default:90 ret i1 %c91}92 93define i1 @test_switch_with_sext_unreachable_case(i16 %a, i1 %b, i1 %c) {94; CHECK-LABEL: define i1 @test_switch_with_sext_unreachable_case(95; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {96; CHECK-NEXT: entry:97; CHECK-NEXT: [[A_EXT:%.*]] = sext i16 [[A]] to i3298; CHECK-NEXT: switch i32 [[A_EXT]], label [[SW_DEFAULT:%.*]] [99; CHECK-NEXT: i32 37, label [[SW_BB:%.*]]100; CHECK-NEXT: i32 38, label [[SW_BB]]101; CHECK-NEXT: i32 39, label [[SW_BB]]102; CHECK-NEXT: i32 -65537, label [[SW_BB]]103; CHECK-NEXT: ]104; CHECK: sw.bb:105; CHECK-NEXT: ret i1 [[B]]106; CHECK: sw.default:107; CHECK-NEXT: ret i1 [[C]]108;109entry:110 %a.ext = sext i16 %a to i32111 switch i32 %a.ext, label %sw.default [112 i32 37, label %sw.bb113 i32 38, label %sw.bb114 i32 39, label %sw.bb115 i32 -65537, label %sw.bb116 ]117 118sw.bb:119 ret i1 %b120sw.default:121 ret i1 %c122}123