brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.7 KiB · 993325f Raw
412 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare void @llvm.assume(i1)5declare void @barrier()6declare void @use.v2i8(<2 x i8>)7declare void @use.i8(i8)8 9define i1 @or_ugt(i8 %x, i8 %y) {10; CHECK-LABEL: @or_ugt(11; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]12; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[XN1]], [[X]]13; CHECK-NEXT:    ret i1 [[R]]14;15  %xn1 = or i8 %x, %y16  %r = icmp ugt i8 %xn1, %x17  ret i1 %r18}19 20define <2 x i1> @or_ule(<2 x i8> %x, <2 x i8> %y) {21; CHECK-LABEL: @or_ule(22; CHECK-NEXT:    [[XN1:%.*]] = or <2 x i8> [[X:%.*]], [[Y:%.*]]23; CHECK-NEXT:    [[R:%.*]] = icmp eq <2 x i8> [[XN1]], [[X]]24; CHECK-NEXT:    ret <2 x i1> [[R]]25;26  %xn1 = or <2 x i8> %x, %y27  %r = icmp ule <2 x i8> %xn1, %x28  ret <2 x i1> %r29}30 31define <2 x i1> @or_slt_pos(<2 x i8> %xx, <2 x i8> %yy, <2 x i8> %z) {32; CHECK-LABEL: @or_slt_pos(33; CHECK-NEXT:    [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]]34; CHECK-NEXT:    [[Y:%.*]] = and <2 x i8> [[YY:%.*]], splat (i8 127)35; CHECK-NEXT:    [[XN1:%.*]] = or <2 x i8> [[X]], [[Y]]36; CHECK-NEXT:    [[R:%.*]] = icmp slt <2 x i8> [[X]], [[XN1]]37; CHECK-NEXT:    ret <2 x i1> [[R]]38;39  %x = add <2 x i8> %xx, %z40  %y = and <2 x i8> %yy, <i8 127, i8 127>41  %xn1 = or <2 x i8> %x, %y42  %r = icmp slt <2 x i8> %x, %xn143  ret <2 x i1> %r44}45 46define i1 @or_sle_pos(i8 %x, i8 %y) {47; CHECK-LABEL: @or_sle_pos(48; CHECK-NEXT:    [[NS:%.*]] = icmp sgt i8 [[Y:%.*]], -149; CHECK-NEXT:    call void @llvm.assume(i1 [[NS]])50; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], [[Y]]51; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[XN1]], [[X]]52; CHECK-NEXT:    ret i1 [[R]]53;54  %ns = icmp sge i8 %y, 055  call void @llvm.assume(i1 %ns)56  %xn1 = or i8 %x, %y57  %r = icmp sle i8 %xn1, %x58  ret i1 %r59}60 61define i1 @or_sle_fail_maybe_neg(i8 %x, i8 %y) {62; CHECK-LABEL: @or_sle_fail_maybe_neg(63; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]64; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[XN1]], [[X]]65; CHECK-NEXT:    ret i1 [[R]]66;67  %xn1 = or i8 %x, %y68  %r = icmp sle i8 %xn1, %x69  ret i1 %r70}71 72define i1 @or_eq_noundef(i8 %x, i8 noundef %y) {73; CHECK-LABEL: @or_eq_noundef(74; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]75; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[XN1]], [[X]]76; CHECK-NEXT:    ret i1 [[R]]77;78  %xn1 = or i8 %x, %y79  %r = icmp eq i8 %xn1, %x80  ret i1 %r81}82 83define i1 @or_eq_notY_eq_0(i8 %x, i8 %y) {84; CHECK-LABEL: @or_eq_notY_eq_0(85; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], [[Y:%.*]]86; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[TMP1]], 087; CHECK-NEXT:    ret i1 [[CMP]]88;89  %ny = xor i8 %y, -190  %or = or i8 %x, %ny91  %cmp = icmp eq i8 %or, %ny92  ret i1 %cmp93}94 95define i1 @or_eq_notY_eq_0_fail_multiuse(i8 %x, i8 %y) {96; CHECK-LABEL: @or_eq_notY_eq_0_fail_multiuse(97; CHECK-NEXT:    [[NY:%.*]] = xor i8 [[Y:%.*]], -198; CHECK-NEXT:    [[OR:%.*]] = or i8 [[X:%.*]], [[NY]]99; CHECK-NEXT:    call void @use.i8(i8 [[OR]])100; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[OR]], [[NY]]101; CHECK-NEXT:    ret i1 [[CMP]]102;103  %ny = xor i8 %y, -1104  %or = or i8 %x, %ny105  call void @use.i8(i8 %or)106  %cmp = icmp eq i8 %or, %ny107  ret i1 %cmp108}109 110define i1 @or_ne_notY_eq_1s(i8 %x, i8 %y) {111; CHECK-LABEL: @or_ne_notY_eq_1s(112; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]113; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[TMP1]], -1114; CHECK-NEXT:    ret i1 [[CMP]]115;116  %ny = xor i8 %y, -1117  %or = or i8 %x, %ny118  %cmp = icmp ne i8 %or, %x119  ret i1 %cmp120}121 122define i1 @or_ne_notY_eq_1s_fail_bad_not(i8 %x, i8 %y) {123; CHECK-LABEL: @or_ne_notY_eq_1s_fail_bad_not(124; CHECK-NEXT:    [[TMP1:%.*]] = xor i8 [[Y:%.*]], 1125; CHECK-NEXT:    [[TMP2:%.*]] = or i8 [[X:%.*]], [[TMP1]]126; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8 [[TMP2]], -1127; CHECK-NEXT:    ret i1 [[CMP]]128;129  %ny = xor i8 %y, -2130  %or = or i8 %x, %ny131  %cmp = icmp ne i8 %or, %x132  ret i1 %cmp133}134 135define <2 x i1> @or_ne_vecC(<2 x i8> %x) {136; CHECK-LABEL: @or_ne_vecC(137; CHECK-NEXT:    [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], <i8 -10, i8 -43>138; CHECK-NEXT:    [[CMP:%.*]] = icmp ne <2 x i8> [[TMP1]], zeroinitializer139; CHECK-NEXT:    ret <2 x i1> [[CMP]]140;141  %or = or <2 x i8> %x, <i8 9, i8 42>142  %cmp = icmp ne <2 x i8> %or, <i8 9, i8 42>143  ret <2 x i1> %cmp144}145 146define i1 @or_eq_fail_maybe_undef(i8 %x, i8 %y) {147; CHECK-LABEL: @or_eq_fail_maybe_undef(148; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]]149; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[XN1]], [[X]]150; CHECK-NEXT:    ret i1 [[R]]151;152  %xn1 = or i8 %x, %y153  %r = icmp eq i8 %xn1, %x154  ret i1 %r155}156 157define <2 x i1> @or_ne_noundef(<2 x i8> %x, <2 x i8> noundef %y) {158; CHECK-LABEL: @or_ne_noundef(159; CHECK-NEXT:    [[XN1:%.*]] = or <2 x i8> [[X:%.*]], [[Y:%.*]]160; CHECK-NEXT:    [[R:%.*]] = icmp ne <2 x i8> [[XN1]], [[X]]161; CHECK-NEXT:    ret <2 x i1> [[R]]162;163  %xn1 = or <2 x i8> %x, %y164  %r = icmp ne <2 x i8> %xn1, %x165  ret <2 x i1> %r166}167 168define <2 x i1> @or_ne_noundef_fail_reuse(<2 x i8> %x, <2 x i8> noundef %y) {169; CHECK-LABEL: @or_ne_noundef_fail_reuse(170; CHECK-NEXT:    [[XN1:%.*]] = or <2 x i8> [[X:%.*]], [[Y:%.*]]171; CHECK-NEXT:    [[R:%.*]] = icmp ne <2 x i8> [[XN1]], [[X]]172; CHECK-NEXT:    call void @use.v2i8(<2 x i8> [[XN1]])173; CHECK-NEXT:    ret <2 x i1> [[R]]174;175  %xn1 = or <2 x i8> %x, %y176  %r = icmp ne <2 x i8> %xn1, %x177  call void @use.v2i8(<2 x i8> %xn1)178  ret <2 x i1> %r179}180 181define i1 @or_slt_intmin(i8 %x) {182; CHECK-LABEL: @or_slt_intmin(183; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], -128184; CHECK-NEXT:    [[R:%.*]] = icmp slt i8 [[XN1]], [[X]]185; CHECK-NEXT:    ret i1 [[R]]186;187  %xn1 = or i8 %x, 128188  %r = icmp slt i8 %xn1, %x189  ret i1 %r190}191 192define <2 x i1> @or_slt_intmin_2(<2 x i8> %xx, <2 x i8> %z) {193; CHECK-LABEL: @or_slt_intmin_2(194; CHECK-NEXT:    [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]]195; CHECK-NEXT:    [[XN1:%.*]] = or <2 x i8> [[X]], splat (i8 -128)196; CHECK-NEXT:    [[R:%.*]] = icmp slt <2 x i8> [[X]], [[XN1]]197; CHECK-NEXT:    ret <2 x i1> [[R]]198;199  %x = add <2 x i8> %xx, %z200  %xn1 = or <2 x i8> %x, <i8 128, i8 128>201  %r = icmp slt <2 x i8> %x, %xn1202  ret <2 x i1> %r203}204 205define i1 @or_sle_intmin_indirect_2(i8 %xx, i8 %C, i8 %z) {206; CHECK-LABEL: @or_sle_intmin_indirect_2(207; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C:%.*]], -128208; CHECK-NEXT:    br i1 [[CMP]], label [[NEG:%.*]], label [[POS:%.*]]209; CHECK:       neg:210; CHECK-NEXT:    [[X:%.*]] = add i8 [[XX:%.*]], [[Z:%.*]]211; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X]], -128212; CHECK-NEXT:    [[R:%.*]] = icmp sle i8 [[X]], [[XN1]]213; CHECK-NEXT:    ret i1 [[R]]214; CHECK:       pos:215; CHECK-NEXT:    call void @barrier()216; CHECK-NEXT:    ret i1 false217;218  %x = add i8 %xx, %z219  %NC = sub i8 0, %C220  %CP2 = and i8 %C, %NC221  %cmp = icmp slt i8 %CP2, 0222  br i1 %cmp, label %neg, label %pos223neg:224  %xn1 = or i8 %x, %CP2225  %r = icmp sle i8 %x, %xn1226  ret i1 %r227pos:228  call void @barrier()229  ret i1 0230}231 232define i1 @or_sge_intmin(i8 %x) {233; CHECK-LABEL: @or_sge_intmin(234; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], -128235; CHECK-NEXT:    [[R:%.*]] = icmp sge i8 [[XN1]], [[X]]236; CHECK-NEXT:    ret i1 [[R]]237;238  %xn1 = or i8 %x, 128239  %r = icmp sge i8 %xn1, %x240  ret i1 %r241}242 243define i1 @or_sgt_intmin_indirect(i8 %x, i8 %C) {244; CHECK-LABEL: @or_sgt_intmin_indirect(245; CHECK-NEXT:    [[C_NOT:%.*]] = icmp eq i8 [[C:%.*]], -128246; CHECK-NEXT:    br i1 [[C_NOT]], label [[NEG:%.*]], label [[POS:%.*]]247; CHECK:       neg:248; CHECK-NEXT:    [[XN1:%.*]] = or i8 [[X:%.*]], -128249; CHECK-NEXT:    [[R:%.*]] = icmp sgt i8 [[XN1]], [[X]]250; CHECK-NEXT:    ret i1 [[R]]251; CHECK:       pos:252; CHECK-NEXT:    call void @barrier()253; CHECK-NEXT:    ret i1 false254;255  %NC = sub i8 0, %C256  %CP2 = and i8 %C, %NC257  %c = icmp sge i8 %CP2, 0258  br i1 %c, label %pos, label %neg259neg:260  %xn1 = or i8 %x, %CP2261  %r = icmp sgt i8 %xn1, %x262  ret i1 %r263pos:264  call void @barrier()265  ret i1 0266}267 268define <2 x i1> @or_sgt_intmin_2(<2 x i8> %xx, <2 x i8> %z) {269; CHECK-LABEL: @or_sgt_intmin_2(270; CHECK-NEXT:    [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]]271; CHECK-NEXT:    [[XN1:%.*]] = or <2 x i8> [[X]], splat (i8 -128)272; CHECK-NEXT:    [[R:%.*]] = icmp sgt <2 x i8> [[X]], [[XN1]]273; CHECK-NEXT:    ret <2 x i1> [[R]]274;275  %x = add <2 x i8> %xx, %z276  %xn1 = or <2 x i8> %x, <i8 128, i8 128>277  %r = icmp sgt <2 x i8> %x, %xn1278  ret <2 x i1> %r279}280 281define i1 @or_simplify_ule(i8 %y_in, i8 %rhs_in, i1 %c) {282; CHECK-LABEL: @or_simplify_ule(283; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[RHS_IN:%.*]], -2284; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], [[RHS_IN]]285; CHECK-NEXT:    [[LBO:%.*]] = or i8 [[Y]], 1286; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[LBO]], [[RHS]]287; CHECK-NEXT:    ret i1 [[R]]288;289  %y = or i8 %y_in, 1290  %rhs = and i8 %rhs_in, -2291  %lbo = or i8 %y, %rhs292  %r = icmp ule i8 %lbo, %rhs293  ret i1 %r294}295 296define i1 @or_simplify_uge(i8 %y_in, i8 %rhs_in, i1 %c) {297; CHECK-LABEL: @or_simplify_uge(298; CHECK-NEXT:    ret i1 false299;300  %y = or i8 %y_in, 129301  %rhs = and i8 %rhs_in, 127302  %lbo = or i8 %y, %rhs303  %r = icmp uge i8 %rhs, %lbo304  ret i1 %r305}306 307define i1 @or_simplify_ule_fail(i8 %y_in, i8 %rhs_in) {308; CHECK-LABEL: @or_simplify_ule_fail(309; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[RHS_IN:%.*]], 127310; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], [[RHS]]311; CHECK-NEXT:    [[LBO:%.*]] = or i8 [[Y]], 64312; CHECK-NEXT:    [[R:%.*]] = icmp ule i8 [[LBO]], [[RHS]]313; CHECK-NEXT:    ret i1 [[R]]314;315  %y = or i8 %y_in, 64316  %rhs = and i8 %rhs_in, 127317  %lbo = or i8 %y, %rhs318  %r = icmp ule i8 %lbo, %rhs319  ret i1 %r320}321 322define i1 @or_simplify_ugt(i8 %y_in, i8 %rhs_in) {323; CHECK-LABEL: @or_simplify_ugt(324; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[RHS_IN:%.*]], -2325; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], [[RHS_IN]]326; CHECK-NEXT:    [[LBO:%.*]] = or i8 [[Y]], 1327; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[LBO]], [[RHS]]328; CHECK-NEXT:    ret i1 [[R]]329;330  %y = or i8 %y_in, 1331  %rhs = and i8 %rhs_in, -2332  %lbo = or i8 %y, %rhs333  %r = icmp ugt i8 %lbo, %rhs334  ret i1 %r335}336 337define i1 @or_simplify_ult(i8 %y_in, i8 %rhs_in) {338; CHECK-LABEL: @or_simplify_ult(339; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[RHS_IN:%.*]], -5340; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], [[RHS_IN]]341; CHECK-NEXT:    [[LBO:%.*]] = or i8 [[Y]], 36342; CHECK-NEXT:    [[R:%.*]] = icmp ult i8 [[RHS]], [[LBO]]343; CHECK-NEXT:    ret i1 [[R]]344;345  %y = or i8 %y_in, 36346  %rhs = and i8 %rhs_in, -5347  %lbo = or i8 %y, %rhs348  %r = icmp ult i8 %rhs, %lbo349  ret i1 %r350}351 352define i1 @or_simplify_ugt_fail(i8 %y_in, i8 %rhs_in) {353; CHECK-LABEL: @or_simplify_ugt_fail(354; CHECK-NEXT:    [[RHS:%.*]] = or i8 [[RHS_IN:%.*]], 1355; CHECK-NEXT:    [[LBO:%.*]] = or i8 [[Y_IN:%.*]], [[RHS]]356; CHECK-NEXT:    [[R:%.*]] = icmp ne i8 [[LBO]], [[RHS]]357; CHECK-NEXT:    ret i1 [[R]]358;359  %y = and i8 %y_in, -2360  %rhs = or i8 %rhs_in, 1361  %lbo = or i8 %y, %rhs362  %r = icmp ugt i8 %lbo, %rhs363  ret i1 %r364}365 366define i1 @pr64610(ptr %b) {367; CHECK-LABEL: @pr64610(368; CHECK-NEXT:    ret i1 true369;370  %v = load i1, ptr %b, align 2371  %s = select i1 %v, i32 74, i32 0372  %or = or i32 %s, 1373  %r = icmp ugt i32 %or, %s374  ret i1 %r375}376 377define i1 @icmp_eq_x_invertable_y2_todo(i8 %x, i1 %y, i8 %z) {378; CHECK-LABEL: @icmp_eq_x_invertable_y2_todo(379; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[Y:%.*]], i8 -8, i8 [[Z:%.*]]380; CHECK-NEXT:    [[TMP2:%.*]] = and i8 [[X:%.*]], [[TMP1]]381; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[TMP2]], 0382; CHECK-NEXT:    ret i1 [[R]]383;384  %zz = xor i8 %z, -1385  %yy = select i1 %y, i8 7, i8 %zz386  %or = or i8 %x, %yy387  %r = icmp eq i8 %yy, %or388  ret i1 %r389}390 391define i1 @icmp_eq_x_invertable_y2(i8 %x, i8 %y) {392; CHECK-LABEL: @icmp_eq_x_invertable_y2(393; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X:%.*]], [[Y:%.*]]394; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[TMP1]], 0395; CHECK-NEXT:    ret i1 [[R]]396;397  %yy = xor i8 %y, -1398  %or = or i8 %x, %yy399  %r = icmp eq i8 %yy, %or400  ret i1 %r401}402 403define i1 @PR38139(i8 %arg) {404; CHECK-LABEL: @PR38139(405; CHECK-NEXT:    [[R:%.*]] = icmp ult i8 [[ARG:%.*]], -64406; CHECK-NEXT:    ret i1 [[R]]407;408  %masked = or i8 %arg, 192409  %r = icmp ne i8 %masked, %arg410  ret i1 %r411}412