brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · 819e8fb Raw
417 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -use-constant-int-for-fixed-length-splat=false -S | FileCheck %s --check-prefixes=CHECK,CHECK-CV3; RUN: opt < %s -passes=instcombine -use-constant-int-for-fixed-length-splat -S | FileCheck %s --check-prefixes=CHECK,CHECK-CI4 5define i32 @sdiv1(i32 %x) {6; CHECK-LABEL: @sdiv1(7; CHECK-NEXT:    [[Y:%.*]] = sdiv i32 [[X:%.*]], 88; CHECK-NEXT:    ret i32 [[Y]]9;10  %y = sdiv i32 %x, 811  ret i32 %y12}13 14define i32 @sdiv2(i32 %x) {15; CHECK-LABEL: @sdiv2(16; CHECK-NEXT:    [[Y:%.*]] = ashr exact i32 [[X:%.*]], 317; CHECK-NEXT:    ret i32 [[Y]]18;19  %y = sdiv exact i32 %x, 820  ret i32 %y21}22 23define <2 x i32> @sdiv2_vec(<2 x i32> %x) {24; CHECK-LABEL: @sdiv2_vec(25; CHECK-NEXT:    [[Y:%.*]] = ashr exact <2 x i32> [[X:%.*]], splat (i32 7)26; CHECK-NEXT:    ret <2 x i32> [[Y]]27;28  %y = sdiv exact <2 x i32> %x, <i32 128, i32 128>29  ret <2 x i32> %y30}31 32define i32 @sdiv3(i32 %x) {33; CHECK-LABEL: @sdiv3(34; CHECK-NEXT:    [[X_FR:%.*]] = freeze i32 [[X:%.*]]35; CHECK-NEXT:    [[TMP1:%.*]] = srem i32 [[X_FR]], 336; CHECK-NEXT:    [[Z:%.*]] = sub nsw i32 [[X_FR]], [[TMP1]]37; CHECK-NEXT:    ret i32 [[Z]]38;39  %y = sdiv i32 %x, 340  %z = mul i32 %y, 341  ret i32 %z42}43 44define i32 @sdiv4(i32 %x) {45; CHECK-LABEL: @sdiv4(46; CHECK-NEXT:    ret i32 [[X:%.*]]47;48  %y = sdiv exact i32 %x, 349  %z = mul i32 %y, 350  ret i32 %z51}52 53define i32 @sdiv5(i32 %x) {54; CHECK-LABEL: @sdiv5(55; CHECK-NEXT:    [[X_FR:%.*]] = freeze i32 [[X:%.*]]56; CHECK-NEXT:    [[TMP1:%.*]] = srem i32 [[X_FR]], 357; CHECK-NEXT:    [[Z:%.*]] = sub i32 [[TMP1]], [[X_FR]]58; CHECK-NEXT:    ret i32 [[Z]]59;60  %y = sdiv i32 %x, 361  %z = mul i32 %y, -362  ret i32 %z63}64 65define i32 @sdiv6(i32 %x) {66; CHECK-LABEL: @sdiv6(67; CHECK-NEXT:    [[Z:%.*]] = sub i32 0, [[X:%.*]]68; CHECK-NEXT:    ret i32 [[Z]]69;70  %y = sdiv exact i32 %x, 371  %z = mul i32 %y, -372  ret i32 %z73}74 75define i32 @udiv1(i32 %x, i32 %w) {76; CHECK-LABEL: @udiv1(77; CHECK-NEXT:    ret i32 [[X:%.*]]78;79  %y = udiv exact i32 %x, %w80  %z = mul i32 %y, %w81  ret i32 %z82}83 84define i32 @udiv2(i32 %x, i32 %w) {85; CHECK-LABEL: @udiv2(86; CHECK-NEXT:    [[Z1:%.*]] = lshr exact i32 [[X:%.*]], [[W:%.*]]87; CHECK-NEXT:    ret i32 [[Z1]]88;89  %y = shl i32 1, %w90  %z = udiv exact i32 %x, %y91  ret i32 %z92}93 94define i64 @ashr1(i64 %X) {95; CHECK-LABEL: @ashr1(96; CHECK-NEXT:    [[A:%.*]] = shl i64 [[X:%.*]], 897; CHECK-NEXT:    [[B:%.*]] = ashr exact i64 [[A]], 298; CHECK-NEXT:    ret i64 [[B]]99;100  %A = shl i64 %X, 8101  %B = ashr i64 %A, 2102  ret i64 %B103}104 105; The vector ashr should be exact (like it is in the preceding test).106 107define <2 x i64> @ashr1_vec(<2 x i64> %X) {108; CHECK-LABEL: @ashr1_vec(109; CHECK-NEXT:    [[A:%.*]] = shl <2 x i64> [[X:%.*]], splat (i64 8)110; CHECK-NEXT:    [[B:%.*]] = ashr exact <2 x i64> [[A]], splat (i64 2)111; CHECK-NEXT:    ret <2 x i64> [[B]]112;113  %A = shl <2 x i64> %X, <i64 8, i64 8>114  %B = ashr <2 x i64> %A, <i64 2, i64 2>115  ret <2 x i64> %B116}117 118; PR9120119define i1 @ashr_icmp1(i64 %X) {120; CHECK-LABEL: @ashr_icmp1(121; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], 0122; CHECK-NEXT:    ret i1 [[B]]123;124  %A = ashr exact i64 %X, 2  ; X/4125  %B = icmp eq i64 %A, 0126  ret i1 %B127}128 129define i1 @ashr_icmp2(i64 %X) {130; CHECK-LABEL: @ashr_icmp2(131; CHECK-NEXT:    [[Z:%.*]] = icmp slt i64 [[X:%.*]], 16132; CHECK-NEXT:    ret i1 [[Z]]133;134  %Y = ashr exact i64 %X, 2  ; x / 4135  %Z = icmp slt i64 %Y, 4  ; x < 16136  ret i1 %Z137}138 139define <2 x i1> @ashr_icmp2_vec(<2 x i64> %X) {140; CHECK-LABEL: @ashr_icmp2_vec(141; CHECK-NEXT:    [[Z:%.*]] = icmp slt <2 x i64> [[X:%.*]], splat (i64 16)142; CHECK-NEXT:    ret <2 x i1> [[Z]]143;144  %Y = ashr exact <2 x i64> %X, <i64 2, i64 2>145  %Z = icmp slt <2 x i64> %Y, <i64 4, i64 4>146  ret <2 x i1> %Z147}148 149; PR9998150; Make sure we don't transform the ashr here into an sdiv151define i1 @pr9998(i32 %V) {152; CHECK-LABEL: @pr9998(153; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[V:%.*]], 1154; CHECK-NEXT:    [[Z:%.*]] = icmp ne i32 [[TMP1]], 0155; CHECK-NEXT:    ret i1 [[Z]]156;157  %W = shl i32 %V, 31158  %X = ashr exact i32 %W, 31159  %Y = sext i32 %X to i64160  %Z = icmp ugt i64 %Y, 7297771788697658747161  ret i1 %Z162}163 164; FIXME: Vectors should fold the same way.165define <2 x i1> @pr9998vec(<2 x i32> %V) {166; CHECK-CV-LABEL: @pr9998vec(167; CHECK-CV-NEXT:    [[TMP1:%.*]] = and <2 x i32> [[V:%.*]], splat (i32 1)168; CHECK-CV-NEXT:    [[X:%.*]] = sub nsw <2 x i32> zeroinitializer, [[TMP1]]169; CHECK-CV-NEXT:    [[Y:%.*]] = sext <2 x i32> [[X]] to <2 x i64>170; CHECK-CV-NEXT:    [[Z:%.*]] = icmp ugt <2 x i64> [[Y]], splat (i64 7297771788697658747)171; CHECK-CV-NEXT:    ret <2 x i1> [[Z]]172;173; CHECK-CI-LABEL: @pr9998vec(174; CHECK-CI-NEXT:    [[Z:%.*]] = trunc <2 x i32> [[V:%.*]] to <2 x i1>175; CHECK-CI-NEXT:    ret <2 x i1> [[Z]]176;177  %W = shl <2 x i32> %V, <i32 31, i32 31>178  %X = ashr exact <2 x i32> %W, <i32 31, i32 31>179  %Y = sext <2 x i32> %X to <2 x i64>180  %Z = icmp ugt <2 x i64> %Y, <i64 7297771788697658747, i64 7297771788697658747>181  ret <2 x i1> %Z182}183 184define i1 @udiv_icmp1(i64 %X) {185; CHECK-LABEL: @udiv_icmp1(186; CHECK-NEXT:    [[B:%.*]] = icmp ne i64 [[X:%.*]], 0187; CHECK-NEXT:    ret i1 [[B]]188;189  %A = udiv exact i64 %X, 5  ; X/5190  %B = icmp ne i64 %A, 0191  ret i1 %B192}193 194define <2 x i1> @udiv_icmp1_vec(<2 x i64> %X) {195; CHECK-LABEL: @udiv_icmp1_vec(196; CHECK-NEXT:    [[B:%.*]] = icmp ne <2 x i64> [[X:%.*]], zeroinitializer197; CHECK-NEXT:    ret <2 x i1> [[B]]198;199  %A = udiv exact <2 x i64> %X, <i64 5, i64 5>200  %B = icmp ne <2 x i64> %A, zeroinitializer201  ret <2 x i1> %B202}203 204define i1 @udiv_icmp2(i64 %X) {205; CHECK-LABEL: @udiv_icmp2(206; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], 0207; CHECK-NEXT:    ret i1 [[B]]208;209  %A = udiv exact i64 %X, 5  ; X/5 == 0 --> x == 0210  %B = icmp eq i64 %A, 0211  ret i1 %B212}213 214define <2 x i1> @udiv_icmp2_vec(<2 x i64> %X) {215; CHECK-LABEL: @udiv_icmp2_vec(216; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], zeroinitializer217; CHECK-NEXT:    ret <2 x i1> [[B]]218;219  %A = udiv exact <2 x i64> %X, <i64 5, i64 5>220  %B = icmp eq <2 x i64> %A, zeroinitializer221  ret <2 x i1> %B222}223 224define i1 @sdiv_icmp1(i64 %X) {225; CHECK-LABEL: @sdiv_icmp1(226; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], 0227; CHECK-NEXT:    ret i1 [[B]]228;229  %A = sdiv exact i64 %X, 5  ; X/5 == 0 --> x == 0230  %B = icmp eq i64 %A, 0231  ret i1 %B232}233 234define <2 x i1> @sdiv_icmp1_vec(<2 x i64> %X) {235; CHECK-LABEL: @sdiv_icmp1_vec(236; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], zeroinitializer237; CHECK-NEXT:    ret <2 x i1> [[B]]238;239  %A = sdiv exact <2 x i64> %X, <i64 5, i64 5>240  %B = icmp eq <2 x i64> %A, zeroinitializer241  ret <2 x i1> %B242}243 244define i1 @sdiv_icmp2(i64 %X) {245; CHECK-LABEL: @sdiv_icmp2(246; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], 5247; CHECK-NEXT:    ret i1 [[B]]248;249  %A = sdiv exact i64 %X, 5  ; X/5 == 1 --> x == 5250  %B = icmp eq i64 %A, 1251  ret i1 %B252}253 254define <2 x i1> @sdiv_icmp2_vec(<2 x i64> %X) {255; CHECK-LABEL: @sdiv_icmp2_vec(256; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 5)257; CHECK-NEXT:    ret <2 x i1> [[B]]258;259  %A = sdiv exact <2 x i64> %X, <i64 5, i64 5>260  %B = icmp eq <2 x i64> %A, <i64 1, i64 1>261  ret <2 x i1> %B262}263 264define i1 @sdiv_icmp3(i64 %X) {265; CHECK-LABEL: @sdiv_icmp3(266; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], -5267; CHECK-NEXT:    ret i1 [[B]]268;269  %A = sdiv exact i64 %X, 5  ; X/5 == -1 --> x == -5270  %B = icmp eq i64 %A, -1271  ret i1 %B272}273 274define <2 x i1> @sdiv_icmp3_vec(<2 x i64> %X) {275; CHECK-LABEL: @sdiv_icmp3_vec(276; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 -5)277; CHECK-NEXT:    ret <2 x i1> [[B]]278;279  %A = sdiv exact <2 x i64> %X, <i64 5, i64 5>280  %B = icmp eq <2 x i64> %A, <i64 -1, i64 -1>281  ret <2 x i1> %B282}283 284define i1 @sdiv_icmp4(i64 %X) {285; CHECK-LABEL: @sdiv_icmp4(286; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], 0287; CHECK-NEXT:    ret i1 [[B]]288;289  %A = sdiv exact i64 %X, -5  ; X/-5 == 0 --> x == 0290  %B = icmp eq i64 %A, 0291  ret i1 %B292}293 294define <2 x i1> @sdiv_icmp4_vec(<2 x i64> %X) {295; CHECK-LABEL: @sdiv_icmp4_vec(296; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], zeroinitializer297; CHECK-NEXT:    ret <2 x i1> [[B]]298;299  %A = sdiv exact <2 x i64> %X, <i64 -5, i64 -5>300  %B = icmp eq <2 x i64> %A, zeroinitializer301  ret <2 x i1> %B302}303 304define i1 @sdiv_icmp5(i64 %X) {305; CHECK-LABEL: @sdiv_icmp5(306; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], -5307; CHECK-NEXT:    ret i1 [[B]]308;309  %A = sdiv exact i64 %X, -5  ; X/-5 == 1 --> x == -5310  %B = icmp eq i64 %A, 1311  ret i1 %B312}313 314define <2 x i1> @sdiv_icmp5_vec(<2 x i64> %X) {315; CHECK-LABEL: @sdiv_icmp5_vec(316; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 -5)317; CHECK-NEXT:    ret <2 x i1> [[B]]318;319  %A = sdiv exact <2 x i64> %X, <i64 -5, i64 -5>320  %B = icmp eq <2 x i64> %A, <i64 1, i64 1>321  ret <2 x i1> %B322}323 324define i1 @sdiv_icmp6(i64 %X) {325; CHECK-LABEL: @sdiv_icmp6(326; CHECK-NEXT:    [[B:%.*]] = icmp eq i64 [[X:%.*]], 5327; CHECK-NEXT:    ret i1 [[B]]328;329  %A = sdiv exact i64 %X, -5  ; X/-5 == -1 --> x == 5330  %B = icmp eq i64 %A, -1331  ret i1 %B332}333 334define <2 x i1> @sdiv_icmp6_vec(<2 x i64> %X) {335; CHECK-LABEL: @sdiv_icmp6_vec(336; CHECK-NEXT:    [[B:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 5)337; CHECK-NEXT:    ret <2 x i1> [[B]]338;339  %A = sdiv exact <2 x i64> %X, <i64 -5, i64 -5>340  %B = icmp eq <2 x i64> %A, <i64 -1, i64 -1>341  ret <2 x i1> %B342}343 344define i8 @mul_of_udiv(i8 %x) {345; CHECK-LABEL: @mul_of_udiv(346; CHECK-NEXT:    [[MUL1:%.*]] = lshr exact i8 [[X:%.*]], 1347; CHECK-NEXT:    ret i8 [[MUL1]]348;349  %div = udiv exact i8 %x, 12350  %mul = mul i8 %div, 6351  ret i8 %mul352}353 354define i8 @mul_of_sdiv(i8 %x) {355; CHECK-LABEL: @mul_of_sdiv(356; CHECK-NEXT:    [[MUL_NEG:%.*]] = ashr exact i8 [[X:%.*]], 1357; CHECK-NEXT:    [[MUL:%.*]] = sub nsw i8 0, [[MUL_NEG]]358; CHECK-NEXT:    ret i8 [[MUL]]359;360  %div = sdiv exact i8 %x, 12361  %mul = mul i8 %div, -6362  ret i8 %mul363}364 365define <2 x i8> @mul_of_sdiv_non_splat(<2 x i8> %x) {366; CHECK-LABEL: @mul_of_sdiv_non_splat(367; CHECK-NEXT:    [[MUL:%.*]] = sdiv exact <2 x i8> [[X:%.*]], <i8 1, i8 -2>368; CHECK-NEXT:    ret <2 x i8> [[MUL]]369;370  %div = sdiv exact <2 x i8> %x, <i8 6, i8 -12>371  %mul = mul <2 x i8> %div, <i8 6, i8 6>372  ret <2 x i8> %mul373}374 375define i8 @mul_of_sdiv_fail_missing_exact(i8 %x) {376; CHECK-LABEL: @mul_of_sdiv_fail_missing_exact(377; CHECK-NEXT:    [[DIV:%.*]] = sdiv i8 [[X:%.*]], 12378; CHECK-NEXT:    [[MUL:%.*]] = mul i8 [[DIV]], -6379; CHECK-NEXT:    ret i8 [[MUL]]380;381  %div = sdiv i8 %x, 12382  %mul = mul i8 %div, -6383  ret i8 %mul384}385 386define i8 @mul_of_udiv_fail_bad_remainder(i8 %x) {387; CHECK-LABEL: @mul_of_udiv_fail_bad_remainder(388; CHECK-NEXT:    [[DIV:%.*]] = udiv exact i8 [[X:%.*]], 11389; CHECK-NEXT:    [[MUL:%.*]] = mul nuw i8 [[DIV]], 6390; CHECK-NEXT:    ret i8 [[MUL]]391;392  %div = udiv exact i8 %x, 11393  %mul = mul i8 %div, 6394  ret i8 %mul395}396 397define i8 @mul_of_sdiv_fail_ub(i8 %x) {398; CHECK-LABEL: @mul_of_sdiv_fail_ub(399; CHECK-NEXT:    [[MUL:%.*]] = sub i8 0, [[X:%.*]]400; CHECK-NEXT:    ret i8 [[MUL]]401;402  %div = sdiv exact i8 %x, 6403  %mul = mul i8 %div, -6404  ret i8 %mul405}406 407define <2 x i8> @mul_of_sdiv_fail_ub_non_splat(<2 x i8> %x) {408; CHECK-LABEL: @mul_of_sdiv_fail_ub_non_splat(409; CHECK-NEXT:    [[DIV:%.*]] = sdiv exact <2 x i8> [[X:%.*]], <i8 -6, i8 -12>410; CHECK-NEXT:    [[MUL:%.*]] = mul <2 x i8> [[DIV]], splat (i8 6)411; CHECK-NEXT:    ret <2 x i8> [[MUL]]412;413  %div = sdiv exact <2 x i8> %x, <i8 -6, i8 -12>414  %mul = mul <2 x i8> %div, <i8 6, i8 6>415  ret <2 x i8> %mul416}417