1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4declare i16 @llvm.bswap.i16(i16) 5declare i32 @llvm.bswap.i32(i32) 6declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) 7declare i32 @llvm.cttz.i32(i32, i1) 8declare i33 @llvm.cttz.i33(i33, i1) 9declare i32 @llvm.ctlz.i32(i32, i1) 10declare i8 @llvm.umax.i8(i8, i8) 11declare i8 @llvm.uadd.sat.i8(i8, i8) 12declare i8 @llvm.ssub.sat.i8(i8, i8) 13declare i33 @llvm.ctlz.i33(i33, i1) 14declare i8 @llvm.ctpop.i8(i8) 15declare i11 @llvm.ctpop.i11(i11) 16declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1) 17declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1) 18declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>) 19declare i8 @llvm.bitreverse.i8(i8) 20declare <2 x i8> @llvm.bitreverse.v2i8(<2 x i8>) 21declare void @use6(i6) 22declare void @use8(i8) 23 24define i1 @bswap_eq_i16(i16 %x) { 25; CHECK-LABEL: @bswap_eq_i16( 26; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[X:%.*]], 256 27; CHECK-NEXT: ret i1 [[CMP]] 28; 29 %bs = call i16 @llvm.bswap.i16(i16 %x) 30 %cmp = icmp eq i16 %bs, 1 31 ret i1 %cmp 32} 33 34define i1 @bswap_ne_i32(i32 %x) { 35; CHECK-LABEL: @bswap_ne_i32( 36; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 33554432 37; CHECK-NEXT: ret i1 [[CMP]] 38; 39 %bs = tail call i32 @llvm.bswap.i32(i32 %x) 40 %cmp = icmp ne i32 %bs, 2 41 ret i1 %cmp 42} 43 44define <2 x i1> @bswap_eq_v2i64(<2 x i64> %x) { 45; CHECK-LABEL: @bswap_eq_v2i64( 46; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i64> [[X:%.*]], splat (i64 216172782113783808) 47; CHECK-NEXT: ret <2 x i1> [[CMP]] 48; 49 %bs = tail call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %x) 50 %cmp = icmp eq <2 x i64> %bs, <i64 3, i64 3> 51 ret <2 x i1> %cmp 52} 53 54define i1 @ctlz_eq_bitwidth_i32(i32 %x) { 55; CHECK-LABEL: @ctlz_eq_bitwidth_i32( 56; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0 57; CHECK-NEXT: ret i1 [[CMP]] 58; 59 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 60 %cmp = icmp eq i32 %lz, 32 61 ret i1 %cmp 62} 63 64define i1 @ctlz_eq_zero_i32(i32 %x) { 65; CHECK-LABEL: @ctlz_eq_zero_i32( 66; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0 67; CHECK-NEXT: ret i1 [[CMP]] 68; 69 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 70 %cmp = icmp eq i32 %lz, 0 71 ret i1 %cmp 72} 73 74define <2 x i1> @ctlz_ne_zero_v2i32(<2 x i32> %a) { 75; CHECK-LABEL: @ctlz_ne_zero_v2i32( 76; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[A:%.*]], splat (i32 -1) 77; CHECK-NEXT: ret <2 x i1> [[CMP]] 78; 79 %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) 80 %cmp = icmp ne <2 x i32> %x, zeroinitializer 81 ret <2 x i1> %cmp 82} 83 84define i1 @ctlz_eq_bw_minus_1_i32(i32 %x) { 85; CHECK-LABEL: @ctlz_eq_bw_minus_1_i32( 86; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 1 87; CHECK-NEXT: ret i1 [[CMP]] 88; 89 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 90 %cmp = icmp eq i32 %lz, 31 91 ret i1 %cmp 92} 93 94define <2 x i1> @ctlz_ne_bw_minus_1_v2i32(<2 x i32> %a) { 95; CHECK-LABEL: @ctlz_ne_bw_minus_1_v2i32( 96; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], splat (i32 1) 97; CHECK-NEXT: ret <2 x i1> [[CMP]] 98; 99 %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) 100 %cmp = icmp ne <2 x i32> %x, <i32 31, i32 31> 101 ret <2 x i1> %cmp 102} 103 104define i1 @ctlz_eq_other_i32(i32 %x) { 105; CHECK-LABEL: @ctlz_eq_other_i32( 106; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -128 107; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[TMP1]], 128 108; CHECK-NEXT: ret i1 [[CMP]] 109; 110 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 111 %cmp = icmp eq i32 %lz, 24 112 ret i1 %cmp 113} 114 115define <2 x i1> @ctlz_ne_other_v2i32(<2 x i32> %a) { 116; CHECK-LABEL: @ctlz_ne_other_v2i32( 117; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 -128) 118; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], splat (i32 128) 119; CHECK-NEXT: ret <2 x i1> [[CMP]] 120; 121 %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) 122 %cmp = icmp ne <2 x i32> %x, <i32 24, i32 24> 123 ret <2 x i1> %cmp 124} 125 126define i1 @ctlz_eq_other_i32_multiuse(i32 %x, ptr %p) { 127; CHECK-LABEL: @ctlz_eq_other_i32_multiuse( 128; CHECK-NEXT: [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false) 129; CHECK-NEXT: store i32 [[LZ]], ptr [[P:%.*]], align 4 130; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[LZ]], 24 131; CHECK-NEXT: ret i1 [[CMP]] 132; 133 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 134 store i32 %lz, ptr %p 135 %cmp = icmp eq i32 %lz, 24 136 ret i1 %cmp 137} 138 139define <2 x i1> @ctlz_ne_bitwidth_v2i32(<2 x i32> %a) { 140; CHECK-LABEL: @ctlz_ne_bitwidth_v2i32( 141; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer 142; CHECK-NEXT: ret <2 x i1> [[CMP]] 143; 144 %x = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false) 145 %cmp = icmp ne <2 x i32> %x, <i32 32, i32 32> 146 ret <2 x i1> %cmp 147} 148 149define i1 @ctlz_ugt_zero_i32(i32 %x) { 150; CHECK-LABEL: @ctlz_ugt_zero_i32( 151; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1 152; CHECK-NEXT: ret i1 [[CMP]] 153; 154 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 155 %cmp = icmp ugt i32 %lz, 0 156 ret i1 %cmp 157} 158 159define i1 @ctlz_ugt_one_i32(i32 %x) { 160; CHECK-LABEL: @ctlz_ugt_one_i32( 161; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 1073741824 162; CHECK-NEXT: ret i1 [[CMP]] 163; 164 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 165 %cmp = icmp ugt i32 %lz, 1 166 ret i1 %cmp 167} 168 169define i1 @ctlz_ugt_other_i32(i32 %x) { 170; CHECK-LABEL: @ctlz_ugt_other_i32( 171; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 32768 172; CHECK-NEXT: ret i1 [[CMP]] 173; 174 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 175 %cmp = icmp ugt i32 %lz, 16 176 ret i1 %cmp 177} 178 179define i1 @ctlz_ugt_other_multiuse_i32(i32 %x, ptr %p) { 180; CHECK-LABEL: @ctlz_ugt_other_multiuse_i32( 181; CHECK-NEXT: [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false) 182; CHECK-NEXT: store i32 [[LZ]], ptr [[P:%.*]], align 4 183; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X]], 32768 184; CHECK-NEXT: ret i1 [[CMP]] 185; 186 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 187 store i32 %lz, ptr %p 188 %cmp = icmp ugt i32 %lz, 16 189 ret i1 %cmp 190} 191 192define i1 @ctlz_ugt_bw_minus_one_i32(i32 %x) { 193; CHECK-LABEL: @ctlz_ugt_bw_minus_one_i32( 194; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0 195; CHECK-NEXT: ret i1 [[CMP]] 196; 197 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 198 %cmp = icmp ugt i32 %lz, 31 199 ret i1 %cmp 200} 201 202define <2 x i1> @ctlz_ult_one_v2i32(<2 x i32> %x) { 203; CHECK-LABEL: @ctlz_ult_one_v2i32( 204; CHECK-NEXT: [[CMP:%.*]] = icmp slt <2 x i32> [[X:%.*]], zeroinitializer 205; CHECK-NEXT: ret <2 x i1> [[CMP]] 206; 207 %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) 208 %cmp = icmp ult <2 x i32> %lz, <i32 1, i32 1> 209 ret <2 x i1> %cmp 210} 211 212define <2 x i1> @ctlz_ult_other_v2i32(<2 x i32> %x) { 213; CHECK-LABEL: @ctlz_ult_other_v2i32( 214; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[X:%.*]], splat (i32 65535) 215; CHECK-NEXT: ret <2 x i1> [[CMP]] 216; 217 %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) 218 %cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16> 219 ret <2 x i1> %cmp 220} 221 222define <2 x i1> @ctlz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) { 223; CHECK-LABEL: @ctlz_ult_other_multiuse_v2i32( 224; CHECK-NEXT: [[LZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.ctlz.v2i32(<2 x i32> [[X:%.*]], i1 false) 225; CHECK-NEXT: store <2 x i32> [[LZ]], ptr [[P:%.*]], align 8 226; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[X]], splat (i32 65535) 227; CHECK-NEXT: ret <2 x i1> [[CMP]] 228; 229 %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) 230 store <2 x i32> %lz, ptr %p 231 %cmp = icmp ult <2 x i32> %lz, <i32 16, i32 16> 232 ret <2 x i1> %cmp 233} 234 235define <2 x i1> @ctlz_ult_bw_minus_one_v2i32(<2 x i32> %x) { 236; CHECK-LABEL: @ctlz_ult_bw_minus_one_v2i32( 237; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[X:%.*]], splat (i32 1) 238; CHECK-NEXT: ret <2 x i1> [[CMP]] 239; 240 %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) 241 %cmp = icmp ult <2 x i32> %lz, <i32 31, i32 31> 242 ret <2 x i1> %cmp 243} 244 245define <2 x i1> @ctlz_ult_bitwidth_v2i32(<2 x i32> %x) { 246; CHECK-LABEL: @ctlz_ult_bitwidth_v2i32( 247; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer 248; CHECK-NEXT: ret <2 x i1> [[CMP]] 249; 250 %lz = tail call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %x, i1 false) 251 %cmp = icmp ult <2 x i32> %lz, <i32 32, i32 32> 252 ret <2 x i1> %cmp 253} 254 255define i1 @cttz_ne_bitwidth_i33(i33 %x) { 256; CHECK-LABEL: @cttz_ne_bitwidth_i33( 257; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[X:%.*]], 0 258; CHECK-NEXT: ret i1 [[CMP]] 259; 260 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 261 %cmp = icmp ne i33 %tz, 33 262 ret i1 %cmp 263} 264 265define <2 x i1> @cttz_eq_bitwidth_v2i32(<2 x i32> %a) { 266; CHECK-LABEL: @cttz_eq_bitwidth_v2i32( 267; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer 268; CHECK-NEXT: ret <2 x i1> [[CMP]] 269; 270 %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false) 271 %cmp = icmp eq <2 x i32> %x, <i32 32, i32 32> 272 ret <2 x i1> %cmp 273} 274 275define i1 @cttz_eq_zero_i33(i33 %x) { 276; CHECK-LABEL: @cttz_eq_zero_i33( 277; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1 278; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0 279; CHECK-NEXT: ret i1 [[CMP]] 280; 281 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 282 %cmp = icmp eq i33 %tz, 0 283 ret i1 %cmp 284} 285 286define <2 x i1> @cttz_ne_zero_v2i32(<2 x i32> %a) { 287; CHECK-LABEL: @cttz_ne_zero_v2i32( 288; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 1) 289; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[TMP1]], zeroinitializer 290; CHECK-NEXT: ret <2 x i1> [[CMP]] 291; 292 %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false) 293 %cmp = icmp ne <2 x i32> %x, zeroinitializer 294 ret <2 x i1> %cmp 295} 296 297define i1 @cttz_eq_bw_minus_1_i33(i33 %x) { 298; CHECK-LABEL: @cttz_eq_bw_minus_1_i33( 299; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[X:%.*]], -4294967296 300; CHECK-NEXT: ret i1 [[CMP]] 301; 302 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 303 %cmp = icmp eq i33 %tz, 32 304 ret i1 %cmp 305} 306 307define <2 x i1> @cttz_ne_bw_minus_1_v2i32(<2 x i32> %a) { 308; CHECK-LABEL: @cttz_ne_bw_minus_1_v2i32( 309; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[A:%.*]], splat (i32 -2147483648) 310; CHECK-NEXT: ret <2 x i1> [[CMP]] 311; 312 %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false) 313 %cmp = icmp ne <2 x i32> %x, <i32 31, i32 31> 314 ret <2 x i1> %cmp 315} 316 317define i1 @cttz_eq_other_i33(i33 %x) { 318; CHECK-LABEL: @cttz_eq_other_i33( 319; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 31 320; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 16 321; CHECK-NEXT: ret i1 [[CMP]] 322; 323 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 324 %cmp = icmp eq i33 %tz, 4 325 ret i1 %cmp 326} 327 328define <2 x i1> @cttz_ne_other_v2i32(<2 x i32> %a) { 329; CHECK-LABEL: @cttz_ne_other_v2i32( 330; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], splat (i32 31) 331; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], splat (i32 16) 332; CHECK-NEXT: ret <2 x i1> [[CMP]] 333; 334 %x = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false) 335 %cmp = icmp ne <2 x i32> %x, <i32 4, i32 4> 336 ret <2 x i1> %cmp 337} 338 339define i1 @cttz_eq_other_i33_multiuse(i33 %x, ptr %p) { 340; CHECK-LABEL: @cttz_eq_other_i33_multiuse( 341; CHECK-NEXT: [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false) 342; CHECK-NEXT: store i33 [[TZ]], ptr [[P:%.*]], align 4 343; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TZ]], 4 344; CHECK-NEXT: ret i1 [[CMP]] 345; 346 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 347 store i33 %tz, ptr %p 348 %cmp = icmp eq i33 %tz, 4 349 ret i1 %cmp 350} 351 352define i1 @cttz_ugt_zero_i33(i33 %x) { 353; CHECK-LABEL: @cttz_ugt_zero_i33( 354; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 1 355; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0 356; CHECK-NEXT: ret i1 [[CMP]] 357; 358 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 359 %cmp = icmp ugt i33 %tz, 0 360 ret i1 %cmp 361} 362 363define i1 @cttz_ugt_one_i33(i33 %x) { 364; CHECK-LABEL: @cttz_ugt_one_i33( 365; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 3 366; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0 367; CHECK-NEXT: ret i1 [[CMP]] 368; 369 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 370 %cmp = icmp ugt i33 %tz, 1 371 ret i1 %cmp 372} 373 374define i1 @cttz_ugt_other_i33(i33 %x) { 375; CHECK-LABEL: @cttz_ugt_other_i33( 376; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 131071 377; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0 378; CHECK-NEXT: ret i1 [[CMP]] 379; 380 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 381 %cmp = icmp ugt i33 %tz, 16 382 ret i1 %cmp 383} 384 385define i1 @cttz_ugt_other_multiuse_i33(i33 %x, ptr %p) { 386; CHECK-LABEL: @cttz_ugt_other_multiuse_i33( 387; CHECK-NEXT: [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false) 388; CHECK-NEXT: store i33 [[TZ]], ptr [[P:%.*]], align 4 389; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i33 [[TZ]], 16 390; CHECK-NEXT: ret i1 [[CMP]] 391; 392 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 393 store i33 %tz, ptr %p 394 %cmp = icmp ugt i33 %tz, 16 395 ret i1 %cmp 396} 397 398define i1 @cttz_ugt_bw_minus_one_i33(i33 %x) { 399; CHECK-LABEL: @cttz_ugt_bw_minus_one_i33( 400; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[X:%.*]], 0 401; CHECK-NEXT: ret i1 [[CMP]] 402; 403 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 404 %cmp = icmp ugt i33 %tz, 32 405 ret i1 %cmp 406} 407 408define <2 x i1> @cttz_ult_one_v2i32(<2 x i32> %x) { 409; CHECK-LABEL: @cttz_ult_one_v2i32( 410; CHECK-NEXT: [[CMP:%.*]] = trunc <2 x i32> [[X:%.*]] to <2 x i1> 411; CHECK-NEXT: ret <2 x i1> [[CMP]] 412; 413 %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) 414 %cmp = icmp ult <2 x i32> %tz, <i32 1, i32 1> 415 ret <2 x i1> %cmp 416} 417 418define <2 x i1> @cttz_ult_other_v2i32(<2 x i32> %x) { 419; CHECK-LABEL: @cttz_ult_other_v2i32( 420; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 65535) 421; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], zeroinitializer 422; CHECK-NEXT: ret <2 x i1> [[CMP]] 423; 424 %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) 425 %cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16> 426 ret <2 x i1> %cmp 427} 428 429define <2 x i1> @cttz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) { 430; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32( 431; CHECK-NEXT: [[TZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false) 432; CHECK-NEXT: store <2 x i32> [[TZ]], ptr [[P:%.*]], align 8 433; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult <2 x i32> [[TZ]], splat (i32 16) 434; CHECK-NEXT: ret <2 x i1> [[CMP]] 435; 436 %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) 437 store <2 x i32> %tz, ptr %p 438 %cmp = icmp ult <2 x i32> %tz, <i32 16, i32 16> 439 ret <2 x i1> %cmp 440} 441 442define <2 x i1> @cttz_ult_bw_minus_one_v2i32(<2 x i32> %x) { 443; CHECK-LABEL: @cttz_ult_bw_minus_one_v2i32( 444; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 2147483647) 445; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[TMP1]], zeroinitializer 446; CHECK-NEXT: ret <2 x i1> [[CMP]] 447; 448 %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) 449 %cmp = icmp ult <2 x i32> %tz, <i32 31, i32 31> 450 ret <2 x i1> %cmp 451} 452 453define <2 x i1> @cttz_ult_bitwidth_v2i32(<2 x i32> %x) { 454; CHECK-LABEL: @cttz_ult_bitwidth_v2i32( 455; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer 456; CHECK-NEXT: ret <2 x i1> [[CMP]] 457; 458 %tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false) 459 %cmp = icmp ult <2 x i32> %tz, <i32 32, i32 32> 460 ret <2 x i1> %cmp 461} 462 463define i1 @ctpop_eq_zero_i11(i11 %x) { 464; CHECK-LABEL: @ctpop_eq_zero_i11( 465; CHECK-NEXT: [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0 466; CHECK-NEXT: ret i1 [[CMP]] 467; 468 %pop = tail call i11 @llvm.ctpop.i11(i11 %x) 469 %cmp = icmp eq i11 %pop, 0 470 ret i1 %cmp 471} 472 473define <2 x i1> @ctpop_ne_zero_v2i32(<2 x i32> %x) { 474; CHECK-LABEL: @ctpop_ne_zero_v2i32( 475; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], zeroinitializer 476; CHECK-NEXT: ret <2 x i1> [[CMP]] 477; 478 %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x) 479 %cmp = icmp ne <2 x i32> %pop, zeroinitializer 480 ret <2 x i1> %cmp 481} 482 483define i1 @ctpop_eq_bitwidth_i8(i8 %x) { 484; CHECK-LABEL: @ctpop_eq_bitwidth_i8( 485; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1 486; CHECK-NEXT: ret i1 [[CMP]] 487; 488 %pop = tail call i8 @llvm.ctpop.i8(i8 %x) 489 %cmp = icmp eq i8 %pop, 8 490 ret i1 %cmp 491} 492 493define <2 x i1> @ctpop_ne_bitwidth_v2i32(<2 x i32> %x) { 494; CHECK-LABEL: @ctpop_ne_bitwidth_v2i32( 495; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], splat (i32 -1) 496; CHECK-NEXT: ret <2 x i1> [[CMP]] 497; 498 %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x) 499 %cmp = icmp ne <2 x i32> %pop, <i32 32, i32 32> 500 ret <2 x i1> %cmp 501} 502 503define i1 @ctpop_ugt_bitwidth_minus_one_i8(i8 %x, ptr %p) { 504; CHECK-LABEL: @ctpop_ugt_bitwidth_minus_one_i8( 505; CHECK-NEXT: [[POP:%.*]] = tail call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[X:%.*]]) 506; CHECK-NEXT: store i8 [[POP]], ptr [[P:%.*]], align 1 507; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X]], -1 508; CHECK-NEXT: ret i1 [[CMP]] 509; 510 %pop = tail call i8 @llvm.ctpop.i8(i8 %x) 511 store i8 %pop, ptr %p 512 %cmp = icmp ugt i8 %pop, 7 513 ret i1 %cmp 514} 515 516define <2 x i1> @ctpop_ult_bitwidth_v2i32(<2 x i32> %x) { 517; CHECK-LABEL: @ctpop_ult_bitwidth_v2i32( 518; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i32> [[X:%.*]], splat (i32 -1) 519; CHECK-NEXT: ret <2 x i1> [[CMP]] 520; 521 %pop = tail call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %x) 522 %cmp = icmp ult <2 x i32> %pop, <i32 32, i32 32> 523 ret <2 x i1> %cmp 524} 525 526define i1 @trunc_cttz_eq_other_i33_i15(i33 %x) { 527; CHECK-LABEL: @trunc_cttz_eq_other_i33_i15( 528; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 31 529; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 16 530; CHECK-NEXT: ret i1 [[CMP]] 531; 532 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 533 %trunc = trunc i33 %tz to i15 534 %cmp = icmp eq i15 %trunc, 4 535 ret i1 %cmp 536} 537 538define i1 @trunc_cttz_ugt_other_i33_i15(i33 %x) { 539; CHECK-LABEL: @trunc_cttz_ugt_other_i33_i15( 540; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 15 541; CHECK-NEXT: [[CMP:%.*]] = icmp eq i33 [[TMP1]], 0 542; CHECK-NEXT: ret i1 [[CMP]] 543; 544 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 545 %trunc = trunc i33 %tz to i15 546 %cmp = icmp ugt i15 %trunc, 3 547 ret i1 %cmp 548} 549 550define i1 @trunc_cttz_ult_other_i33_i6(i33 %x) { 551; CHECK-LABEL: @trunc_cttz_ult_other_i33_i6( 552; CHECK-NEXT: [[TMP1:%.*]] = and i33 [[X:%.*]], 127 553; CHECK-NEXT: [[CMP:%.*]] = icmp ne i33 [[TMP1]], 0 554; CHECK-NEXT: ret i1 [[CMP]] 555; 556 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 true) 557 %trunc = trunc i33 %tz to i6 558 %cmp = icmp ult i6 %trunc, 7 559 ret i1 %cmp 560} 561 562; negative case: log2(33 - is_zero_poison ? 1 : 0) + 1 > 5 563 564define i1 @trunc_cttz_ult_other_i33_i5(i33 %x) { 565; CHECK-LABEL: @trunc_cttz_ult_other_i33_i5( 566; CHECK-NEXT: [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 true) 567; CHECK-NEXT: [[TRUNC:%.*]] = trunc i33 [[TZ]] to i5 568; CHECK-NEXT: [[CMP:%.*]] = icmp ult i5 [[TRUNC]], 7 569; CHECK-NEXT: ret i1 [[CMP]] 570; 571 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 true) 572 %trunc = trunc i33 %tz to i5 573 %cmp = icmp ult i5 %trunc, 7 574 ret i1 %cmp 575} 576 577define i1 @trunc_cttz_true_ult_other_i32_i5(i32 %x) { 578; CHECK-LABEL: @trunc_cttz_true_ult_other_i32_i5( 579; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 127 580; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0 581; CHECK-NEXT: ret i1 [[CMP]] 582; 583 %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 true) 584 %trunc = trunc i32 %tz to i5 585 %cmp = icmp ult i5 %trunc, 7 586 ret i1 %cmp 587} 588 589; negative case, is_zero_poison == false && log2(src bitwidth) == dest bitwidth 590 591define i1 @trunc_cttz_false_ult_other_i32_i5(i32 %x) { 592; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i5( 593; CHECK-NEXT: [[TZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false) 594; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[TZ]] to i5 595; CHECK-NEXT: [[CMP:%.*]] = icmp ult i5 [[TRUNC]], 7 596; CHECK-NEXT: ret i1 [[CMP]] 597; 598 %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 599 %trunc = trunc i32 %tz to i5 600 %cmp = icmp ult i5 %trunc, 7 601 ret i1 %cmp 602} 603 604define i1 @trunc_cttz_false_ult_other_i32_i6(i32 %x) { 605; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i6( 606; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 127 607; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[TMP1]], 0 608; CHECK-NEXT: ret i1 [[CMP]] 609; 610 %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 611 %trunc = trunc i32 %tz to i6 612 %cmp = icmp ult i6 %trunc, 7 613 ret i1 %cmp 614} 615 616; negative case, trunc is not one use 617 618define i1 @trunc_cttz_false_ult_other_i32_i6_extra_use(i32 %x) { 619; CHECK-LABEL: @trunc_cttz_false_ult_other_i32_i6_extra_use( 620; CHECK-NEXT: [[TZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 false) 621; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i32 [[TZ]] to i6 622; CHECK-NEXT: call void @use6(i6 [[TRUNC]]) 623; CHECK-NEXT: [[CMP:%.*]] = icmp ult i6 [[TRUNC]], 7 624; CHECK-NEXT: ret i1 [[CMP]] 625; 626 %tz = tail call i32 @llvm.cttz.i32(i32 %x, i1 false) 627 %trunc = trunc i32 %tz to i6 628 call void @use6(i6 %trunc) 629 %cmp = icmp ult i6 %trunc, 7 630 ret i1 %cmp 631} 632 633define i1 @trunc_ctlz_ugt_zero_i32(i32 %x) { 634; CHECK-LABEL: @trunc_ctlz_ugt_zero_i32( 635; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], -1 636; CHECK-NEXT: ret i1 [[CMP]] 637; 638 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 639 %trunc = trunc i32 %lz to i15 640 %cmp = icmp ugt i15 %trunc, 0 641 ret i1 %cmp 642} 643 644define i1 @trunc_ctlz_ugt_one_i32(i32 %x) { 645; CHECK-LABEL: @trunc_ctlz_ugt_one_i32( 646; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 1073741824 647; CHECK-NEXT: ret i1 [[CMP]] 648; 649 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 650 %trunc = trunc i32 %lz to i15 651 %cmp = icmp ugt i15 %trunc, 1 652 ret i1 %cmp 653} 654 655define i1 @trunc_ctlz_ugt_other_i33_i6(i33 %x) { 656; CHECK-LABEL: @trunc_ctlz_ugt_other_i33_i6( 657; CHECK-NEXT: [[CMP:%.*]] = icmp ult i33 [[X:%.*]], 268435456 658; CHECK-NEXT: ret i1 [[CMP]] 659; 660 %lz = tail call i33 @llvm.ctlz.i33(i33 %x, i1 true) 661 %trunc = trunc i33 %lz to i6 662 %cmp = icmp ugt i6 %trunc, 4 663 ret i1 %cmp 664} 665 666; negative case: log2(33 - is_zero_poison ? 1 : 0) + 1 > 5 667 668define i1 @trunc_ctlz_ugt_other_i33_i5(i33 %x) { 669; CHECK-LABEL: @trunc_ctlz_ugt_other_i33_i5( 670; CHECK-NEXT: [[LZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.ctlz.i33(i33 [[X:%.*]], i1 true) 671; CHECK-NEXT: [[TRUNC:%.*]] = trunc i33 [[LZ]] to i5 672; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i5 [[TRUNC]], 4 673; CHECK-NEXT: ret i1 [[CMP]] 674; 675 %lz = tail call i33 @llvm.ctlz.i33(i33 %x, i1 true) 676 %trunc = trunc i33 %lz to i5 677 %cmp = icmp ugt i5 %trunc, 4 678 ret i1 %cmp 679} 680 681define i1 @trunc_ctlz_true_ugt_other_i32_i5(i32 %x) { 682; CHECK-LABEL: @trunc_ctlz_true_ugt_other_i32_i5( 683; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 134217728 684; CHECK-NEXT: ret i1 [[CMP]] 685; 686 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 true) 687 %trunc = trunc i32 %lz to i5 688 %cmp = icmp ugt i5 %trunc, 4 689 ret i1 %cmp 690} 691 692; negative case, is_zero_poison == false && log2(src bitwidth) == dest bitwidth 693 694define i1 @trunc_ctlz_false_ugt_other_i32_i5(i32 %x) { 695; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i5( 696; CHECK-NEXT: [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false) 697; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[LZ]] to i5 698; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i5 [[TRUNC]], 4 699; CHECK-NEXT: ret i1 [[CMP]] 700; 701 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 702 %trunc = trunc i32 %lz to i5 703 %cmp = icmp ugt i5 %trunc, 4 704 ret i1 %cmp 705} 706 707define i1 @trunc_ctlz_false_ugt_other_i32_i6(i32 %x) { 708; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i6( 709; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[X:%.*]], 134217728 710; CHECK-NEXT: ret i1 [[CMP]] 711; 712 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 713 %trunc = trunc i32 %lz to i6 714 %cmp = icmp ugt i6 %trunc, 4 715 ret i1 %cmp 716} 717 718; negative case, trunc is not one use 719 720define i1 @trunc_ctlz_false_ugt_other_i32_i6_extra_use(i32 %x) { 721; CHECK-LABEL: @trunc_ctlz_false_ugt_other_i32_i6_extra_use( 722; CHECK-NEXT: [[LZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X:%.*]], i1 false) 723; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i32 [[LZ]] to i6 724; CHECK-NEXT: call void @use6(i6 [[TRUNC]]) 725; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i6 [[TRUNC]], 4 726; CHECK-NEXT: ret i1 [[CMP]] 727; 728 %lz = tail call i32 @llvm.ctlz.i32(i32 %x, i1 false) 729 %trunc = trunc i32 %lz to i6 730 call void @use6(i6 %trunc) 731 %cmp = icmp ugt i6 %trunc, 4 732 ret i1 %cmp 733} 734 735define i1 @trunc_ctpop_eq_zero_i11(i11 %x) { 736; CHECK-LABEL: @trunc_ctpop_eq_zero_i11( 737; CHECK-NEXT: [[CMP:%.*]] = icmp eq i11 [[X:%.*]], 0 738; CHECK-NEXT: ret i1 [[CMP]] 739; 740 %pop = tail call i11 @llvm.ctpop.i11(i11 %x) 741 %trunc = trunc i11 %pop to i5 742 %cmp = icmp eq i5 %trunc, 0 743 ret i1 %cmp 744} 745 746define i1 @trunc_ctpop_eq_bitwidth_i8(i8 %x) { 747; CHECK-LABEL: @trunc_ctpop_eq_bitwidth_i8( 748; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], -1 749; CHECK-NEXT: ret i1 [[CMP]] 750; 751 %pop = tail call i8 @llvm.ctpop.i8(i8 %x) 752 %trunc = trunc i8 %pop to i5 753 %cmp = icmp eq i5 %trunc, 8 754 ret i1 %cmp 755} 756 757; negative case: log2(33) + 1 > 4 758 759define i1 @trunc_negative_destbits_not_enough(i33 %x) { 760; CHECK-LABEL: @trunc_negative_destbits_not_enough( 761; CHECK-NEXT: [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false) 762; CHECK-NEXT: [[TRUNC:%.*]] = trunc i33 [[TZ]] to i4 763; CHECK-NEXT: [[CMP:%.*]] = icmp ult i4 [[TRUNC]], 7 764; CHECK-NEXT: ret i1 [[CMP]] 765; 766 %tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false) 767 %trunc = trunc i33 %tz to i4 768 %cmp = icmp ult i4 %trunc, 7 769 ret i1 %cmp 770} 771 772define i1 @bitreverse_ne_22(i8 %x) { 773; CHECK-LABEL: @bitreverse_ne_22( 774; CHECK-NEXT: [[Z:%.*]] = icmp ne i8 [[X:%.*]], 104 775; CHECK-NEXT: ret i1 [[Z]] 776; 777 %y = call i8 @llvm.bitreverse.i8(i8 %x) 778 %z = icmp ne i8 %y, 22 779 ret i1 %z 780} 781 782define i1 @bitreverse_ult_22_fail_not_equality_pred(i8 %x) { 783; CHECK-LABEL: @bitreverse_ult_22_fail_not_equality_pred( 784; CHECK-NEXT: [[Y:%.*]] = call i8 @llvm.bitreverse.i8(i8 [[X:%.*]]) 785; CHECK-NEXT: [[Z:%.*]] = icmp ult i8 [[Y]], 22 786; CHECK-NEXT: ret i1 [[Z]] 787; 788 %y = call i8 @llvm.bitreverse.i8(i8 %x) 789 %z = icmp ult i8 %y, 22 790 ret i1 %z 791} 792 793define <2 x i1> @bitreverse_vec_eq_2_2(<2 x i8> %x) { 794; CHECK-LABEL: @bitreverse_vec_eq_2_2( 795; CHECK-NEXT: [[Z:%.*]] = icmp eq <2 x i8> [[X:%.*]], splat (i8 64) 796; CHECK-NEXT: ret <2 x i1> [[Z]] 797; 798 %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x) 799 %z = icmp eq <2 x i8> %y, <i8 2, i8 2> 800 ret <2 x i1> %z 801} 802 803define <2 x i1> @bitreverse_vec_eq_1_2_todo_no_splat(<2 x i8> %x) { 804; CHECK-LABEL: @bitreverse_vec_eq_1_2_todo_no_splat( 805; CHECK-NEXT: [[Y:%.*]] = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> [[X:%.*]]) 806; CHECK-NEXT: [[Z:%.*]] = icmp eq <2 x i8> [[Y]], <i8 1, i8 2> 807; CHECK-NEXT: ret <2 x i1> [[Z]] 808; 809 %y = call <2 x i8> @llvm.bitreverse.v2i8(<2 x i8> %x) 810 %z = icmp eq <2 x i8> %y, <i8 1, i8 2> 811 ret <2 x i1> %z 812} 813 814define i1 @umax_eq_zero(i8 %x, i8 %y) { 815; CHECK-LABEL: @umax_eq_zero( 816; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]] 817; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[TMP1]], 0 818; CHECK-NEXT: ret i1 [[R]] 819; 820 %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) 821 %r = icmp eq i8 %m, 0 822 ret i1 %r 823} 824 825define i1 @umax_eq_1_fail(i8 %x, i8 %y) { 826; CHECK-LABEL: @umax_eq_1_fail( 827; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 828; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[M]], 1 829; CHECK-NEXT: ret i1 [[R]] 830; 831 %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) 832 %r = icmp eq i8 %m, 1 833 ret i1 %r 834} 835 836define i1 @umax_sle_zero_fail(i8 %x, i8 %y) { 837; CHECK-LABEL: @umax_sle_zero_fail( 838; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 839; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[M]], 1 840; CHECK-NEXT: ret i1 [[R]] 841; 842 %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) 843 %r = icmp sle i8 %m, 0 844 ret i1 %r 845} 846 847define i1 @umax_ne_zero(i8 %x, i8 %y) { 848; CHECK-LABEL: @umax_ne_zero( 849; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[X:%.*]], [[Y:%.*]] 850; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[TMP1]], 0 851; CHECK-NEXT: ret i1 [[R]] 852; 853 %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) 854 %r = icmp ne i8 %m, 0 855 ret i1 %r 856} 857 858define i1 @umax_ne_zero_fail_multiuse(i8 %x, i8 %y) { 859; CHECK-LABEL: @umax_ne_zero_fail_multiuse( 860; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 861; CHECK-NEXT: call void @use8(i8 [[M]]) 862; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[M]], 0 863; CHECK-NEXT: ret i1 [[R]] 864; 865 %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) 866 call void @use8(i8 %m) 867 %r = icmp ne i8 %m, 0 868 ret i1 %r 869} 870 871 872define i1 @uadd_sat_ne_zero_fail_multiuse(i8 %x, i8 %y) { 873; CHECK-LABEL: @uadd_sat_ne_zero_fail_multiuse( 874; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 875; CHECK-NEXT: call void @use8(i8 [[M]]) 876; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[M]], 0 877; CHECK-NEXT: ret i1 [[R]] 878; 879 %m = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y) 880 call void @use8(i8 %m) 881 %r = icmp ne i8 %m, 0 882 ret i1 %r 883} 884 885 886define i1 @ssub_sat_ne_zero(i8 %x, i8 %y) { 887; CHECK-LABEL: @ssub_sat_ne_zero( 888; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] 889; CHECK-NEXT: ret i1 [[R]] 890; 891 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 892 %r = icmp ne i8 %m, 0 893 ret i1 %r 894} 895 896define i1 @ssub_sat_ne_fail_nonzero(i8 %x, i8 %y) { 897; CHECK-LABEL: @ssub_sat_ne_fail_nonzero( 898; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 899; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[M]], 4 900; CHECK-NEXT: ret i1 [[R]] 901; 902 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 903 %r = icmp ne i8 %m, 4 904 ret i1 %r 905} 906 907define i1 @ssub_sat_eq_zero(i8 %x, i8 %y) { 908; CHECK-LABEL: @ssub_sat_eq_zero( 909; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] 910; CHECK-NEXT: ret i1 [[R]] 911; 912 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 913 %r = icmp eq i8 %m, 0 914 ret i1 %r 915} 916 917define i1 @ssub_sat_sle_zero(i8 %x, i8 %y) { 918; CHECK-LABEL: @ssub_sat_sle_zero( 919; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] 920; CHECK-NEXT: ret i1 [[R]] 921; 922 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 923 %r = icmp sle i8 %m, 0 924 ret i1 %r 925} 926 927define i1 @ssub_sat_sge_zero(i8 %x, i8 %y) { 928; CHECK-LABEL: @ssub_sat_sge_zero( 929; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] 930; CHECK-NEXT: ret i1 [[R]] 931; 932 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 933 %r = icmp sge i8 %m, 0 934 ret i1 %r 935} 936 937define i1 @ssub_sat_slt_zero(i8 %x, i8 %y) { 938; CHECK-LABEL: @ssub_sat_slt_zero( 939; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] 940; CHECK-NEXT: ret i1 [[R]] 941; 942 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 943 %r = icmp slt i8 %m, 0 944 ret i1 %r 945} 946 947define i1 @ssub_sat_slt_neg1_fail(i8 %x, i8 %y) { 948; CHECK-LABEL: @ssub_sat_slt_neg1_fail( 949; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 950; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[M]], -1 951; CHECK-NEXT: ret i1 [[R]] 952; 953 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 954 %r = icmp slt i8 %m, -1 955 ret i1 %r 956} 957 958define i1 @ssub_sat_sgt_zero(i8 %x, i8 %y) { 959; CHECK-LABEL: @ssub_sat_sgt_zero( 960; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] 961; CHECK-NEXT: ret i1 [[R]] 962; 963 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 964 %r = icmp sgt i8 %m, 0 965 ret i1 %r 966} 967 968define i1 @ssub_sat_sgt_one_fail(i8 %x, i8 %y) { 969; CHECK-LABEL: @ssub_sat_sgt_one_fail( 970; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[X:%.*]], i8 [[Y:%.*]]) 971; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[M]], 1 972; CHECK-NEXT: ret i1 [[R]] 973; 974 %m = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) 975 %r = icmp sgt i8 %m, 1 976 ret i1 %r 977} 978