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