1550 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instsimplify < %s -S | FileCheck %s3 4declare void @llvm.assume(i1)5declare i8 @llvm.abs.i8(i8, i1)6declare i8 @llvm.bitreverse.i8(i8)7declare i16 @llvm.bswap.i16(i16)8declare i8 @llvm.ctpop.i8(i8)9declare <2 x i8> @llvm.uadd.sat.2xi8(<2 x i8>, <2 x i8>)10declare i8 @llvm.uadd.sat.i8(i8, i8)11declare i8 @llvm.fshr.i8(i8, i8, i8)12declare i8 @llvm.fshl.i8(i8, i8, i8)13declare i8 @llvm.ctlz.i8(i8, i1)14declare i8 @llvm.cttz.i8(i8, i1)15declare i8 @llvm.sadd.sat.i8(i8, i8)16declare i8 @llvm.smax.i8(i8, i8)17declare i8 @llvm.smin.i8(i8, i8)18declare i8 @llvm.sshl.sat.i8(i8, i8)19declare i8 @llvm.ssub.sat.i8(i8, i8)20declare i8 @llvm.umax.i8(i8, i8)21declare i8 @llvm.umin.i8(i8, i8)22declare i8 @llvm.ushl.sat.i8(i8, i8)23declare i8 @llvm.usub.sat.i8(i8, i8)24declare float @llvm.maximum.f32(float, float)25 26;; Throughout use: X > Y || Y == 0 which folds to X > Y iff X known27;; non-zero. Do this because many of the expressions already have28;; hardcoded cases for folding Foo(X) == 0 -> X == 0 and we want to29;; test explicitly that `isKnownNonZero` works.30 31define i1 @check_neg(i8 %x, i8 %y) {32; CHECK-LABEL: @check_neg(33; CHECK-NEXT: [[NE:%.*]] = icmp ne i8 [[X:%.*]], 034; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])35; CHECK-NEXT: [[Z:%.*]] = sub i8 0, [[X]]36; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i8 [[Z]], [[Y:%.*]]37; CHECK-NEXT: ret i1 [[CMP0]]38;39 %ne = icmp ne i8 %x, 040 call void @llvm.assume(i1 %ne)41 %z = sub i8 0, %x42 %cmp0 = icmp ugt i8 %z, %y43 %cmp1 = icmp eq i8 %y, 044 %r = or i1 %cmp0, %cmp145 ret i1 %r46}47 48define i1 @check_abs(i8 %x, i8 %y) {49; CHECK-LABEL: @check_abs(50; CHECK-NEXT: [[NE:%.*]] = icmp ne i8 [[X:%.*]], 051; CHECK-NEXT: br i1 [[NE]], label [[TRUE:%.*]], label [[FALSE:%.*]]52; CHECK: true:53; CHECK-NEXT: [[Z:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)54; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i8 [[Z]], [[Y:%.*]]55; CHECK-NEXT: ret i1 [[CMP0]]56; CHECK: false:57; CHECK-NEXT: ret i1 [[NE]]58;59 %ne = icmp ne i8 %x, 060 br i1 %ne, label %true, label %false61true:62 %z = call i8 @llvm.abs.i8(i8 %x, i1 true)63 %cmp0 = icmp ugt i8 %z, %y64 %cmp1 = icmp eq i8 %y, 065 %r = or i1 %cmp0, %cmp166 ret i1 %r67false:68 ret i1 %ne69}70 71define i1 @check_abs_failish(i8 %x, i8 %y) {72; CHECK-LABEL: @check_abs_failish(73; CHECK-NEXT: [[NE:%.*]] = icmp ne i8 [[X:%.*]], 074; CHECK-NEXT: br i1 [[NE]], label [[TRUE:%.*]], label [[FALSE:%.*]]75; CHECK: false:76; CHECK-NEXT: [[Z:%.*]] = call i8 @llvm.abs.i8(i8 [[X]], i1 true)77; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i8 [[Z]], [[Y:%.*]]78; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[Y]], 079; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP0]], [[CMP1]]80; CHECK-NEXT: ret i1 [[R]]81; CHECK: true:82; CHECK-NEXT: ret i1 [[NE]]83;84 %ne = icmp ne i8 %x, 085 br i1 %ne, label %true, label %false86false:87 %z = call i8 @llvm.abs.i8(i8 %x, i1 true)88 %cmp0 = icmp ugt i8 %z, %y89 %cmp1 = icmp eq i8 %y, 090 %r = or i1 %cmp0, %cmp191 ret i1 %r92true:93 ret i1 %ne94}95 96define i1 @check_bitreverse(i8 %x, i8 %y) {97; CHECK-LABEL: @check_bitreverse(98; CHECK-NEXT: [[NE:%.*]] = icmp ne i8 [[X:%.*]], 099; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])100; CHECK-NEXT: [[Z:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[X]])101; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i8 [[Z]], [[Y:%.*]]102; CHECK-NEXT: ret i1 [[CMP0]]103;104 %ne = icmp ne i8 %x, 0105 call void @llvm.assume(i1 %ne)106 %z = call i8 @llvm.bitreverse.i8(i8 %x)107 %cmp0 = icmp ugt i8 %z, %y108 %cmp1 = icmp eq i8 %y, 0109 %r = or i1 %cmp0, %cmp1110 ret i1 %r111}112 113define i1 @check_bswap(i16 %x, i16 %y) {114; CHECK-LABEL: @check_bswap(115; CHECK-NEXT: [[NE:%.*]] = icmp ne i16 [[X:%.*]], 0116; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])117; CHECK-NEXT: [[Z:%.*]] = call i16 @llvm.bswap.i16(i16 [[X]])118; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i16 [[Z]], [[Y:%.*]]119; CHECK-NEXT: ret i1 [[CMP0]]120;121 %ne = icmp ne i16 %x, 0122 call void @llvm.assume(i1 %ne)123 %z = call i16 @llvm.bswap.i16(i16 %x)124 %cmp0 = icmp ugt i16 %z, %y125 %cmp1 = icmp eq i16 %y, 0126 %r = or i1 %cmp0, %cmp1127 ret i1 %r128}129 130define i1 @check_ctpop(i8 %x, i8 %y) {131; CHECK-LABEL: @check_ctpop(132; CHECK-NEXT: [[NE:%.*]] = icmp eq i8 [[X:%.*]], 0133; CHECK-NEXT: br i1 [[NE]], label [[TRUE:%.*]], label [[FALSE:%.*]]134; CHECK: true:135; CHECK-NEXT: ret i1 [[NE]]136; CHECK: false:137; CHECK-NEXT: [[Z:%.*]] = call i8 @llvm.ctpop.i8(i8 [[X]])138; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i8 [[Z]], [[Y:%.*]]139; CHECK-NEXT: ret i1 [[CMP0]]140;141 %ne = icmp eq i8 %x, 0142 br i1 %ne, label %true, label %false143true:144 ret i1 %ne145false:146 %z = call i8 @llvm.ctpop.i8(i8 %x)147 %cmp0 = icmp ugt i8 %z, %y148 %cmp1 = icmp eq i8 %y, 0149 %r = or i1 %cmp0, %cmp1150 ret i1 %r151}152 153define i1 @check_add_sat(i8 %x, i8 %y, i8 %w) {154; CHECK-LABEL: @check_add_sat(155; CHECK-NEXT: [[NE:%.*]] = icmp ne i8 [[X:%.*]], 0156; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])157; CHECK-NEXT: [[Z:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X]], i8 [[Y:%.*]])158; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i8 [[Z]], [[W:%.*]]159; CHECK-NEXT: ret i1 [[CMP0]]160;161 %ne = icmp ne i8 %x, 0162 call void @llvm.assume(i1 %ne)163 %z = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y)164 %cmp0 = icmp ugt i8 %z, %w165 %cmp1 = icmp eq i8 %w, 0166 %r = or i1 %cmp0, %cmp1167 ret i1 %r168}169 170define <2 x i1> @check_add_sat_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %w) {171; CHECK-LABEL: @check_add_sat_vec(172; CHECK-NEXT: [[YNZ:%.*]] = or <2 x i8> [[Y:%.*]], <i8 2, i8 1>173; CHECK-NEXT: [[Z:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> [[X:%.*]], <2 x i8> [[YNZ]])174; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt <2 x i8> [[Z]], [[W:%.*]]175; CHECK-NEXT: ret <2 x i1> [[CMP0]]176;177 %ynz = or <2 x i8> %y, <i8 2, i8 1>178 %z = call <2 x i8> @llvm.uadd.sat.2xi8(<2 x i8> %x, <2 x i8> %ynz)179 %cmp0 = icmp ugt <2 x i8> %z, %w180 %cmp1 = icmp eq <2 x i8> %w, <i8 0, i8 0>181 %r = or <2 x i1> %cmp0, %cmp1182 ret <2 x i1> %r183}184 185define <2 x i1> @shl_nz_bounded_cnt_vec(<2 x i32> %x, <2 x i32> %y) {186; CHECK-LABEL: @shl_nz_bounded_cnt_vec(187; CHECK-NEXT: ret <2 x i1> zeroinitializer188;189 %cnt = and <2 x i32> %x, <i32 16, i32 24>190 %val = or <2 x i32> %y, <i32 131088, i32 16>191 %shl = shl <2 x i32> %val, %cnt192 %r = icmp eq <2 x i32> %shl, zeroinitializer193 ret <2 x i1> %r194}195 196define i1 @shl_nz_bounded_cnt(i32 %cnt, i32 %y) {197; CHECK-LABEL: @shl_nz_bounded_cnt(198; CHECK-NEXT: [[CNT_ULT4:%.*]] = icmp ult i32 [[CNT:%.*]], 4199; CHECK-NEXT: call void @llvm.assume(i1 [[CNT_ULT4]])200; CHECK-NEXT: ret i1 false201;202 %cnt_ult4 = icmp ult i32 %cnt, 4203 call void @llvm.assume(i1 %cnt_ult4)204 %val = or i32 %y, 131072205 %shl = shl i32 %val, %cnt206 %r = icmp eq i32 %shl, 0207 ret i1 %r208}209 210define <2 x i1> @shl_nz_bounded_cnt_vec_todo_no_common_bit(<2 x i32> %x, <2 x i32> %y) {211; CHECK-LABEL: @shl_nz_bounded_cnt_vec_todo_no_common_bit(212; CHECK-NEXT: [[CNT:%.*]] = and <2 x i32> [[X:%.*]], <i32 16, i32 32>213; CHECK-NEXT: [[VAL:%.*]] = or <2 x i32> [[Y:%.*]], splat (i32 16)214; CHECK-NEXT: [[SHL:%.*]] = shl <2 x i32> [[VAL]], [[CNT]]215; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i32> [[SHL]], zeroinitializer216; CHECK-NEXT: ret <2 x i1> [[R]]217;218 %cnt = and <2 x i32> %x, <i32 16, i32 32>219 %val = or <2 x i32> %y, <i32 16, i32 16>220 %shl = shl <2 x i32> %val, %cnt221 %r = icmp eq <2 x i32> %shl, zeroinitializer222 ret <2 x i1> %r223}224 225define i1 @shl_maybe_zero_bounded_cnt_fail(i32 %x, i32 %y) {226; CHECK-LABEL: @shl_maybe_zero_bounded_cnt_fail(227; CHECK-NEXT: [[CNT:%.*]] = and i32 [[X:%.*]], 16228; CHECK-NEXT: [[VAL:%.*]] = or i32 [[Y:%.*]], 65536229; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[VAL]], [[CNT]]230; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[SHL]], 0231; CHECK-NEXT: ret i1 [[R]]232;233 %cnt = and i32 %x, 16234 %val = or i32 %y, 65536235 %shl = shl i32 %val, %cnt236 %r = icmp eq i32 %shl, 0237 ret i1 %r238}239 240define i1 @shl_non_zero_nsw(i8 %s, i8 %cnt) {241; CHECK-LABEL: @shl_non_zero_nsw(242; CHECK-NEXT: [[NZ:%.*]] = icmp ne i8 [[S:%.*]], 0243; CHECK-NEXT: call void @llvm.assume(i1 [[NZ]])244; CHECK-NEXT: ret i1 false245;246 %nz = icmp ne i8 %s, 0247 call void @llvm.assume(i1 %nz)248 %v = shl nsw i8 %s, %cnt249 %r = icmp eq i8 %v, 0250 ret i1 %r251}252 253define i1 @shl_maybe_zero_nsw_fail(i8 %s, i8 %cnt) {254; CHECK-LABEL: @shl_maybe_zero_nsw_fail(255; CHECK-NEXT: [[V:%.*]] = shl nsw i8 [[S:%.*]], [[CNT:%.*]]256; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0257; CHECK-NEXT: ret i1 [[R]]258;259 %v = shl nsw i8 %s, %cnt260 %r = icmp eq i8 %v, 0261 ret i1 %r262}263 264define i1 @shl_out_of_range_is_poison(i32 %v, i32 %c) {265; CHECK-LABEL: @shl_out_of_range_is_poison(266; CHECK-NEXT: ret i1 poison267;268 %sval = or i32 %v, 32269 %shl = shl i32 %c, %sval270 %z = icmp eq i32 %shl, 0271 ret i1 %z272}273 274define i1 @lshr_nz_bounded_cnt(i32 %cnt, i32 %y) {275; CHECK-LABEL: @lshr_nz_bounded_cnt(276; CHECK-NEXT: [[CNT_ULT4:%.*]] = icmp ult i32 [[CNT:%.*]], 4277; CHECK-NEXT: call void @llvm.assume(i1 [[CNT_ULT4]])278; CHECK-NEXT: ret i1 false279;280 %cnt_ult4 = icmp ult i32 %cnt, 4281 call void @llvm.assume(i1 %cnt_ult4)282 %val = or i32 %y, 90283 %shl = lshr i32 %val, %cnt284 %r = icmp eq i32 %shl, 0285 ret i1 %r286}287 288define <2 x i1> @ashr_nz_bounded_cnt_vec(<2 x i32> %x, <2 x i32> %y) {289; CHECK-LABEL: @ashr_nz_bounded_cnt_vec(290; CHECK-NEXT: ret <2 x i1> zeroinitializer291;292 %cnt = and <2 x i32> %x, <i32 16, i32 24>293 %val = or <2 x i32> %y, <i32 402784272, i32 268697601>294 %shl = ashr <2 x i32> %val, %cnt295 %r = icmp eq <2 x i32> %shl, zeroinitializer296 ret <2 x i1> %r297}298 299define i1 @lshr_nz_bounded_cnt_fail(i32 %cnt, i32 %y) {300; CHECK-LABEL: @lshr_nz_bounded_cnt_fail(301; CHECK-NEXT: [[CNT_ULT:%.*]] = icmp ult i32 [[CNT:%.*]], 20302; CHECK-NEXT: call void @llvm.assume(i1 [[CNT_ULT]])303; CHECK-NEXT: [[VAL:%.*]] = or i32 [[Y:%.*]], 131072304; CHECK-NEXT: [[SHL:%.*]] = lshr i32 [[VAL]], [[CNT]]305; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[SHL]], 0306; CHECK-NEXT: ret i1 [[R]]307;308 %cnt_ult = icmp ult i32 %cnt, 20309 call void @llvm.assume(i1 %cnt_ult)310 %val = or i32 %y, 131072311 %shl = lshr i32 %val, %cnt312 %r = icmp eq i32 %shl, 0313 ret i1 %r314}315 316define <2 x i1> @ashr_nz_bounded_cnt_vec_fail(<2 x i32> %x, <2 x i32> %y) {317; CHECK-LABEL: @ashr_nz_bounded_cnt_vec_fail(318; CHECK-NEXT: [[CNT:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 24)319; CHECK-NEXT: [[VAL:%.*]] = or <2 x i32> [[Y:%.*]], <i32 131088, i32 268697601>320; CHECK-NEXT: [[SHL:%.*]] = ashr <2 x i32> [[VAL]], [[CNT]]321; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i32> [[SHL]], zeroinitializer322; CHECK-NEXT: ret <2 x i1> [[R]]323;324 %cnt = and <2 x i32> %x, <i32 24, i32 24>325 %val = or <2 x i32> %y, <i32 131088, i32 268697601>326 %shl = ashr <2 x i32> %val, %cnt327 %r = icmp eq <2 x i32> %shl, zeroinitializer328 ret <2 x i1> %r329}330 331define i1 @lshr_nonzero_and_shift_out_zeros(i32 %cnt, i32 %y) {332; CHECK-LABEL: @lshr_nonzero_and_shift_out_zeros(333; CHECK-NEXT: [[CNT_ULT:%.*]] = icmp ult i32 [[CNT:%.*]], 4334; CHECK-NEXT: call void @llvm.assume(i1 [[CNT_ULT]])335; CHECK-NEXT: [[VAL:%.*]] = and i32 [[Y:%.*]], -131072336; CHECK-NEXT: [[VAL_NZ:%.*]] = icmp ne i32 [[VAL]], 0337; CHECK-NEXT: call void @llvm.assume(i1 [[VAL_NZ]])338; CHECK-NEXT: ret i1 false339;340 %cnt_ult = icmp ult i32 %cnt, 4341 call void @llvm.assume(i1 %cnt_ult)342 %val = and i32 %y, -131072343 %val_nz = icmp ne i32 %val, 0344 call void @llvm.assume(i1 %val_nz)345 %shl = lshr i32 %val, %cnt346 %r = icmp eq i32 %shl, 0347 ret i1 %r348}349 350define i1 @ashr_nonzero_and_shift_out_zeros(i32 %ccnt, i32 %y) {351; CHECK-LABEL: @ashr_nonzero_and_shift_out_zeros(352; CHECK-NEXT: [[VAL:%.*]] = and i32 [[Y:%.*]], -131072353; CHECK-NEXT: [[VAL_NZ:%.*]] = icmp ne i32 [[VAL]], 0354; CHECK-NEXT: call void @llvm.assume(i1 [[VAL_NZ]])355; CHECK-NEXT: ret i1 false356;357 %cnt = and i32 %ccnt, 7358 %val = and i32 %y, -131072359 %val_nz = icmp ne i32 %val, 0360 call void @llvm.assume(i1 %val_nz)361 %shl = ashr i32 %val, %cnt362 %r = icmp eq i32 %shl, 0363 ret i1 %r364}365 366define i1 @shl_nonzero_and_shift_out_zeros(i32 %ccnt, i32 %y) {367; CHECK-LABEL: @shl_nonzero_and_shift_out_zeros(368; CHECK-NEXT: [[VAL:%.*]] = and i32 [[Y:%.*]], 131071369; CHECK-NEXT: [[VAL_NZ:%.*]] = icmp ne i32 [[VAL]], 0370; CHECK-NEXT: call void @llvm.assume(i1 [[VAL_NZ]])371; CHECK-NEXT: ret i1 false372;373 %cnt = and i32 %ccnt, 6374 %val = and i32 %y, 131071375 %val_nz = icmp ne i32 %val, 0376 call void @llvm.assume(i1 %val_nz)377 %shl = shl i32 %val, %cnt378 %r = icmp eq i32 %shl, 0379 ret i1 %r380}381 382define i1 @lshr_nonzero_and_shift_out_zeros_fail(i32 %cnt, i32 %y) {383; CHECK-LABEL: @lshr_nonzero_and_shift_out_zeros_fail(384; CHECK-NEXT: [[CNT_ULT:%.*]] = icmp ult i32 [[CNT:%.*]], 19385; CHECK-NEXT: call void @llvm.assume(i1 [[CNT_ULT]])386; CHECK-NEXT: [[VAL:%.*]] = and i32 [[Y:%.*]], -131072387; CHECK-NEXT: [[VAL_NZ:%.*]] = icmp ne i32 [[VAL]], 0388; CHECK-NEXT: call void @llvm.assume(i1 [[VAL_NZ]])389; CHECK-NEXT: [[SHL:%.*]] = lshr i32 [[VAL]], [[CNT]]390; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[SHL]], 0391; CHECK-NEXT: ret i1 [[R]]392;393 %cnt_ult = icmp ult i32 %cnt, 19394 call void @llvm.assume(i1 %cnt_ult)395 %val = and i32 %y, -131072396 %val_nz = icmp ne i32 %val, 0397 call void @llvm.assume(i1 %val_nz)398 %shl = lshr i32 %val, %cnt399 %r = icmp eq i32 %shl, 0400 ret i1 %r401}402 403define i1 @ashr_nonzero_and_shift_out_zeros_fail(i32 %ccnt, i32 %y) {404; CHECK-LABEL: @ashr_nonzero_and_shift_out_zeros_fail(405; CHECK-NEXT: [[CNT:%.*]] = and i32 [[CCNT:%.*]], 18406; CHECK-NEXT: [[VAL:%.*]] = and i32 [[Y:%.*]], -131072407; CHECK-NEXT: [[VAL_NZ:%.*]] = icmp ne i32 [[VAL]], 0408; CHECK-NEXT: call void @llvm.assume(i1 [[VAL_NZ]])409; CHECK-NEXT: [[SHL:%.*]] = ashr i32 [[VAL]], [[CNT]]410; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[SHL]], 0411; CHECK-NEXT: ret i1 [[R]]412;413 %cnt = and i32 %ccnt, 18414 %val = and i32 %y, -131072415 %val_nz = icmp ne i32 %val, 0416 call void @llvm.assume(i1 %val_nz)417 %shl = ashr i32 %val, %cnt418 %r = icmp eq i32 %shl, 0419 ret i1 %r420}421 422define i1 @shl_nonzero_and_shift_out_zeros_fail(i32 %ccnt, i32 %y) {423; CHECK-LABEL: @shl_nonzero_and_shift_out_zeros_fail(424; CHECK-NEXT: [[CNT:%.*]] = and i32 [[CCNT:%.*]], 6425; CHECK-NEXT: [[VAL:%.*]] = and i32 [[Y:%.*]], 268435455426; CHECK-NEXT: [[VAL_NZ:%.*]] = icmp ne i32 [[VAL]], 0427; CHECK-NEXT: call void @llvm.assume(i1 [[VAL_NZ]])428; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[VAL]], [[CNT]]429; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[SHL]], 0430; CHECK-NEXT: ret i1 [[R]]431;432 %cnt = and i32 %ccnt, 6433 %val = and i32 %y, 268435455434 %val_nz = icmp ne i32 %val, 0435 call void @llvm.assume(i1 %val_nz)436 %shl = shl i32 %val, %cnt437 %r = icmp eq i32 %shl, 0438 ret i1 %r439}440 441define i1 @sub_nonzero_ops_ne(i8 %xx, i8 %yy, i8 %z) {442; CHECK-LABEL: @sub_nonzero_ops_ne(443; CHECK-NEXT: ret i1 false444;445 %x = and i8 %xx, 191446 %y = or i8 %yy, 64447 %s = sub i8 %x, %y448 %exp = or i8 %z, %s449 %r = icmp eq i8 %exp, 0450 ret i1 %r451}452 453define i1 @sub_nonzero_ops_ne_fail(i8 %xx, i8 %yy, i8 %z) {454; CHECK-LABEL: @sub_nonzero_ops_ne_fail(455; CHECK-NEXT: [[X:%.*]] = and i8 [[XX:%.*]], -64456; CHECK-NEXT: [[Y:%.*]] = or i8 [[YY:%.*]], 64457; CHECK-NEXT: [[S:%.*]] = sub i8 [[X]], [[Y]]458; CHECK-NEXT: [[EXP:%.*]] = or i8 [[Z:%.*]], [[S]]459; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[EXP]], 0460; CHECK-NEXT: ret i1 [[R]]461;462 %x = and i8 %xx, 192463 %y = or i8 %yy, 64464 %s = sub i8 %x, %y465 %exp = or i8 %z, %s466 %r = icmp eq i8 %exp, 0467 ret i1 %r468}469 470define i1 @add_nonzero_nuw(i8 %x, i8 %y) {471; CHECK-LABEL: @add_nonzero_nuw(472; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[X:%.*]], 0473; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])474; CHECK-NEXT: ret i1 false475;476 %x_nz = icmp ne i8 %x, 0477 call void @llvm.assume(i1 %x_nz)478 %a = add nuw i8 %x, %y479 %r = icmp eq i8 %a, 0480 ret i1 %r481}482 483define i1 @add_nonzero_nsw_fail(i8 %x, i8 %y) {484; CHECK-LABEL: @add_nonzero_nsw_fail(485; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[X:%.*]], 0486; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])487; CHECK-NEXT: [[A:%.*]] = add nsw i8 [[X]], [[Y:%.*]]488; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[A]], 0489; CHECK-NEXT: ret i1 [[R]]490;491 %x_nz = icmp ne i8 %x, 0492 call void @llvm.assume(i1 %x_nz)493 %a = add nsw i8 %x, %y494 %r = icmp eq i8 %a, 0495 ret i1 %r496}497 498define i1 @udiv_y_le_x(i8 %xx, i8 %yy, i8 %z) {499; CHECK-LABEL: @udiv_y_le_x(500; CHECK-NEXT: ret i1 false501;502 %x = or i8 %xx, 7503 %y = and i8 %yy, 7504 %d = udiv i8 %x, %y505 %o = or i8 %d, %z506 %r = icmp eq i8 %o, 0507 ret i1 %r508}509 510define i1 @udiv_y_le_x_fail(i8 %xx, i8 %yy, i8 %z) {511; CHECK-LABEL: @udiv_y_le_x_fail(512; CHECK-NEXT: [[X:%.*]] = or i8 [[XX:%.*]], 6513; CHECK-NEXT: [[Y:%.*]] = and i8 [[YY:%.*]], 7514; CHECK-NEXT: [[D:%.*]] = udiv i8 [[X]], [[Y]]515; CHECK-NEXT: [[O:%.*]] = or i8 [[D]], [[Z:%.*]]516; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[O]], 0517; CHECK-NEXT: ret i1 [[R]]518;519 %x = or i8 %xx, 6520 %y = and i8 %yy, 7521 %d = udiv i8 %x, %y522 %o = or i8 %d, %z523 %r = icmp eq i8 %o, 0524 ret i1 %r525}526 527define i1 @fshr_non_zero(i8 %x, i8 %y, i8 %z) {528; CHECK-LABEL: @fshr_non_zero(529; CHECK-NEXT: [[PRED0:%.*]] = icmp ne i8 [[X:%.*]], 0530; CHECK-NEXT: call void @llvm.assume(i1 [[PRED0]])531; CHECK-NEXT: ret i1 false532;533 %pred0 = icmp ne i8 %x, 0534 call void @llvm.assume(i1 %pred0)535 %v = tail call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %y)536 %or = or i8 %v, %z537 %r = icmp eq i8 %or, 0538 ret i1 %r539}540 541define i1 @fshr_non_zero_fail(i8 %x, i8 %y, i8 %z, i8 %w) {542; CHECK-LABEL: @fshr_non_zero_fail(543; CHECK-NEXT: [[PRED0:%.*]] = icmp ne i8 [[X:%.*]], 0544; CHECK-NEXT: call void @llvm.assume(i1 [[PRED0]])545; CHECK-NEXT: [[PRED1:%.*]] = icmp ne i8 [[W:%.*]], 0546; CHECK-NEXT: call void @llvm.assume(i1 [[PRED1]])547; CHECK-NEXT: [[V:%.*]] = tail call i8 @llvm.fshr.i8(i8 [[X]], i8 [[W]], i8 [[Y:%.*]])548; CHECK-NEXT: [[OR:%.*]] = or i8 [[V]], [[Z:%.*]]549; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[OR]], 0550; CHECK-NEXT: ret i1 [[R]]551;552 %pred0 = icmp ne i8 %x, 0553 call void @llvm.assume(i1 %pred0)554 %pred1 = icmp ne i8 %w, 0555 call void @llvm.assume(i1 %pred1)556 %v = tail call i8 @llvm.fshr.i8(i8 %x, i8 %w, i8 %y)557 %or = or i8 %v, %z558 %r = icmp eq i8 %or, 0559 ret i1 %r560}561 562define i1 @fshl_non_zero(i8 %x, i8 %y, i8 %z) {563; CHECK-LABEL: @fshl_non_zero(564; CHECK-NEXT: [[PRED0:%.*]] = icmp ne i8 [[X:%.*]], 0565; CHECK-NEXT: call void @llvm.assume(i1 [[PRED0]])566; CHECK-NEXT: ret i1 false567;568 %pred0 = icmp ne i8 %x, 0569 call void @llvm.assume(i1 %pred0)570 %v = tail call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %y)571 %or = or i8 %v, %z572 %r = icmp eq i8 %or, 0573 ret i1 %r574}575 576define i1 @fshl_non_zero_fail(i8 %x, i8 %y, i8 %z, i8 %w) {577; CHECK-LABEL: @fshl_non_zero_fail(578; CHECK-NEXT: [[PRED0:%.*]] = icmp ne i8 [[X:%.*]], 0579; CHECK-NEXT: call void @llvm.assume(i1 [[PRED0]])580; CHECK-NEXT: [[PRED1:%.*]] = icmp ne i8 [[W:%.*]], 0581; CHECK-NEXT: call void @llvm.assume(i1 [[PRED1]])582; CHECK-NEXT: [[V:%.*]] = tail call i8 @llvm.fshl.i8(i8 [[X]], i8 [[W]], i8 [[Y:%.*]])583; CHECK-NEXT: [[OR:%.*]] = or i8 [[V]], [[Z:%.*]]584; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[OR]], 0585; CHECK-NEXT: ret i1 [[R]]586;587 %pred0 = icmp ne i8 %x, 0588 call void @llvm.assume(i1 %pred0)589 %pred1 = icmp ne i8 %w, 0590 call void @llvm.assume(i1 %pred1)591 %v = tail call i8 @llvm.fshl.i8(i8 %x, i8 %w, i8 %y)592 %or = or i8 %v, %z593 %r = icmp eq i8 %or, 0594 ret i1 %r595}596 597define i1 @bitcast_nonzero(<2 x i8> %xx, i16 %ind) {598; CHECK-LABEL: @bitcast_nonzero(599; CHECK-NEXT: ret i1 false600;601 %xa = add nuw nsw <2 x i8> %xx, <i8 1, i8 1>602 %x = bitcast <2 x i8> %xa to i16603 %z = or i16 %x, %ind604 %r = icmp eq i16 %z, 0605 ret i1 %r606}607 608define i1 @bitcast_todo_partial_nonzero_vec_to_int(<2 x i8> %xx, i16 %ind) {609; CHECK-LABEL: @bitcast_todo_partial_nonzero_vec_to_int(610; CHECK-NEXT: [[XA:%.*]] = add nuw nsw <2 x i8> [[XX:%.*]], <i8 1, i8 0>611; CHECK-NEXT: [[X:%.*]] = bitcast <2 x i8> [[XA]] to i16612; CHECK-NEXT: [[Z:%.*]] = or i16 [[X]], [[IND:%.*]]613; CHECK-NEXT: [[R:%.*]] = icmp eq i16 [[Z]], 0614; CHECK-NEXT: ret i1 [[R]]615;616 %xa = add nuw nsw <2 x i8> %xx, <i8 1, i8 0>617 %x = bitcast <2 x i8> %xa to i16618 %z = or i16 %x, %ind619 %r = icmp eq i16 %z, 0620 ret i1 %r621}622 623define <2 x i1> @bitcast_fail_nonzero_int_to_vec(i16 %xx, <2 x i8> %ind) {624; CHECK-LABEL: @bitcast_fail_nonzero_int_to_vec(625; CHECK-NEXT: [[XA:%.*]] = add nuw nsw i16 [[XX:%.*]], 1626; CHECK-NEXT: [[X:%.*]] = bitcast i16 [[XA]] to <2 x i8>627; CHECK-NEXT: [[Z:%.*]] = or <2 x i8> [[X]], [[IND:%.*]]628; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[Z]], zeroinitializer629; CHECK-NEXT: ret <2 x i1> [[R]]630;631 %xa = add nuw nsw i16 %xx, 1632 %x = bitcast i16 %xa to <2 x i8>633 %z = or <2 x i8> %x, %ind634 %r = icmp eq <2 x i8> %z, zeroinitializer635 ret <2 x i1> %r636}637 638define <2 x i1> @bitcast_veci8_to_veci16(<4 x i8> %xx, <2 x i16> %ind) {639; CHECK-LABEL: @bitcast_veci8_to_veci16(640; CHECK-NEXT: ret <2 x i1> zeroinitializer641;642 %xa = add nuw nsw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>643 %x = bitcast <4 x i8> %xa to <2 x i16>644 %z = or <2 x i16> %x, %ind645 %r = icmp eq <2 x i16> %z, zeroinitializer646 ret <2 x i1> %r647}648 649define <3 x i1> @bitcast_veci3_to_veci4_fail_not_multiple(<4 x i3> %xx, <3 x i4> %ind) {650; CHECK-LABEL: @bitcast_veci3_to_veci4_fail_not_multiple(651; CHECK-NEXT: [[XA:%.*]] = add nuw nsw <4 x i3> [[XX:%.*]], splat (i3 1)652; CHECK-NEXT: [[X:%.*]] = bitcast <4 x i3> [[XA]] to <3 x i4>653; CHECK-NEXT: [[Z:%.*]] = or <3 x i4> [[X]], [[IND:%.*]]654; CHECK-NEXT: [[R:%.*]] = icmp eq <3 x i4> [[Z]], zeroinitializer655; CHECK-NEXT: ret <3 x i1> [[R]]656;657 %xa = add nuw nsw <4 x i3> %xx, <i3 1, i3 1, i3 1, i3 1>658 %x = bitcast <4 x i3> %xa to <3 x i4>659 %z = or <3 x i4> %x, %ind660 %r = icmp eq <3 x i4> %z, zeroinitializer661 ret <3 x i1> %r662}663 664define <4 x i1> @bitcast_fail_veci16_to_veci8(<2 x i16> %xx, <4 x i8> %ind) {665; CHECK-LABEL: @bitcast_fail_veci16_to_veci8(666; CHECK-NEXT: [[XA:%.*]] = add nuw nsw <2 x i16> [[XX:%.*]], splat (i16 1)667; CHECK-NEXT: [[X:%.*]] = bitcast <2 x i16> [[XA]] to <4 x i8>668; CHECK-NEXT: [[Z:%.*]] = or <4 x i8> [[X]], [[IND:%.*]]669; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[Z]], zeroinitializer670; CHECK-NEXT: ret <4 x i1> [[R]]671;672 %xa = add nuw nsw <2 x i16> %xx, <i16 1, i16 1>673 %x = bitcast <2 x i16> %xa to <4 x i8>674 %z = or <4 x i8> %x, %ind675 %r = icmp eq <4 x i8> %z, zeroinitializer676 ret <4 x i1> %r677}678 679define i1 @bitcast_nonzero_fail_dont_check_float(float %xx, i32 %ind) {680; CHECK-LABEL: @bitcast_nonzero_fail_dont_check_float(681; CHECK-NEXT: [[XA:%.*]] = call float @llvm.maximum.f32(float [[XX:%.*]], float 1.000000e+00)682; CHECK-NEXT: [[X:%.*]] = bitcast float [[XA]] to i32683; CHECK-NEXT: [[Z:%.*]] = or i32 [[X]], [[IND:%.*]]684; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[Z]], 0685; CHECK-NEXT: ret i1 [[R]]686;687 %xa = call float @llvm.maximum.f32(float %xx, float 1.000000e+00)688 %x = bitcast float %xa to i32689 %z = or i32 %x, %ind690 %r = icmp eq i32 %z, 0691 ret i1 %r692}693 694define i1 @ctlz_true_nonzero(i8 %xx, i8 %ind) {695; CHECK-LABEL: @ctlz_true_nonzero(696; CHECK-NEXT: ret i1 false697;698 %xs = lshr i8 %xx, 1699 %x = call i8 @llvm.ctlz.i8(i8 %xs, i1 true)700 %z = or i8 %x, %ind701 %r = icmp eq i8 %z, 0702 ret i1 %r703}704 705define i1 @ctlz_false_nonzero(i8 %xx, i8 %ind) {706; CHECK-LABEL: @ctlz_false_nonzero(707; CHECK-NEXT: ret i1 false708;709 %xa = and i8 %xx, 127710 %x = call i8 @llvm.ctlz.i8(i8 %xa, i1 true)711 %z = or i8 %x, %ind712 %r = icmp eq i8 %z, 0713 ret i1 %r714}715 716define i1 @ctlz_nonzero_fail_maybe_neg(i8 %xx, i8 %ind) {717; CHECK-LABEL: @ctlz_nonzero_fail_maybe_neg(718; CHECK-NEXT: [[XS:%.*]] = ashr i8 [[XX:%.*]], 1719; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.ctlz.i8(i8 [[XS]], i1 true)720; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]721; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0722; CHECK-NEXT: ret i1 [[R]]723;724 %xs = ashr i8 %xx, 1725 %x = call i8 @llvm.ctlz.i8(i8 %xs, i1 true)726 %z = or i8 %x, %ind727 %r = icmp eq i8 %z, 0728 ret i1 %r729}730 731define i1 @cttz_true_nonzero(i8 %xx, i8 %ind) {732; CHECK-LABEL: @cttz_true_nonzero(733; CHECK-NEXT: ret i1 false734;735 %xs = shl i8 %xx, 1736 %x = call i8 @llvm.cttz.i8(i8 %xs, i1 true)737 %z = or i8 %x, %ind738 %r = icmp eq i8 %z, 0739 ret i1 %r740}741 742define i1 @cttz_false_nonzero(i8 %xx, i8 %ind) {743; CHECK-LABEL: @cttz_false_nonzero(744; CHECK-NEXT: ret i1 false745;746 %xa = and i8 %xx, -2747 %x = call i8 @llvm.cttz.i8(i8 %xa, i1 true)748 %z = or i8 %x, %ind749 %r = icmp eq i8 %z, 0750 ret i1 %r751}752 753define i1 @cttz_nonzero_fail_maybe_odd(i8 %xx, i8 %cnt, i8 %ind) {754; CHECK-LABEL: @cttz_nonzero_fail_maybe_odd(755; CHECK-NEXT: [[XS:%.*]] = shl i8 [[XX:%.*]], [[CNT:%.*]]756; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.cttz.i8(i8 [[XS]], i1 true)757; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]758; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0759; CHECK-NEXT: ret i1 [[R]]760;761 %xs = shl i8 %xx, %cnt762 %x = call i8 @llvm.cttz.i8(i8 %xs, i1 true)763 %z = or i8 %x, %ind764 %r = icmp eq i8 %z, 0765 ret i1 %r766}767 768define i1 @mul_nonzero_odd(i8 %xx, i8 %y, i8 %ind) {769; CHECK-LABEL: @mul_nonzero_odd(770; CHECK-NEXT: [[Y_NZ:%.*]] = icmp ne i8 [[Y:%.*]], 0771; CHECK-NEXT: call void @llvm.assume(i1 [[Y_NZ]])772; CHECK-NEXT: ret i1 false773;774 %xo = or i8 %xx, 1775 %y_nz = icmp ne i8 %y, 0776 call void @llvm.assume(i1 %y_nz)777 %x = mul i8 %xo, %y778 %z = or i8 %x, %ind779 %r = icmp eq i8 %z, 0780 ret i1 %r781}782 783define i1 @mul_nonzero_odd_fail_y_maybe_zero(i8 %xx, i8 %y, i8 %ind) {784; CHECK-LABEL: @mul_nonzero_odd_fail_y_maybe_zero(785; CHECK-NEXT: [[XO:%.*]] = or i8 [[XX:%.*]], 1786; CHECK-NEXT: [[X:%.*]] = mul i8 [[XO]], [[Y:%.*]]787; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]788; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0789; CHECK-NEXT: ret i1 [[R]]790;791 %xo = or i8 %xx, 1792 %x = mul i8 %xo, %y793 %z = or i8 %x, %ind794 %r = icmp eq i8 %z, 0795 ret i1 %r796}797 798define i1 @sshl_nonzero(i8 %xx, i8 %y, i8 %ind) {799; CHECK-LABEL: @sshl_nonzero(800; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[XX:%.*]], 0801; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])802; CHECK-NEXT: ret i1 false803;804 %x_nz = icmp ne i8 %xx, 0805 call void @llvm.assume(i1 %x_nz)806 %x = call i8 @llvm.sshl.sat.i8(i8 %xx, i8 %y)807 %z = or i8 %x, %ind808 %r = icmp eq i8 %z, 0809 ret i1 %r810}811 812define i1 @sshl_nonzero_fail_x_maybe_z(i8 %xx, i8 %y, i8 %ind) {813; CHECK-LABEL: @sshl_nonzero_fail_x_maybe_z(814; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.sshl.sat.i8(i8 [[XX:%.*]], i8 [[Y:%.*]])815; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]816; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0817; CHECK-NEXT: ret i1 [[R]]818;819 %x = call i8 @llvm.sshl.sat.i8(i8 %xx, i8 %y)820 %z = or i8 %x, %ind821 %r = icmp eq i8 %z, 0822 ret i1 %r823}824 825define i1 @ushl_nonzero(i8 %xx, i8 %y, i8 %ind) {826; CHECK-LABEL: @ushl_nonzero(827; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[XX:%.*]], 0828; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])829; CHECK-NEXT: ret i1 false830;831 %x_nz = icmp ne i8 %xx, 0832 call void @llvm.assume(i1 %x_nz)833 %x = call i8 @llvm.ushl.sat.i8(i8 %xx, i8 %y)834 %z = or i8 %x, %ind835 %r = icmp eq i8 %z, 0836 ret i1 %r837}838 839define i1 @ushl_nonzero_fail_x_maybe_z(i8 %xx, i8 %y, i8 %ind) {840; CHECK-LABEL: @ushl_nonzero_fail_x_maybe_z(841; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.ushl.sat.i8(i8 [[XX:%.*]], i8 [[Y:%.*]])842; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]843; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0844; CHECK-NEXT: ret i1 [[R]]845;846 %x = call i8 @llvm.ushl.sat.i8(i8 %xx, i8 %y)847 %z = or i8 %x, %ind848 %r = icmp eq i8 %z, 0849 ret i1 %r850}851 852define i1 @ssub_sat_nonzero(i8 %xx, i8 %yy, i8 %ind) {853; CHECK-LABEL: @ssub_sat_nonzero(854; CHECK-NEXT: ret i1 false855;856 %xa = and i8 %xx, 191857 %yo = or i8 %yy, 64858 %x = call i8 @llvm.ssub.sat.i8(i8 %xa, i8 %yo)859 %z = or i8 %x, %ind860 %r = icmp eq i8 %z, 0861 ret i1 %r862}863 864define i1 @ssub_sat_nonzero_ne_known_bits_fail_overlap(i8 %xx, i8 %yy, i8 %ind) {865; CHECK-LABEL: @ssub_sat_nonzero_ne_known_bits_fail_overlap(866; CHECK-NEXT: [[XA:%.*]] = and i8 [[XX:%.*]], -64867; CHECK-NEXT: [[YO:%.*]] = or i8 [[YY:%.*]], 64868; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[XA]], i8 [[YO]])869; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]870; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0871; CHECK-NEXT: ret i1 [[R]]872;873 %xa = and i8 %xx, 192874 %yo = or i8 %yy, 64875 %x = call i8 @llvm.ssub.sat.i8(i8 %xa, i8 %yo)876 %z = or i8 %x, %ind877 %r = icmp eq i8 %z, 0878 ret i1 %r879}880 881define i1 @usub_sat_nonzero(i8 %xx, i8 %yy, i8 %ind) {882; CHECK-LABEL: @usub_sat_nonzero(883; CHECK-NEXT: [[Y_ULT_31:%.*]] = icmp ult i8 [[YY:%.*]], 31884; CHECK-NEXT: call void @llvm.assume(i1 [[Y_ULT_31]])885; CHECK-NEXT: [[XO:%.*]] = or i8 [[XX:%.*]], 34886; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[XO]], i8 [[YY]])887; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]888; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0889; CHECK-NEXT: ret i1 [[R]]890;891 %y_ult_31 = icmp ult i8 %yy, 31892 call void @llvm.assume(i1 %y_ult_31)893 %xo = or i8 %xx, 34894 %x = call i8 @llvm.usub.sat.i8(i8 %xo, i8 %yy)895 %z = or i8 %x, %ind896 %r = icmp eq i8 %z, 0897 ret i1 %r898}899 900define i1 @usub_sat_nonzero_fail(i8 %xx, i8 %yy, i8 %ind) {901; CHECK-LABEL: @usub_sat_nonzero_fail(902; CHECK-NEXT: [[XA:%.*]] = and i8 [[XX:%.*]], 16903; CHECK-NEXT: [[YO:%.*]] = or i8 [[YY:%.*]], 7904; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[XA]], i8 [[YO]])905; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]906; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0907; CHECK-NEXT: ret i1 [[R]]908;909 %xa = and i8 %xx, 16910 %yo = or i8 %yy, 7911 %x = call i8 @llvm.usub.sat.i8(i8 %xa, i8 %yo)912 %z = or i8 %x, %ind913 %r = icmp eq i8 %z, 0914 ret i1 %r915}916 917define i1 @sadd_sat_nonzero(i8 %xx, i8 %yy, i8 %ind) {918; CHECK-LABEL: @sadd_sat_nonzero(919; CHECK-NEXT: [[X_STRICT_POS:%.*]] = icmp sgt i8 [[XX:%.*]], 0920; CHECK-NEXT: [[Y_POS:%.*]] = icmp sge i8 [[YY:%.*]], 0921; CHECK-NEXT: call void @llvm.assume(i1 [[X_STRICT_POS]])922; CHECK-NEXT: call void @llvm.assume(i1 [[Y_POS]])923; CHECK-NEXT: ret i1 false924;925 %x_strict_pos = icmp sgt i8 %xx, 0926 %y_pos = icmp sge i8 %yy, 0927 call void @llvm.assume(i1 %x_strict_pos)928 call void @llvm.assume(i1 %y_pos)929 %x = call i8 @llvm.sadd.sat.i8(i8 %xx, i8 %yy)930 %z = or i8 %x, %ind931 %r = icmp eq i8 %z, 0932 ret i1 %r933}934 935define i1 @sadd_sat_nonzero_fail_maybe_zz(i8 %xx, i8 %yy, i8 %ind) {936; CHECK-LABEL: @sadd_sat_nonzero_fail_maybe_zz(937; CHECK-NEXT: [[X_POS:%.*]] = icmp sge i8 [[XX:%.*]], 0938; CHECK-NEXT: [[Y_POS:%.*]] = icmp sge i8 [[YY:%.*]], 0939; CHECK-NEXT: call void @llvm.assume(i1 [[X_POS]])940; CHECK-NEXT: call void @llvm.assume(i1 [[Y_POS]])941; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[XX]], i8 [[YY]])942; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]943; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0944; CHECK-NEXT: ret i1 [[R]]945;946 %x_pos = icmp sge i8 %xx, 0947 %y_pos = icmp sge i8 %yy, 0948 call void @llvm.assume(i1 %x_pos)949 call void @llvm.assume(i1 %y_pos)950 %x = call i8 @llvm.sadd.sat.i8(i8 %xx, i8 %yy)951 %z = or i8 %x, %ind952 %r = icmp eq i8 %z, 0953 ret i1 %r954}955 956define i1 @umax_nonzero(i8 %xx, i8 %yy, i8 %ind) {957; CHECK-LABEL: @umax_nonzero(958; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[XX:%.*]], 0959; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])960; CHECK-NEXT: ret i1 false961;962 %x_nz = icmp ne i8 %xx, 0963 call void @llvm.assume(i1 %x_nz)964 %x = call i8 @llvm.umax.i8(i8 %xx, i8 %yy)965 %z = or i8 %x, %ind966 %r = icmp eq i8 %z, 0967 ret i1 %r968}969 970define i1 @umax_nonzero_fail_x_maybe_z(i8 %xx, i8 %yy, i8 %ind) {971; CHECK-LABEL: @umax_nonzero_fail_x_maybe_z(972; CHECK-NEXT: [[X_NZ:%.*]] = icmp sge i8 [[XX:%.*]], 0973; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])974; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.umax.i8(i8 [[XX]], i8 [[YY:%.*]])975; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]976; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 0977; CHECK-NEXT: ret i1 [[R]]978;979 %x_nz = icmp sge i8 %xx, 0980 call void @llvm.assume(i1 %x_nz)981 %x = call i8 @llvm.umax.i8(i8 %xx, i8 %yy)982 %z = or i8 %x, %ind983 %r = icmp eq i8 %z, 0984 ret i1 %r985}986 987define i1 @umin_nonzero(i8 %xx, i8 %yy, i8 %ind) {988; CHECK-LABEL: @umin_nonzero(989; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[XX:%.*]], 0990; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])991; CHECK-NEXT: [[Y_NZ:%.*]] = icmp ne i8 [[YY:%.*]], 0992; CHECK-NEXT: call void @llvm.assume(i1 [[Y_NZ]])993; CHECK-NEXT: ret i1 false994;995 %x_nz = icmp ne i8 %xx, 0996 call void @llvm.assume(i1 %x_nz)997 %y_nz = icmp ne i8 %yy, 0998 call void @llvm.assume(i1 %y_nz)999 %x = call i8 @llvm.umin.i8(i8 %xx, i8 %yy)1000 %z = or i8 %x, %ind1001 %r = icmp eq i8 %z, 01002 ret i1 %r1003}1004 1005define i1 @umin_nonzero_fail_y_maybe_z(i8 %xx, i8 %yy, i8 %ind) {1006; CHECK-LABEL: @umin_nonzero_fail_y_maybe_z(1007; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[XX:%.*]], 01008; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])1009; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.umin.i8(i8 [[XX]], i8 [[YY:%.*]])1010; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]1011; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 01012; CHECK-NEXT: ret i1 [[R]]1013;1014 %x_nz = icmp ne i8 %xx, 01015 call void @llvm.assume(i1 %x_nz)1016 %x = call i8 @llvm.umin.i8(i8 %xx, i8 %yy)1017 %z = or i8 %x, %ind1018 %r = icmp eq i8 %z, 01019 ret i1 %r1020}1021 1022define i1 @smin_nonzero(i8 %xx, i8 %yy, i8 %ind) {1023; CHECK-LABEL: @smin_nonzero(1024; CHECK-NEXT: [[X_NZ:%.*]] = icmp ne i8 [[XX:%.*]], 01025; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])1026; CHECK-NEXT: [[Y_NZ:%.*]] = icmp ne i8 [[YY:%.*]], 01027; CHECK-NEXT: call void @llvm.assume(i1 [[Y_NZ]])1028; CHECK-NEXT: ret i1 false1029;1030 %x_nz = icmp ne i8 %xx, 01031 call void @llvm.assume(i1 %x_nz)1032 %y_nz = icmp ne i8 %yy, 01033 call void @llvm.assume(i1 %y_nz)1034 %x = call i8 @llvm.umin.i8(i8 %xx, i8 %yy)1035 %z = or i8 %x, %ind1036 %r = icmp eq i8 %z, 01037 ret i1 %r1038}1039 1040define i1 @smin_nonzero_neg_arg(i8 %xx, i8 %yy, i8 %ind) {1041; CHECK-LABEL: @smin_nonzero_neg_arg(1042; CHECK-NEXT: [[X_NEG:%.*]] = icmp slt i8 [[XX:%.*]], 01043; CHECK-NEXT: call void @llvm.assume(i1 [[X_NEG]])1044; CHECK-NEXT: ret i1 false1045;1046 %x_neg = icmp slt i8 %xx, 01047 call void @llvm.assume(i1 %x_neg)1048 %x = call i8 @llvm.smin.i8(i8 %xx, i8 %yy)1049 %z = or i8 %x, %ind1050 %r = icmp eq i8 %z, 01051 ret i1 %r1052}1053 1054define i1 @smin_nonzero_fail_y_maybe_z(i8 %xx, i8 %yy, i8 %ind) {1055; CHECK-LABEL: @smin_nonzero_fail_y_maybe_z(1056; CHECK-NEXT: [[X_NZ:%.*]] = icmp sle i8 [[XX:%.*]], 01057; CHECK-NEXT: call void @llvm.assume(i1 [[X_NZ]])1058; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.smin.i8(i8 [[XX]], i8 [[YY:%.*]])1059; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]1060; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 01061; CHECK-NEXT: ret i1 [[R]]1062;1063 %x_nz = icmp sle i8 %xx, 01064 call void @llvm.assume(i1 %x_nz)1065 %x = call i8 @llvm.smin.i8(i8 %xx, i8 %yy)1066 %z = or i8 %x, %ind1067 %r = icmp eq i8 %z, 01068 ret i1 %r1069}1070 1071define i1 @smax_nonzero_pos_arg(i8 %xx, i8 %yy, i8 %ind) {1072; CHECK-LABEL: @smax_nonzero_pos_arg(1073; CHECK-NEXT: ret i1 false1074;1075 %ya = and i8 %yy, 1271076 %yo = or i8 %ya, 11077 %x = call i8 @llvm.smax.i8(i8 %xx, i8 %yo)1078 %z = or i8 %x, %ind1079 %r = icmp eq i8 %z, 01080 ret i1 %r1081}1082 1083define i1 @smax_nonzero_pos_arg_fail_nonstrict_pos(i8 %xx, i8 %yy, i8 %ind) {1084; CHECK-LABEL: @smax_nonzero_pos_arg_fail_nonstrict_pos(1085; CHECK-NEXT: [[Y_POS:%.*]] = icmp sge i8 [[YY:%.*]], 01086; CHECK-NEXT: call void @llvm.assume(i1 [[Y_POS]])1087; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.smax.i8(i8 [[XX:%.*]], i8 [[YY]])1088; CHECK-NEXT: [[Z:%.*]] = or i8 [[X]], [[IND:%.*]]1089; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[Z]], 01090; CHECK-NEXT: ret i1 [[R]]1091;1092 %y_pos = icmp sge i8 %yy, 01093 call void @llvm.assume(i1 %y_pos)1094 %x = call i8 @llvm.smax.i8(i8 %xx, i8 %yy)1095 %z = or i8 %x, %ind1096 %r = icmp eq i8 %z, 01097 ret i1 %r1098}1099 1100define i1 @mul_nonzero_contains_nonzero_mul(i8 %x, i8 %y) {1101; CHECK-LABEL: @mul_nonzero_contains_nonzero_mul(1102; CHECK-NEXT: ret i1 true1103;1104 %xx = or i8 %x, 161105 %yy = or i8 %y, 81106 %xy = mul i8 %xx, %yy1107 %nz = icmp ne i8 %xy, 01108 ret i1 %nz1109}1110 1111define i1 @src_mul_maybe_zero_no_nonzero_mul(i8 %x, i8 %y) {1112; CHECK-LABEL: @src_mul_maybe_zero_no_nonzero_mul(1113; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 961114; CHECK-NEXT: [[YY:%.*]] = or i8 [[Y:%.*]], 81115; CHECK-NEXT: [[XY:%.*]] = mul i8 [[XX]], [[YY]]1116; CHECK-NEXT: [[NZ:%.*]] = icmp ne i8 [[XY]], 01117; CHECK-NEXT: ret i1 [[NZ]]1118;1119 %xx = or i8 %x, 961120 %yy = or i8 %y, 81121 %xy = mul i8 %xx, %yy1122 %nz = icmp ne i8 %xy, 01123 ret i1 %nz1124}1125 1126define i1 @sdiv_known_non_zero(i8 %x, i8 %y) {1127; CHECK-LABEL: @sdiv_known_non_zero(1128; CHECK-NEXT: ret i1 true1129;1130 %xx0 = or i8 %x, 1351131 %xx = and i8 %xx0, -21132 %xy = sdiv i8 %xx, -21133 %nz = icmp ne i8 %xy, 01134 ret i1 %nz1135}1136 1137define i1 @sdiv_known_non_zero2(i8 %x, i8 %y) {1138; CHECK-LABEL: @sdiv_known_non_zero2(1139; CHECK-NEXT: ret i1 true1140;1141 %xx0 = or i8 %x, 151142 %xx = and i8 %xx0, -41143 %yy = and i8 %y, 31144 %xy = sdiv i8 %xx, %yy1145 %nz = icmp ne i8 %xy, 01146 ret i1 %nz1147}1148 1149define i1 @sdiv_known_non_zero_fail(i8 %x, i8 %y) {1150; CHECK-LABEL: @sdiv_known_non_zero_fail(1151; CHECK-NEXT: [[XX:%.*]] = or i8 [[X:%.*]], 151152; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], 31153; CHECK-NEXT: [[XY:%.*]] = sdiv i8 [[XX]], [[YY]]1154; CHECK-NEXT: [[NZ:%.*]] = icmp ne i8 [[XY]], 01155; CHECK-NEXT: ret i1 [[NZ]]1156;1157 %xx = or i8 %x, 151158 %yy = and i8 %y, 31159 %xy = sdiv i8 %xx, %yy1160 %nz = icmp ne i8 %xy, 01161 ret i1 %nz1162}1163 1164define <2 x i1> @cmp_excludes_zero_with_nonsplat_vec(<2 x i8> %a, <2 x i8> %b) {1165; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec(1166; CHECK-NEXT: ret <2 x i1> zeroinitializer1167;1168 %c = icmp sge <2 x i8> %a, <i8 1, i8 4>1169 %s = select <2 x i1> %c, <2 x i8> %a, <2 x i8> <i8 4, i8 5>1170 %and = or <2 x i8> %s, %b1171 %r = icmp eq <2 x i8> %and, zeroinitializer1172 ret <2 x i1> %r1173}1174 1175define <2 x i1> @cmp_excludes_zero_with_nonsplat_vec_wundef(<2 x i8> %a, <2 x i8> %b) {1176; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_wundef(1177; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 1, i8 undef>1178; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>1179; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]1180; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer1181; CHECK-NEXT: ret <2 x i1> [[R]]1182;1183 %c = icmp sge <2 x i8> %a, <i8 1, i8 undef>1184 %s = select <2 x i1> %c, <2 x i8> %a, <2 x i8> <i8 4, i8 5>1185 %and = or <2 x i8> %s, %b1186 %r = icmp eq <2 x i8> %and, zeroinitializer1187 ret <2 x i1> %r1188}1189 1190define <2 x i1> @cmp_excludes_zero_with_nonsplat_vec_wpoison(<2 x i8> %a, <2 x i8> %b) {1191; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_wpoison(1192; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 1, i8 poison>1193; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>1194; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]1195; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer1196; CHECK-NEXT: ret <2 x i1> [[R]]1197;1198 %c = icmp sge <2 x i8> %a, <i8 1, i8 poison>1199 %s = select <2 x i1> %c, <2 x i8> %a, <2 x i8> <i8 4, i8 5>1200 %and = or <2 x i8> %s, %b1201 %r = icmp eq <2 x i8> %and, zeroinitializer1202 ret <2 x i1> %r1203}1204 1205define <2 x i1> @cmp_excludes_zero_with_nonsplat_vec_fail(<2 x i8> %a, <2 x i8> %b) {1206; CHECK-LABEL: @cmp_excludes_zero_with_nonsplat_vec_fail(1207; CHECK-NEXT: [[C:%.*]] = icmp sge <2 x i8> [[A:%.*]], <i8 0, i8 4>1208; CHECK-NEXT: [[S:%.*]] = select <2 x i1> [[C]], <2 x i8> [[A]], <2 x i8> <i8 4, i8 5>1209; CHECK-NEXT: [[AND:%.*]] = or <2 x i8> [[S]], [[B:%.*]]1210; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[AND]], zeroinitializer1211; CHECK-NEXT: ret <2 x i1> [[R]]1212;1213 %c = icmp sge <2 x i8> %a, <i8 0, i8 4>1214 %s = select <2 x i1> %c, <2 x i8> %a, <2 x i8> <i8 4, i8 5>1215 %and = or <2 x i8> %s, %b1216 %r = icmp eq <2 x i8> %and, zeroinitializer1217 ret <2 x i1> %r1218}1219 1220define i1 @sub_via_non_eq(i8 %x, i8 %y) {1221; CHECK-LABEL: @sub_via_non_eq(1222; CHECK-NEXT: [[NE:%.*]] = icmp ne i8 [[X:%.*]], 01223; CHECK-NEXT: call void @llvm.assume(i1 [[NE]])1224; CHECK-NEXT: ret i1 false1225;1226 %ne = icmp ne i8 %x, 01227 call void @llvm.assume(i1 %ne)1228 %shl = shl nuw i8 %x, 31229 %sub = sub i8 %x, %shl1230 %cmp = icmp eq i8 %sub, 01231 ret i1 %cmp1232}1233 1234; Test mismatch of ptrtoints type and pointer size1235define i1 @recursiveGEP_orcmp_truncPtr(ptr %val1, i32 %val2) {1236; CHECK-LABEL: @recursiveGEP_orcmp_truncPtr(1237; CHECK-NEXT: entry:1238; CHECK-NEXT: br label [[WHILE_COND_I:%.*]]1239; CHECK: while.cond.i:1240; CHECK-NEXT: [[A_PN_I:%.*]] = phi ptr [ [[TEST_0_I:%.*]], [[WHILE_COND_I]] ], [ [[VAL1:%.*]], [[ENTRY:%.*]] ]1241; CHECK-NEXT: [[TEST_0_I]] = getelementptr inbounds i8, ptr [[A_PN_I]], i64 11242; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[TEST_0_I]], align 21243; CHECK-NEXT: [[CMP3_NOT_I:%.*]] = icmp eq i8 [[TMP0]], 01244; CHECK-NEXT: br i1 [[CMP3_NOT_I]], label [[WHILE_END_I:%.*]], label [[WHILE_COND_I]]1245; CHECK: while.end.i:1246; CHECK-NEXT: [[SUB_PTR_LHS_CAST_I:%.*]] = ptrtoint ptr [[TEST_0_I]] to i321247; CHECK-NEXT: [[SUB_PTR_RHS_CAST_I:%.*]] = ptrtoint ptr [[VAL1]] to i321248; CHECK-NEXT: [[SUB_PTR_SUB_I:%.*]] = sub i32 [[SUB_PTR_LHS_CAST_I]], [[SUB_PTR_RHS_CAST_I]]1249; CHECK-NEXT: [[ORVAL:%.*]] = or i32 [[VAL2:%.*]], [[SUB_PTR_SUB_I]]1250; CHECK-NEXT: [[BOOL:%.*]] = icmp eq i32 [[ORVAL]], 01251; CHECK-NEXT: ret i1 [[BOOL]]1252;1253entry:1254 br label %while.cond.i1255 1256while.cond.i:1257 %a.pn.i = phi ptr [ %test.0.i, %while.cond.i ], [ %val1, %entry ]1258 %test.0.i = getelementptr inbounds i8, ptr %a.pn.i, i64 11259 %0 = load i8, ptr %test.0.i, align 21260 %cmp3.not.i = icmp eq i8 %0, 01261 br i1 %cmp3.not.i, label %while.end.i, label %while.cond.i1262 1263while.end.i:1264 %sub.ptr.lhs.cast.i = ptrtoint ptr %test.0.i to i321265 %sub.ptr.rhs.cast.i = ptrtoint ptr %val1 to i321266 %sub.ptr.sub.i = sub i32 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i1267 %orval = or i32 %val2, %sub.ptr.sub.i1268 %bool = icmp eq i32 %orval, 01269 ret i1 %bool1270}1271 1272define i1 @check_get_vector_length(i32 %x, i32 %y) {1273; CHECK-LABEL: @check_get_vector_length(1274; CHECK-NEXT: [[NE:%.*]] = icmp ne i32 [[X:%.*]], 01275; CHECK-NEXT: br i1 [[NE]], label [[TRUE:%.*]], label [[FALSE:%.*]]1276; CHECK: true:1277; CHECK-NEXT: [[Z:%.*]] = call i32 @llvm.experimental.get.vector.length.i32(i32 [[X]], i32 1, i1 true)1278; CHECK-NEXT: [[CMP0:%.*]] = icmp ugt i32 [[Z]], [[Y:%.*]]1279; CHECK-NEXT: ret i1 [[CMP0]]1280; CHECK: false:1281; CHECK-NEXT: ret i1 [[NE]]1282;1283 %ne = icmp ne i32 %x, 01284 br i1 %ne, label %true, label %false1285true:1286 %z = call i32 @llvm.experimental.get.vector.length.i32(i32 %x, i32 1, i1 true)1287 %cmp0 = icmp ugt i32 %z, %y1288 %cmp1 = icmp eq i32 %y, 01289 %r = or i1 %cmp0, %cmp11290 ret i1 %r1291false:1292 ret i1 %ne1293}1294 1295define <2 x i1> @range_metadata_vec(ptr %p, <2 x i32> %x) {1296; CHECK-LABEL: @range_metadata_vec(1297; CHECK-NEXT: ret <2 x i1> splat (i1 true)1298;1299 %v = load <2 x i32>, ptr %p, !range !{i32 1, i32 100}1300 %or = or <2 x i32> %v, %x1301 %cmp = icmp ne <2 x i32> %or, zeroinitializer1302 ret <2 x i1> %cmp1303}1304 1305define i1 @range_attr(i8 range(i8 1, 0) %x, i8 %y) {1306; CHECK-LABEL: @range_attr(1307; CHECK-NEXT: ret i1 false1308;1309 %or = or i8 %y, %x1310 %cmp = icmp eq i8 %or, 01311 ret i1 %cmp1312}1313 1314define i1 @neg_range_attr(i8 range(i8 -1, 1) %x, i8 %y) {1315; CHECK-LABEL: @neg_range_attr(1316; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[X:%.*]]1317; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 01318; CHECK-NEXT: ret i1 [[CMP]]1319;1320 %or = or i8 %y, %x1321 %cmp = icmp eq i8 %or, 01322 ret i1 %cmp1323}1324 1325declare range(i8 1, 0) i8 @returns_non_zero_range_helper()1326declare range(i8 -1, 1) i8 @returns_contain_zero_range_helper()1327 1328define i1 @range_return(i8 %y) {1329; CHECK-LABEL: @range_return(1330; CHECK-NEXT: [[X:%.*]] = call i8 @returns_non_zero_range_helper()1331; CHECK-NEXT: ret i1 false1332;1333 %x = call i8 @returns_non_zero_range_helper()1334 %or = or i8 %y, %x1335 %cmp = icmp eq i8 %or, 01336 ret i1 %cmp1337}1338 1339define i1 @neg_range_return(i8 %y) {1340; CHECK-LABEL: @neg_range_return(1341; CHECK-NEXT: [[X:%.*]] = call i8 @returns_contain_zero_range_helper()1342; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[X]]1343; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 01344; CHECK-NEXT: ret i1 [[CMP]]1345;1346 %x = call i8 @returns_contain_zero_range_helper()1347 %or = or i8 %y, %x1348 %cmp = icmp eq i8 %or, 01349 ret i1 %cmp1350}1351 1352declare i8 @returns_i8_helper()1353 1354define i1 @range_call(i8 %y) {1355; CHECK-LABEL: @range_call(1356; CHECK-NEXT: [[X:%.*]] = call range(i8 1, 0) i8 @returns_i8_helper()1357; CHECK-NEXT: ret i1 false1358;1359 %x = call range(i8 1, 0) i8 @returns_i8_helper()1360 %or = or i8 %y, %x1361 %cmp = icmp eq i8 %or, 01362 ret i1 %cmp1363}1364 1365define i1 @neg_range_call(i8 %y) {1366; CHECK-LABEL: @neg_range_call(1367; CHECK-NEXT: [[X:%.*]] = call range(i8 -1, 1) i8 @returns_i8_helper()1368; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], [[X]]1369; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 01370; CHECK-NEXT: ret i1 [[CMP]]1371;1372 %x = call range(i8 -1, 1) i8 @returns_i8_helper()1373 %or = or i8 %y, %x1374 %cmp = icmp eq i8 %or, 01375 ret i1 %cmp1376}1377 1378define <2 x i1> @range_attr_vec(<2 x i8> range(i8 1, 0) %x, <2 x i8> %y) {1379; CHECK-LABEL: @range_attr_vec(1380; CHECK-NEXT: ret <2 x i1> splat (i1 true)1381;1382 %or = or <2 x i8> %y, %x1383 %cmp = icmp ne <2 x i8> %or, zeroinitializer1384 ret <2 x i1> %cmp1385}1386 1387define <2 x i1> @neg_range_attr_vec(<2 x i8> range(i8 -1, 1) %x, <2 x i8> %y) {1388; CHECK-LABEL: @neg_range_attr_vec(1389; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X:%.*]]1390; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer1391; CHECK-NEXT: ret <2 x i1> [[CMP]]1392;1393 %or = or <2 x i8> %y, %x1394 %cmp = icmp ne <2 x i8> %or, zeroinitializer1395 ret <2 x i1> %cmp1396}1397 1398declare range(i8 1, 0) <2 x i8> @returns_non_zero_range_helper_vec()1399declare range(i8 -1, 1) <2 x i8> @returns_contain_zero_range_helper_vec()1400 1401define <2 x i1> @range_return_vec(<2 x i8> %y) {1402; CHECK-LABEL: @range_return_vec(1403; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @returns_non_zero_range_helper_vec()1404; CHECK-NEXT: ret <2 x i1> splat (i1 true)1405;1406 %x = call <2 x i8> @returns_non_zero_range_helper_vec()1407 %or = or <2 x i8> %y, %x1408 %cmp = icmp ne <2 x i8> %or, zeroinitializer1409 ret <2 x i1> %cmp1410}1411 1412define <2 x i1> @neg_range_return_vec(<2 x i8> %y) {1413; CHECK-LABEL: @neg_range_return_vec(1414; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @returns_contain_zero_range_helper_vec()1415; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X]]1416; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer1417; CHECK-NEXT: ret <2 x i1> [[CMP]]1418;1419 %x = call <2 x i8> @returns_contain_zero_range_helper_vec()1420 %or = or <2 x i8> %y, %x1421 %cmp = icmp ne <2 x i8> %or, zeroinitializer1422 ret <2 x i1> %cmp1423}1424 1425declare <2 x i8> @returns_i8_helper_vec()1426 1427define <2 x i1> @range_call_vec(<2 x i8> %y) {1428; CHECK-LABEL: @range_call_vec(1429; CHECK-NEXT: [[X:%.*]] = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()1430; CHECK-NEXT: ret <2 x i1> splat (i1 true)1431;1432 %x = call range(i8 1, 0) <2 x i8> @returns_i8_helper_vec()1433 %or = or <2 x i8> %y, %x1434 %cmp = icmp ne <2 x i8> %or, zeroinitializer1435 ret <2 x i1> %cmp1436}1437 1438define <2 x i1> @neg_range_call_vec(<2 x i8> %y) {1439; CHECK-LABEL: @neg_range_call_vec(1440; CHECK-NEXT: [[X:%.*]] = call range(i8 -1, 1) <2 x i8> @returns_i8_helper_vec()1441; CHECK-NEXT: [[OR:%.*]] = or <2 x i8> [[Y:%.*]], [[X]]1442; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[OR]], zeroinitializer1443; CHECK-NEXT: ret <2 x i1> [[CMP]]1444;1445 %x = call range(i8 -1, 1) <2 x i8> @returns_i8_helper_vec()1446 %or = or <2 x i8> %y, %x1447 %cmp = icmp ne <2 x i8> %or, zeroinitializer1448 ret <2 x i1> %cmp1449}1450 1451define i1 @trunc_nsw_non_zero(i8 %x) {1452; CHECK-LABEL: @trunc_nsw_non_zero(1453; CHECK-NEXT: [[X_NE_Z:%.*]] = icmp ne i8 [[X:%.*]], 01454; CHECK-NEXT: call void @llvm.assume(i1 [[X_NE_Z]])1455; CHECK-NEXT: ret i1 true1456;1457 %x_ne_z = icmp ne i8 %x, 01458 call void @llvm.assume(i1 %x_ne_z)1459 %v = trunc nsw i8 %x to i41460 %r = icmp ne i4 %v, 01461 ret i1 %r1462}1463 1464define i1 @trunc_nuw_non_zero(i8 %xx) {1465; CHECK-LABEL: @trunc_nuw_non_zero(1466; CHECK-NEXT: ret i1 false1467;1468 %x = add nuw i8 %xx, 11469 %v = trunc nuw i8 %x to i41470 %r = icmp eq i4 %v, 01471 ret i1 %r1472}1473 1474define i1 @trunc_non_zero_fail(i8 %x) {1475; CHECK-LABEL: @trunc_non_zero_fail(1476; CHECK-NEXT: [[X_NE_Z:%.*]] = icmp ne i8 [[X:%.*]], 01477; CHECK-NEXT: call void @llvm.assume(i1 [[X_NE_Z]])1478; CHECK-NEXT: [[R:%.*]] = trunc i8 [[X]] to i11479; CHECK-NEXT: ret i1 [[R]]1480;1481 %x_ne_z = icmp ne i8 %x, 01482 call void @llvm.assume(i1 %x_ne_z)1483 %r = trunc i8 %x to i11484 ret i1 %r1485}1486 1487define i1 @trunc_nsw_nuw_non_zero_fail(i8 %xx) {1488; CHECK-LABEL: @trunc_nsw_nuw_non_zero_fail(1489; CHECK-NEXT: [[X:%.*]] = add nsw i8 [[XX:%.*]], 11490; CHECK-NEXT: [[V:%.*]] = trunc nuw nsw i8 [[X]] to i41491; CHECK-NEXT: [[R:%.*]] = icmp eq i4 [[V]], 01492; CHECK-NEXT: ret i1 [[R]]1493;1494 %x = add nsw i8 %xx, 11495 %v = trunc nsw nuw i8 %x to i41496 %r = icmp eq i4 %v, 01497 ret i1 %r1498}1499 1500define <4 x i1> @vec_reverse_non_zero(<4 x i8> %xx) {1501; CHECK-LABEL: @vec_reverse_non_zero(1502; CHECK-NEXT: ret <4 x i1> zeroinitializer1503;1504 %x = add nuw <4 x i8> %xx, <i8 1, i8 1, i8 1, i8 1>1505 %rev = call <4 x i8> @llvm.vector.reverse(<4 x i8> %x)1506 %r = icmp eq <4 x i8> %rev, zeroinitializer1507 ret <4 x i1> %r1508}1509 1510define <4 x i1> @vec_reverse_non_zero_fail(<4 x i8> %xx) {1511; CHECK-LABEL: @vec_reverse_non_zero_fail(1512; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 0, i8 1, i8 1>1513; CHECK-NEXT: [[REV:%.*]] = call <4 x i8> @llvm.vector.reverse.v4i8(<4 x i8> [[X]])1514; CHECK-NEXT: [[R:%.*]] = icmp eq <4 x i8> [[REV]], zeroinitializer1515; CHECK-NEXT: ret <4 x i1> [[R]]1516;1517 %x = add nuw <4 x i8> %xx, <i8 1, i8 0, i8 1, i8 1>1518 %rev = call <4 x i8> @llvm.vector.reverse(<4 x i8> %x)1519 %r = icmp eq <4 x i8> %rev, zeroinitializer1520 ret <4 x i1> %r1521}1522 1523define i1 @vec_reverse_non_zero_demanded(<4 x i8> %xx) {1524; CHECK-LABEL: @vec_reverse_non_zero_demanded(1525; CHECK-NEXT: ret i1 false1526;1527 %x = add nuw <4 x i8> %xx, <i8 1, i8 0, i8 0, i8 0>1528 %rev = call <4 x i8> @llvm.vector.reverse(<4 x i8> %x)1529 %ele = extractelement <4 x i8> %rev, i64 31530 %r = icmp eq i8 %ele, 01531 ret i1 %r1532}1533 1534define i1 @vec_reverse_non_zero_demanded_fail(<4 x i8> %xx) {1535; CHECK-LABEL: @vec_reverse_non_zero_demanded_fail(1536; CHECK-NEXT: [[X:%.*]] = add nuw <4 x i8> [[XX:%.*]], <i8 1, i8 0, i8 0, i8 0>1537; CHECK-NEXT: [[REV:%.*]] = call <4 x i8> @llvm.vector.reverse.v4i8(<4 x i8> [[X]])1538; CHECK-NEXT: [[ELE:%.*]] = extractelement <4 x i8> [[REV]], i64 21539; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[ELE]], 01540; CHECK-NEXT: ret i1 [[R]]1541;1542 %x = add nuw <4 x i8> %xx, <i8 1, i8 0, i8 0, i8 0>1543 %rev = call <4 x i8> @llvm.vector.reverse(<4 x i8> %x)1544 %ele = extractelement <4 x i8> %rev, i64 21545 %r = icmp eq i8 %ele, 01546 ret i1 %r1547}1548 1549declare i32 @llvm.experimental.get.vector.length.i32(i32, i32, i1)1550