brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 5224d75 Raw
161 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=instcombine -S < %s | FileCheck %s3 4declare void @escape(i16 %add)5declare void @escape2(<2 x i16> %add)6 7define void @numsignbits_shl_zext(i8 %x) {8; CHECK-LABEL: define void @numsignbits_shl_zext(9; CHECK-SAME: i8 [[X:%.*]]) {10; CHECK-NEXT:    [[ASHR:%.*]] = ashr i8 [[X]], 511; CHECK-NEXT:    [[ZEXT:%.*]] = zext i8 [[ASHR]] to i1612; CHECK-NEXT:    [[NSB4:%.*]] = shl i16 [[ZEXT]], 1013; CHECK-NEXT:    [[ADD14:%.*]] = and i16 [[NSB4]], 1536014; CHECK-NEXT:    call void @escape(i16 [[ADD14]])15; CHECK-NEXT:    [[ADD13:%.*]] = and i16 [[NSB4]], 716816; CHECK-NEXT:    call void @escape(i16 [[ADD13]])17; CHECK-NEXT:    [[ADD12:%.*]] = and i16 [[NSB4]], 307218; CHECK-NEXT:    call void @escape(i16 [[ADD12]])19; CHECK-NEXT:    [[AND11:%.*]] = and i16 [[NSB4]], 204820; CHECK-NEXT:    [[ADD11:%.*]] = add nsw i16 [[AND11]], [[NSB4]]21; CHECK-NEXT:    call void @escape(i16 [[ADD11]])22; CHECK-NEXT:    ret void23;24  %ashr = ashr i8 %x, 525  %zext = zext i8 %ashr to i1626  %nsb4 = shl i16 %zext, 1027  ; Validate ComputeNumSignBits using this simplification:28  ;   (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit29  ; 4 sign bits: Goal is to fold away the add for bits 12-14.30  %and14 = and i16 %nsb4, 1638431  %add14 = add i16 %and14, %nsb432  call void @escape(i16 %add14)33  %and13 = and i16 %nsb4, 819234  %add13 = add i16 %and13, %nsb435  call void @escape(i16 %add13)36  %and12 = and i16 %nsb4, 409637  %add12 = add i16 %and12, %nsb438  call void @escape(i16 %add12)39  %and11 = and i16 %nsb4, 204840  %add11 = add i16 %and11, %nsb441  call void @escape(i16 %add11)42  ret void43}44 45define void @numsignbits_shl_zext_shift_amounr_matches_extend(i8 %x) {46; CHECK-LABEL: define void @numsignbits_shl_zext_shift_amounr_matches_extend(47; CHECK-SAME: i8 [[X:%.*]]) {48; CHECK-NEXT:    [[ASHR:%.*]] = ashr i8 [[X]], 249; CHECK-NEXT:    [[ZEXT:%.*]] = zext i8 [[ASHR]] to i1650; CHECK-NEXT:    [[NSB3:%.*]] = shl nuw i16 [[ZEXT]], 851; CHECK-NEXT:    [[ADD14:%.*]] = and i16 [[NSB3]], 1612852; CHECK-NEXT:    call void @escape(i16 [[ADD14]])53; CHECK-NEXT:    [[ADD13:%.*]] = and i16 [[NSB3]], 793654; CHECK-NEXT:    call void @escape(i16 [[ADD13]])55; CHECK-NEXT:    [[AND12:%.*]] = and i16 [[NSB3]], 409656; CHECK-NEXT:    [[ADD12:%.*]] = add nsw i16 [[AND12]], [[NSB3]]57; CHECK-NEXT:    call void @escape(i16 [[ADD12]])58; CHECK-NEXT:    ret void59;60  %ashr = ashr i8 %x, 261  %zext = zext i8 %ashr to i1662  %nsb3 = shl i16 %zext, 863  ; Validate ComputeNumSignBits using this simplification:64  ;   (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit65  ; 3 sign bits: Goal is to fold away the add for bits 13-14.66  %and14 = and i16 %nsb3, 1638467  %add14 = add i16 %and14, %nsb368  call void @escape(i16 %add14)69  %and13 = and i16 %nsb3, 819270  %add13 = add i16 %and13, %nsb371  call void @escape(i16 %add13)72  %and12 = and i16 %nsb3, 409673  %add12 = add i16 %and12, %nsb374  call void @escape(i16 %add12)75  ret void76}77 78define void @numsignbits_shl_zext_extended_bits_remains(i8 %x) {79; CHECK-LABEL: define void @numsignbits_shl_zext_extended_bits_remains(80; CHECK-SAME: i8 [[X:%.*]]) {81; CHECK-NEXT:    [[ASHR:%.*]] = ashr i8 [[X]], 582; CHECK-NEXT:    [[ZEXT:%.*]] = zext i8 [[ASHR]] to i1683; CHECK-NEXT:    [[NSB1:%.*]] = shl nuw nsw i16 [[ZEXT]], 784; CHECK-NEXT:    [[AND14:%.*]] = and i16 [[NSB1]], 1638485; CHECK-NEXT:    [[ADD14:%.*]] = add nuw i16 [[AND14]], [[NSB1]]86; CHECK-NEXT:    call void @escape(i16 [[ADD14]])87; CHECK-NEXT:    ret void88;89  %ashr = ashr i8 %x, 590  %zext = zext i8 %ashr to i1691  %nsb1 = shl i16 %zext, 792  ; Validate ComputeNumSignBits using this simplification:93  ;   (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit94  ; 1 sign bit: The add can't be folded away here.95  %and14 = and i16 %nsb1, 1638496  %add14 = add i16 %and14, %nsb197  call void @escape(i16 %add14)98  ret void99}100 101define void @numsignbits_shl_zext_all_bits_shifted_out(i8 %x) {102; CHECK-LABEL: define void @numsignbits_shl_zext_all_bits_shifted_out(103; CHECK-SAME: i8 [[X:%.*]]) {104; CHECK-NEXT:    [[ASHR:%.*]] = lshr i8 [[X]], 5105; CHECK-NEXT:    [[ZEXT:%.*]] = zext nneg i8 [[ASHR]] to i16106; CHECK-NEXT:    [[NSB1:%.*]] = shl i16 [[ZEXT]], 14107; CHECK-NEXT:    [[AND14:%.*]] = and i16 [[NSB1]], 16384108; CHECK-NEXT:    [[ADD14:%.*]] = add i16 [[AND14]], [[NSB1]]109; CHECK-NEXT:    call void @escape(i16 [[ADD14]])110; CHECK-NEXT:    ret void111;112  %ashr = ashr i8 %x, 5113  %zext = zext i8 %ashr to i16114  %nsb1 = shl i16 %zext, 14115  ; Validate ComputeNumSignBits using this simplification:116  ;   (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit117  ; 1 sign bit: The add can't be folded away here.118  %and14 = and i16 %nsb1, 16384119  %add14 = add i16 %and14, %nsb1120  call void @escape(i16 %add14)121  ret void122}123 124define void @numsignbits_shl_zext_vector(<2 x i8> %x) {125; CHECK-LABEL: define void @numsignbits_shl_zext_vector(126; CHECK-SAME: <2 x i8> [[X:%.*]]) {127; CHECK-NEXT:    [[ASHR:%.*]] = ashr <2 x i8> [[X]], splat (i8 5)128; CHECK-NEXT:    [[ZEXT:%.*]] = zext <2 x i8> [[ASHR]] to <2 x i16>129; CHECK-NEXT:    [[NSB4:%.*]] = shl <2 x i16> [[ZEXT]], splat (i16 10)130; CHECK-NEXT:    [[ADD14:%.*]] = and <2 x i16> [[NSB4]], splat (i16 15360)131; CHECK-NEXT:    call void @escape2(<2 x i16> [[ADD14]])132; CHECK-NEXT:    [[ADD13:%.*]] = and <2 x i16> [[NSB4]], splat (i16 7168)133; CHECK-NEXT:    call void @escape2(<2 x i16> [[ADD13]])134; CHECK-NEXT:    [[ADD12:%.*]] = and <2 x i16> [[NSB4]], splat (i16 3072)135; CHECK-NEXT:    call void @escape2(<2 x i16> [[ADD12]])136; CHECK-NEXT:    [[AND11:%.*]] = and <2 x i16> [[NSB4]], splat (i16 2048)137; CHECK-NEXT:    [[ADD11:%.*]] = add nsw <2 x i16> [[AND11]], [[NSB4]]138; CHECK-NEXT:    call void @escape2(<2 x i16> [[ADD11]])139; CHECK-NEXT:    ret void140;141  %ashr = ashr <2 x i8> %x, <i8 5, i8 5>142  %zext = zext <2 x i8> %ashr to <2 x i16>143  %nsb4 = shl <2 x i16> %zext, <i16 10, i16 10>144  ; Validate ComputeNumSignBits using this simplification:145  ;   (A & 2^C1) + A => A & (2^C1 - 1) iff bit C1 in A is a sign bit146  ; 4 sign bits: Goal is to fold away the add for bits 12-14.147  %and14 = and <2 x i16> %nsb4, <i16 16384, i16 16384>148  %add14 = add <2 x i16> %and14, %nsb4149  call void @escape2(<2 x i16> %add14)150  %and13 = and <2 x i16> %nsb4, <i16 8192, i16 8192>151  %add13 = add <2 x i16> %and13, %nsb4152  call void @escape2(<2 x i16> %add13)153  %and12 = and <2 x i16> %nsb4, <i16 4096, i16 4096>154  %add12 = add <2 x i16> %and12, %nsb4155  call void @escape2(<2 x i16> %add12)156  %and11 = and <2 x i16> %nsb4, <i16 2048, i16 2048>157  %add11 = add <2 x i16> %and11, %nsb4158  call void @escape2(<2 x i16> %add11)159  ret void160}161