brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.3 KiB · e6e1ea6 Raw
301 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; https://bugs.llvm.org/show_bug.cgi?id=376035 6; Pattern:7;   (1 << NBits) - 18; Should be transformed into:9;   ~(-(1 << NBits))10; The `not` may end up being folded into `and`11 12; ============================================================================ ;13; Most basic positive tests14; ============================================================================ ;15 16; No no-wrap tags on shl17 18define i32 @shl_add(i32 %NBits) {19; CHECK-LABEL: @shl_add(20; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]21; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -122; CHECK-NEXT:    ret i32 [[RET]]23;24  %setbit = shl i32 1, %NBits25  %ret = add i32 %setbit, -126  ret i32 %ret27}28 29define i32 @shl_add_nsw(i32 %NBits) {30; CHECK-LABEL: @shl_add_nsw(31; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]32; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -133; CHECK-NEXT:    ret i32 [[RET]]34;35  %setbit = shl i32 1, %NBits36  %ret = add nsw i32 %setbit, -137  ret i32 %ret38}39 40define i32 @shl_add_nuw(i32 %NBits) {41; CHECK-LABEL: @shl_add_nuw(42; CHECK-NEXT:    ret i32 -143;44  %setbit = shl i32 1, %NBits45  %ret = add nuw i32 %setbit, -146  ret i32 %ret47}48 49define i32 @shl_add_nsw_nuw(i32 %NBits) {50; CHECK-LABEL: @shl_add_nsw_nuw(51; CHECK-NEXT:    ret i32 -152;53  %setbit = shl i32 1, %NBits54  %ret = add nuw nsw i32 %setbit, -155  ret i32 %ret56}57 58; shl is nsw59 60define i32 @shl_nsw_add(i32 %NBits) {61; CHECK-LABEL: @shl_nsw_add(62; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]63; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -164; CHECK-NEXT:    ret i32 [[RET]]65;66  %setbit = shl nsw i32 1, %NBits67  %ret = add i32 %setbit, -168  ret i32 %ret69}70 71define i32 @shl_nsw_add_nsw(i32 %NBits) {72; CHECK-LABEL: @shl_nsw_add_nsw(73; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]74; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -175; CHECK-NEXT:    ret i32 [[RET]]76;77  %setbit = shl nsw i32 1, %NBits78  %ret = add nsw i32 %setbit, -179  ret i32 %ret80}81 82define i32 @shl_nsw_add_nuw(i32 %NBits) {83; CHECK-LABEL: @shl_nsw_add_nuw(84; CHECK-NEXT:    ret i32 -185;86  %setbit = shl nsw i32 1, %NBits87  %ret = add nuw i32 %setbit, -188  ret i32 %ret89}90 91define i32 @shl_nsw_add_nsw_nuw(i32 %NBits) {92; CHECK-LABEL: @shl_nsw_add_nsw_nuw(93; CHECK-NEXT:    ret i32 -194;95  %setbit = shl nsw i32 1, %NBits96  %ret = add nuw nsw i32 %setbit, -197  ret i32 %ret98}99 100; shl is nuw101 102define i32 @shl_nuw_add(i32 %NBits) {103; CHECK-LABEL: @shl_nuw_add(104; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]105; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -1106; CHECK-NEXT:    ret i32 [[RET]]107;108  %setbit = shl nuw i32 1, %NBits109  %ret = add i32 %setbit, -1110  ret i32 %ret111}112 113define i32 @shl_nuw_add_nsw(i32 %NBits) {114; CHECK-LABEL: @shl_nuw_add_nsw(115; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]116; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -1117; CHECK-NEXT:    ret i32 [[RET]]118;119  %setbit = shl nuw i32 1, %NBits120  %ret = add nsw i32 %setbit, -1121  ret i32 %ret122}123 124define i32 @shl_nuw_add_nuw(i32 %NBits) {125; CHECK-LABEL: @shl_nuw_add_nuw(126; CHECK-NEXT:    ret i32 -1127;128  %setbit = shl nuw i32 1, %NBits129  %ret = add nuw i32 %setbit, -1130  ret i32 %ret131}132 133define i32 @shl_nuw_add_nsw_nuw(i32 %NBits) {134; CHECK-LABEL: @shl_nuw_add_nsw_nuw(135; CHECK-NEXT:    ret i32 -1136;137  %setbit = shl nuw i32 1, %NBits138  %ret = add nuw nsw i32 %setbit, -1139  ret i32 %ret140}141 142; shl is nuw nsw143 144define i32 @shl_nsw_nuw_add(i32 %NBits) {145; CHECK-LABEL: @shl_nsw_nuw_add(146; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]147; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -1148; CHECK-NEXT:    ret i32 [[RET]]149;150  %setbit = shl nuw nsw i32 1, %NBits151  %ret = add i32 %setbit, -1152  ret i32 %ret153}154 155define i32 @shl_nsw_nuw_add_nsw(i32 %NBits) {156; CHECK-LABEL: @shl_nsw_nuw_add_nsw(157; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw i32 -1, [[NBITS:%.*]]158; CHECK-NEXT:    [[RET:%.*]] = xor i32 [[NOTMASK]], -1159; CHECK-NEXT:    ret i32 [[RET]]160;161  %setbit = shl nuw nsw i32 1, %NBits162  %ret = add nsw i32 %setbit, -1163  ret i32 %ret164}165 166define i32 @shl_nsw_nuw_add_nuw(i32 %NBits) {167; CHECK-LABEL: @shl_nsw_nuw_add_nuw(168; CHECK-NEXT:    ret i32 -1169;170  %setbit = shl nuw nsw i32 1, %NBits171  %ret = add nuw i32 %setbit, -1172  ret i32 %ret173}174 175define i32 @shl_nsw_nuw_add_nsw_nuw(i32 %NBits) {176; CHECK-LABEL: @shl_nsw_nuw_add_nsw_nuw(177; CHECK-NEXT:    ret i32 -1178;179  %setbit = shl nuw nsw i32 1, %NBits180  %ret = add nuw nsw i32 %setbit, -1181  ret i32 %ret182}183 184; ============================================================================ ;185; Vectors186; ============================================================================ ;187 188define <2 x i32> @shl_add_vec(<2 x i32> %NBits) {189; CHECK-LABEL: @shl_add_vec(190; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw <2 x i32> splat (i32 -1), [[NBITS:%.*]]191; CHECK-NEXT:    [[RET:%.*]] = xor <2 x i32> [[NOTMASK]], splat (i32 -1)192; CHECK-NEXT:    ret <2 x i32> [[RET]]193;194  %setbit = shl <2 x i32> <i32 1, i32 1>, %NBits195  %ret = add <2 x i32> %setbit, <i32 -1, i32 -1>196  ret <2 x i32> %ret197}198 199define <3 x i32> @shl_add_vec_poison0(<3 x i32> %NBits) {200; CHECK-LABEL: @shl_add_vec_poison0(201; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw <3 x i32> splat (i32 -1), [[NBITS:%.*]]202; CHECK-NEXT:    [[RET:%.*]] = xor <3 x i32> [[NOTMASK]], splat (i32 -1)203; CHECK-NEXT:    ret <3 x i32> [[RET]]204;205  %setbit = shl <3 x i32> <i32 1, i32 poison, i32 1>, %NBits206  %ret = add <3 x i32> %setbit, <i32 -1, i32 -1, i32 -1>207  ret <3 x i32> %ret208}209 210define <3 x i32> @shl_add_vec_poison1(<3 x i32> %NBits) {211; CHECK-LABEL: @shl_add_vec_poison1(212; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw <3 x i32> splat (i32 -1), [[NBITS:%.*]]213; CHECK-NEXT:    [[RET:%.*]] = xor <3 x i32> [[NOTMASK]], splat (i32 -1)214; CHECK-NEXT:    ret <3 x i32> [[RET]]215;216  %setbit = shl <3 x i32> <i32 1, i32 1, i32 1>, %NBits217  %ret = add <3 x i32> %setbit, <i32 -1, i32 poison, i32 -1>218  ret <3 x i32> %ret219}220 221define <3 x i32> @shl_add_vec_poison2(<3 x i32> %NBits) {222; CHECK-LABEL: @shl_add_vec_poison2(223; CHECK-NEXT:    [[NOTMASK:%.*]] = shl nsw <3 x i32> splat (i32 -1), [[NBITS:%.*]]224; CHECK-NEXT:    [[RET:%.*]] = xor <3 x i32> [[NOTMASK]], splat (i32 -1)225; CHECK-NEXT:    ret <3 x i32> [[RET]]226;227  %setbit = shl <3 x i32> <i32 1, i32 poison, i32 1>, %NBits228  %ret = add <3 x i32> %setbit, <i32 -1, i32 poison, i32 -1>229  ret <3 x i32> %ret230}231 232; ============================================================================ ;233; Negative tests. Should not be folded.234; ============================================================================ ;235 236declare void @use32(i32)237 238; One use only.239define i32 @bad_oneuse0(i32 %NBits) {240; CHECK-LABEL: @bad_oneuse0(241; CHECK-NEXT:    [[SETBIT:%.*]] = shl nuw i32 1, [[NBITS:%.*]]242; CHECK-NEXT:    call void @use32(i32 [[SETBIT]])243; CHECK-NEXT:    [[RET:%.*]] = add i32 [[SETBIT]], -1244; CHECK-NEXT:    ret i32 [[RET]]245;246  %setbit = shl i32 1, %NBits247  call void @use32(i32 %setbit)248  %ret = add i32 %setbit, -1249  ret i32 %ret250}251 252; shift base is not `1` constant253 254define i32 @bad_shl(i32 %base, i32 %NBits) {255; CHECK-LABEL: @bad_shl(256; CHECK-NEXT:    [[SETBIT:%.*]] = shl i32 [[BASE:%.*]], [[NBITS:%.*]]257; CHECK-NEXT:    [[RET:%.*]] = add i32 [[SETBIT]], -1258; CHECK-NEXT:    ret i32 [[RET]]259;260  %setbit = shl i32 %base, %NBits ; %base instead of 1261  %ret = add i32 %setbit, -1262  ret i32 %ret263}264 265; Second `add` operand is not `-1` constant266 267define i32 @bad_add0(i32 %NBits, i32 %addop2) {268; CHECK-LABEL: @bad_add0(269; CHECK-NEXT:    [[SETBIT:%.*]] = shl nuw i32 1, [[NBITS:%.*]]270; CHECK-NEXT:    [[RET:%.*]] = add i32 [[SETBIT]], [[ADDOP2:%.*]]271; CHECK-NEXT:    ret i32 [[RET]]272;273  %setbit = shl i32 1, %NBits274  %ret = add i32 %setbit, %addop2275  ret i32 %ret276}277 278; Bad add constant279 280define i32 @bad_add1(i32 %NBits) {281; CHECK-LABEL: @bad_add1(282; CHECK-NEXT:    [[SETBIT:%.*]] = shl nuw i32 1, [[NBITS:%.*]]283; CHECK-NEXT:    [[RET:%.*]] = add nuw i32 [[SETBIT]], 1284; CHECK-NEXT:    ret i32 [[RET]]285;286  %setbit = shl i32 1, %NBits287  %ret = add i32 %setbit, 1 ; not -1288  ret i32 %ret289}290 291define i32 @bad_add2(i32 %NBits) {292; CHECK-LABEL: @bad_add2(293; CHECK-NEXT:    [[SETBIT:%.*]] = shl nuw i32 1, [[NBITS:%.*]]294; CHECK-NEXT:    [[RET:%.*]] = add i32 [[SETBIT]], -2295; CHECK-NEXT:    ret i32 [[RET]]296;297  %setbit = shl i32 1, %NBits298  %ret = add i32 %setbit, -2 ; not -1299  ret i32 %ret300}301