brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.3 KiB · 81a148b Raw
278 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @use8(i8)5 6; Basic test7define i8 @t0(i8 %x) {8; CHECK-LABEL: @t0(9; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 7, [[X:%.*]]10; CHECK-NEXT:    [[MASK:%.*]] = lshr i8 -1, [[TMP1]]11; CHECK-NEXT:    ret i8 [[MASK]]12;13  %bitmask = shl i8 1, %x14  %lowbitmask = add i8 %bitmask, -115  %mask = or i8 %lowbitmask, %bitmask16  ret i8 %mask17}18 19; Same, but different bit width20define i16 @t1(i16 %x) {21; CHECK-LABEL: @t1(22; CHECK-NEXT:    [[TMP1:%.*]] = sub i16 15, [[X:%.*]]23; CHECK-NEXT:    [[MASK:%.*]] = lshr i16 -1, [[TMP1]]24; CHECK-NEXT:    ret i16 [[MASK]]25;26  %bitmask = shl i16 1, %x27  %lowbitmask = add i16 %bitmask, -128  %mask = or i16 %lowbitmask, %bitmask29  ret i16 %mask30}31 32; Vectors33define <2 x i8> @t2_vec(<2 x i8> %x) {34; CHECK-LABEL: @t2_vec(35; CHECK-NEXT:    [[TMP1:%.*]] = sub <2 x i8> splat (i8 7), [[X:%.*]]36; CHECK-NEXT:    [[MASK:%.*]] = lshr <2 x i8> splat (i8 -1), [[TMP1]]37; CHECK-NEXT:    ret <2 x i8> [[MASK]]38;39  %bitmask = shl <2 x i8> <i8 1, i8 1>, %x40  %lowbitmask = add <2 x i8> %bitmask, <i8 -1, i8 -1>41  %mask = or <2 x i8> %lowbitmask, %bitmask42  ret <2 x i8> %mask43}44define <3 x i8> @t3_vec_poison0(<3 x i8> %x) {45; CHECK-LABEL: @t3_vec_poison0(46; CHECK-NEXT:    [[TMP1:%.*]] = sub <3 x i8> splat (i8 7), [[X:%.*]]47; CHECK-NEXT:    [[MASK:%.*]] = lshr <3 x i8> splat (i8 -1), [[TMP1]]48; CHECK-NEXT:    ret <3 x i8> [[MASK]]49;50  %bitmask = shl <3 x i8> <i8 1, i8 poison, i8 1>, %x51  %lowbitmask = add <3 x i8> %bitmask, <i8 -1, i8 -1, i8 -1>52  %mask = or <3 x i8> %lowbitmask, %bitmask53  ret <3 x i8> %mask54}55define <3 x i8> @t4_vec_poison1(<3 x i8> %x) {56; CHECK-LABEL: @t4_vec_poison1(57; CHECK-NEXT:    [[TMP1:%.*]] = sub <3 x i8> splat (i8 7), [[X:%.*]]58; CHECK-NEXT:    [[MASK:%.*]] = lshr <3 x i8> splat (i8 -1), [[TMP1]]59; CHECK-NEXT:    ret <3 x i8> [[MASK]]60;61  %bitmask = shl <3 x i8> <i8 1, i8 1, i8 1>, %x62  %lowbitmask = add <3 x i8> %bitmask, <i8 -1, i8 poison, i8 -1>63  %mask = or <3 x i8> %lowbitmask, %bitmask64  ret <3 x i8> %mask65}66define <3 x i8> @t5_vec_poison2(<3 x i8> %x) {67; CHECK-LABEL: @t5_vec_poison2(68; CHECK-NEXT:    [[TMP1:%.*]] = sub <3 x i8> splat (i8 7), [[X:%.*]]69; CHECK-NEXT:    [[MASK:%.*]] = lshr <3 x i8> splat (i8 -1), [[TMP1]]70; CHECK-NEXT:    ret <3 x i8> [[MASK]]71;72  %bitmask = shl <3 x i8> <i8 1, i8 1, i8 poison>, %x73  %lowbitmask = add <3 x i8> %bitmask, <i8 -1, i8 poison, i8 -1>74  %mask = or <3 x i8> %lowbitmask, %bitmask75  ret <3 x i8> %mask76}77 78; One-use tests79define i8 @t6_extrause0(i8 %x) {80; CHECK-LABEL: @t6_extrause0(81; CHECK-NEXT:    [[BITMASK:%.*]] = shl nuw i8 1, [[X:%.*]]82; CHECK-NEXT:    call void @use8(i8 [[BITMASK]])83; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 7, [[X]]84; CHECK-NEXT:    [[MASK:%.*]] = lshr i8 -1, [[TMP1]]85; CHECK-NEXT:    ret i8 [[MASK]]86;87  %bitmask = shl i8 1, %x88  call void @use8(i8 %bitmask)89  %lowbitmask = add i8 %bitmask, -190  %mask = or i8 %lowbitmask, %bitmask91  ret i8 %mask92}93define i8 @t7_extrause1(i8 %x) {94; CHECK-LABEL: @t7_extrause1(95; CHECK-NEXT:    [[BITMASK:%.*]] = shl nuw i8 1, [[X:%.*]]96; CHECK-NEXT:    [[LOWBITMASK:%.*]] = add i8 [[BITMASK]], -197; CHECK-NEXT:    call void @use8(i8 [[LOWBITMASK]])98; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[LOWBITMASK]], [[BITMASK]]99; CHECK-NEXT:    ret i8 [[MASK]]100;101  %bitmask = shl i8 1, %x102  %lowbitmask = add i8 %bitmask, -1103  call void @use8(i8 %lowbitmask)104  %mask = or i8 %lowbitmask, %bitmask105  ret i8 %mask106}107define i8 @t8_extrause2(i8 %x) {108; CHECK-LABEL: @t8_extrause2(109; CHECK-NEXT:    [[BITMASK:%.*]] = shl nuw i8 1, [[X:%.*]]110; CHECK-NEXT:    call void @use8(i8 [[BITMASK]])111; CHECK-NEXT:    [[LOWBITMASK:%.*]] = add i8 [[BITMASK]], -1112; CHECK-NEXT:    call void @use8(i8 [[LOWBITMASK]])113; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[LOWBITMASK]], [[BITMASK]]114; CHECK-NEXT:    ret i8 [[MASK]]115;116  %bitmask = shl i8 1, %x117  call void @use8(i8 %bitmask)118  %lowbitmask = add i8 %bitmask, -1119  call void @use8(i8 %lowbitmask)120  %mask = or i8 %lowbitmask, %bitmask121  ret i8 %mask122}123 124; Non-CSE'd test125define i8 @t9_nocse(i8 %x) {126; CHECK-LABEL: @t9_nocse(127; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X:%.*]]128; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i8 -1, [[X]]129; CHECK-NEXT:    [[LOWBITMASK:%.*]] = xor i8 [[NOTMASK]], -1130; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[BITMASK1]], [[LOWBITMASK]]131; CHECK-NEXT:    ret i8 [[MASK]]132;133  %bitmask0 = shl i8 1, %x134  %bitmask1 = shl i8 1, %x135  %lowbitmask = add i8 %bitmask0, -1136  %mask = or i8 %lowbitmask, %bitmask1137  ret i8 %mask138}139 140; Non-CSE'd extra uses test141define i8 @t10_nocse_extrause0(i8 %x) {142; CHECK-LABEL: @t10_nocse_extrause0(143; CHECK-NEXT:    [[BITMASK0:%.*]] = shl nuw i8 1, [[X:%.*]]144; CHECK-NEXT:    call void @use8(i8 [[BITMASK0]])145; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 7, [[X]]146; CHECK-NEXT:    [[MASK:%.*]] = lshr i8 -1, [[TMP1]]147; CHECK-NEXT:    ret i8 [[MASK]]148;149  %bitmask0 = shl i8 1, %x150  call void @use8(i8 %bitmask0)151  %bitmask1 = shl i8 1, %x152  %lowbitmask = add i8 %bitmask0, -1153  %mask = or i8 %lowbitmask, %bitmask1154  ret i8 %mask155}156define i8 @t11_nocse_extrause1(i8 %x) {157; CHECK-LABEL: @t11_nocse_extrause1(158; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X:%.*]]159; CHECK-NEXT:    call void @use8(i8 [[BITMASK1]])160; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i8 -1, [[X]]161; CHECK-NEXT:    [[LOWBITMASK:%.*]] = xor i8 [[NOTMASK]], -1162; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[BITMASK1]], [[LOWBITMASK]]163; CHECK-NEXT:    ret i8 [[MASK]]164;165  %bitmask0 = shl i8 1, %x166  %bitmask1 = shl i8 1, %x167  call void @use8(i8 %bitmask1)168  %lowbitmask = add i8 %bitmask0, -1169  %mask = or i8 %lowbitmask, %bitmask1170  ret i8 %mask171}172define i8 @t12_nocse_extrause2(i8 %x) {173; CHECK-LABEL: @t12_nocse_extrause2(174; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X:%.*]]175; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i8 -1, [[X]]176; CHECK-NEXT:    [[LOWBITMASK:%.*]] = xor i8 [[NOTMASK]], -1177; CHECK-NEXT:    call void @use8(i8 [[LOWBITMASK]])178; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[BITMASK1]], [[LOWBITMASK]]179; CHECK-NEXT:    ret i8 [[MASK]]180;181  %bitmask0 = shl i8 1, %x182  %bitmask1 = shl i8 1, %x183  %lowbitmask = add i8 %bitmask0, -1184  call void @use8(i8 %lowbitmask)185  %mask = or i8 %lowbitmask, %bitmask1186  ret i8 %mask187}188define i8 @t13_nocse_extrause3(i8 %x) {189; CHECK-LABEL: @t13_nocse_extrause3(190; CHECK-NEXT:    [[BITMASK0:%.*]] = shl nuw i8 1, [[X:%.*]]191; CHECK-NEXT:    call void @use8(i8 [[BITMASK0]])192; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X]]193; CHECK-NEXT:    call void @use8(i8 [[BITMASK1]])194; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 7, [[X]]195; CHECK-NEXT:    [[MASK:%.*]] = lshr i8 -1, [[TMP1]]196; CHECK-NEXT:    ret i8 [[MASK]]197;198  %bitmask0 = shl i8 1, %x199  call void @use8(i8 %bitmask0)200  %bitmask1 = shl i8 1, %x201  call void @use8(i8 %bitmask1)202  %lowbitmask = add i8 %bitmask0, -1203  %mask = or i8 %lowbitmask, %bitmask1204  ret i8 %mask205}206define i8 @t14_nocse_extrause4(i8 %x) {207; CHECK-LABEL: @t14_nocse_extrause4(208; CHECK-NEXT:    [[BITMASK0:%.*]] = shl nuw i8 1, [[X:%.*]]209; CHECK-NEXT:    call void @use8(i8 [[BITMASK0]])210; CHECK-NEXT:    [[LOWBITMASK:%.*]] = add i8 [[BITMASK0]], -1211; CHECK-NEXT:    call void @use8(i8 [[LOWBITMASK]])212; CHECK-NEXT:    [[TMP1:%.*]] = sub i8 7, [[X]]213; CHECK-NEXT:    [[MASK:%.*]] = lshr i8 -1, [[TMP1]]214; CHECK-NEXT:    ret i8 [[MASK]]215;216  %bitmask0 = shl i8 1, %x217  call void @use8(i8 %bitmask0)218  %bitmask1 = shl i8 1, %x219  %lowbitmask = add i8 %bitmask0, -1220  call void @use8(i8 %lowbitmask)221  %mask = or i8 %lowbitmask, %bitmask1222  ret i8 %mask223}224define i8 @t15_nocse_extrause5(i8 %x) {225; CHECK-LABEL: @t15_nocse_extrause5(226; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X:%.*]]227; CHECK-NEXT:    call void @use8(i8 [[BITMASK1]])228; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i8 -1, [[X]]229; CHECK-NEXT:    [[LOWBITMASK:%.*]] = xor i8 [[NOTMASK]], -1230; CHECK-NEXT:    call void @use8(i8 [[LOWBITMASK]])231; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[BITMASK1]], [[LOWBITMASK]]232; CHECK-NEXT:    ret i8 [[MASK]]233;234  %bitmask0 = shl i8 1, %x235  %bitmask1 = shl i8 1, %x236  call void @use8(i8 %bitmask1)237  %lowbitmask = add i8 %bitmask0, -1238  call void @use8(i8 %lowbitmask)239  %mask = or i8 %lowbitmask, %bitmask1240  ret i8 %mask241}242define i8 @t16_nocse_extrause6(i8 %x) {243; CHECK-LABEL: @t16_nocse_extrause6(244; CHECK-NEXT:    [[BITMASK0:%.*]] = shl nuw i8 1, [[X:%.*]]245; CHECK-NEXT:    call void @use8(i8 [[BITMASK0]])246; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X]]247; CHECK-NEXT:    call void @use8(i8 [[BITMASK1]])248; CHECK-NEXT:    [[LOWBITMASK:%.*]] = add i8 [[BITMASK0]], -1249; CHECK-NEXT:    call void @use8(i8 [[LOWBITMASK]])250; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[LOWBITMASK]], [[BITMASK1]]251; CHECK-NEXT:    ret i8 [[MASK]]252;253  %bitmask0 = shl i8 1, %x254  call void @use8(i8 %bitmask0)255  %bitmask1 = shl i8 1, %x256  call void @use8(i8 %bitmask1)257  %lowbitmask = add i8 %bitmask0, -1258  call void @use8(i8 %lowbitmask)259  %mask = or i8 %lowbitmask, %bitmask1260  ret i8 %mask261}262 263; Non-CSE'd test with mismatching X's.264define i8 @t17_nocse_mismatching_x(i8 %x0, i8 %x1) {265; CHECK-LABEL: @t17_nocse_mismatching_x(266; CHECK-NEXT:    [[BITMASK1:%.*]] = shl nuw i8 1, [[X1:%.*]]267; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i8 -1, [[X0:%.*]]268; CHECK-NEXT:    [[LOWBITMASK:%.*]] = xor i8 [[NOTMASK]], -1269; CHECK-NEXT:    [[MASK:%.*]] = or i8 [[BITMASK1]], [[LOWBITMASK]]270; CHECK-NEXT:    ret i8 [[MASK]]271;272  %bitmask0 = shl i8 1, %x0273  %bitmask1 = shl i8 1, %x1274  %lowbitmask = add i8 %bitmask0, -1275  %mask = or i8 %lowbitmask, %bitmask1276  ret i8 %mask277}278