1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4declare void @use(i8) 5 6define i1 @set_low_bit_mask_eq(i8 %x) { 7; CHECK-LABEL: @set_low_bit_mask_eq( 8; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -2 9; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 18 10; CHECK-NEXT: ret i1 [[CMP]] 11; 12 %sub = or i8 %x, 1 13 %cmp = icmp eq i8 %sub, 19 14 ret i1 %cmp 15} 16 17define <2 x i1> @set_low_bit_mask_ne(<2 x i8> %x) { 18; CHECK-LABEL: @set_low_bit_mask_ne( 19; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], splat (i8 -4) 20; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[TMP1]], splat (i8 16) 21; CHECK-NEXT: ret <2 x i1> [[CMP]] 22; 23 %sub = or <2 x i8> %x, <i8 3, i8 3> 24 %cmp = icmp ne <2 x i8> %sub, <i8 19, i8 19> 25 ret <2 x i1> %cmp 26} 27 28define i1 @set_low_bit_mask_ugt(i8 %x) { 29; CHECK-LABEL: @set_low_bit_mask_ugt( 30; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 19 31; CHECK-NEXT: ret i1 [[CMP]] 32; 33 %sub = or i8 %x, 3 34 %cmp = icmp ugt i8 %sub, 19 35 ret i1 %cmp 36} 37 38define i1 @set_low_bit_mask_ult(i8 %x) { 39; CHECK-LABEL: @set_low_bit_mask_ult( 40; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 3 41; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[SUB]], 19 42; CHECK-NEXT: ret i1 [[CMP]] 43; 44 %sub = or i8 %x, 3 45 %cmp = icmp ult i8 %sub, 19 46 ret i1 %cmp 47} 48 49define i1 @set_low_bit_mask_uge(i8 %x) { 50; CHECK-LABEL: @set_low_bit_mask_uge( 51; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 19 52; CHECK-NEXT: ret i1 [[CMP]] 53; 54 %sub = or i8 %x, 3 55 %cmp = icmp uge i8 %sub, 20 56 ret i1 %cmp 57} 58 59define i1 @set_low_bit_mask_ule(i8 %x) { 60; CHECK-LABEL: @set_low_bit_mask_ule( 61; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 3 62; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[SUB]], 19 63; CHECK-NEXT: ret i1 [[CMP]] 64; 65 %sub = or i8 %x, 3 66 %cmp = icmp ule i8 %sub, 18 67 ret i1 %cmp 68} 69 70define i1 @set_low_bit_mask_sgt(i8 %x) { 71; CHECK-LABEL: @set_low_bit_mask_sgt( 72; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 3 73; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[SUB]], 20 74; CHECK-NEXT: ret i1 [[CMP]] 75; 76 %sub = or i8 %x, 3 77 %cmp = icmp sgt i8 %sub, 20 78 ret i1 %cmp 79} 80 81define i1 @set_low_bit_mask_slt(i8 %x) { 82; CHECK-LABEL: @set_low_bit_mask_slt( 83; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 15 84; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], 19 85; CHECK-NEXT: ret i1 [[CMP]] 86; 87 %sub = or i8 %x, 15 88 %cmp = icmp slt i8 %sub, 19 89 ret i1 %cmp 90} 91 92define i1 @set_low_bit_mask_sge(i8 %x) { 93; CHECK-LABEL: @set_low_bit_mask_sge( 94; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 31 95; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[SUB]], 50 96; CHECK-NEXT: ret i1 [[CMP]] 97; 98 %sub = or i8 %x, 31 99 %cmp = icmp sge i8 %sub, 51 100 ret i1 %cmp 101} 102 103define i1 @set_low_bit_mask_sle(i8 %x) { 104; CHECK-LABEL: @set_low_bit_mask_sle( 105; CHECK-NEXT: [[SUB:%.*]] = or i8 [[X:%.*]], 63 106; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SUB]], 69 107; CHECK-NEXT: ret i1 [[CMP]] 108; 109 %sub = or i8 %x, 63 110 %cmp = icmp sle i8 %sub, 68 111 ret i1 %cmp 112} 113 114define i1 @eq_const_mask(i8 %x, i8 %y) { 115; CHECK-LABEL: @eq_const_mask( 116; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X:%.*]], [[Y:%.*]] 117; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], -43 118; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP2]], 0 119; CHECK-NEXT: ret i1 [[CMP]] 120; 121 %b0 = or i8 %x, 42 122 %b1 = or i8 %y, 42 123 %cmp = icmp eq i8 %b0, %b1 124 ret i1 %cmp 125} 126 127define <2 x i1> @ne_const_mask(<2 x i8> %x, <2 x i8> %y) { 128; CHECK-LABEL: @ne_const_mask( 129; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[X:%.*]], [[Y:%.*]] 130; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i8> [[TMP1]], <i8 105, i8 -6> 131; CHECK-NEXT: [[CMP:%.*]] = icmp ne <2 x i8> [[TMP2]], zeroinitializer 132; CHECK-NEXT: ret <2 x i1> [[CMP]] 133; 134 %b0 = or <2 x i8> %x, <i8 150, i8 5> 135 %b1 = or <2 x i8> %y, <i8 150, i8 5> 136 %cmp = icmp ne <2 x i8> %b0, %b1 137 ret <2 x i1> %cmp 138} 139 140; negative test - predicate 141 142define i1 @eq_const_mask_not_equality(i8 %x, i8 %y) { 143; CHECK-LABEL: @eq_const_mask_not_equality( 144; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5 145; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 5 146; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[B0]], [[B1]] 147; CHECK-NEXT: ret i1 [[CMP]] 148; 149 %b0 = or i8 %x, 5 150 %b1 = or i8 %y, 5 151 %cmp = icmp sgt i8 %b0, %b1 152 ret i1 %cmp 153} 154 155; negative test - mismatched constants 156 157define i1 @eq_const_mask_not_same(i8 %x, i8 %y) { 158; CHECK-LABEL: @eq_const_mask_not_same( 159; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5 160; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 6 161; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B0]], [[B1]] 162; CHECK-NEXT: ret i1 [[CMP]] 163; 164 %b0 = or i8 %x, 5 165 %b1 = or i8 %y, 6 166 %cmp = icmp eq i8 %b0, %b1 167 ret i1 %cmp 168} 169 170; negative test - mismatched logic 171 172define i1 @eq_const_mask_wrong_opcode(i8 %x, i8 %y) { 173; CHECK-LABEL: @eq_const_mask_wrong_opcode( 174; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5 175; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[Y:%.*]], [[B0]] 176; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 5 177; CHECK-NEXT: ret i1 [[CMP]] 178; 179 %b0 = or i8 %x, 5 180 %b1 = xor i8 %y, 5 181 %cmp = icmp eq i8 %b0, %b1 182 ret i1 %cmp 183} 184 185; negative test - no extra uses 186 187define i1 @eq_const_mask_use1(i8 %x, i8 %y) { 188; CHECK-LABEL: @eq_const_mask_use1( 189; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5 190; CHECK-NEXT: call void @use(i8 [[B0]]) 191; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 5 192; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B0]], [[B1]] 193; CHECK-NEXT: ret i1 [[CMP]] 194; 195 %b0 = or i8 %x, 5 196 call void @use(i8 %b0) 197 %b1 = or i8 %y, 5 198 %cmp = icmp eq i8 %b0, %b1 199 ret i1 %cmp 200} 201 202; negative test - no extra uses 203 204define i1 @eq_const_mask_use2(i8 %x, i8 %y) { 205; CHECK-LABEL: @eq_const_mask_use2( 206; CHECK-NEXT: [[B0:%.*]] = or i8 [[X:%.*]], 5 207; CHECK-NEXT: [[B1:%.*]] = or i8 [[Y:%.*]], 5 208; CHECK-NEXT: call void @use(i8 [[B1]]) 209; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[B0]], [[B1]] 210; CHECK-NEXT: ret i1 [[CMP]] 211; 212 %b0 = or i8 %x, 5 213 %b1 = or i8 %y, 5 214 call void @use(i8 %b1) 215 %cmp = icmp eq i8 %b0, %b1 216 ret i1 %cmp 217} 218 219; (x | (x - 1)) s< 0 220 221define <2 x i1> @decrement_slt_0(<2 x i8> %x) { 222; CHECK-LABEL: @decrement_slt_0( 223; CHECK-NEXT: [[R:%.*]] = icmp slt <2 x i8> [[X:%.*]], splat (i8 1) 224; CHECK-NEXT: ret <2 x i1> [[R]] 225; 226 %dec = add <2 x i8> %x, <i8 -1, i8 -1> 227 %or = or <2 x i8> %dec, %x 228 %r = icmp slt <2 x i8> %or, zeroinitializer 229 ret <2 x i1> %r 230} 231 232define i1 @decrement_slt_0_commute_use1(i8 %px) { 233; CHECK-LABEL: @decrement_slt_0_commute_use1( 234; CHECK-NEXT: [[X:%.*]] = mul i8 [[PX:%.*]], 42 235; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X]], -1 236; CHECK-NEXT: call void @use(i8 [[DEC]]) 237; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X]], 1 238; CHECK-NEXT: ret i1 [[R]] 239; 240 %x = mul i8 %px, 42 ; thwart complexity-based canonicalization 241 %dec = add i8 %x, -1 242 call void @use(i8 %dec) 243 %or = or i8 %x, %dec 244 %r = icmp slt i8 %or, 0 245 ret i1 %r 246} 247 248define i1 @decrement_slt_0_use2(i8 %x) { 249; CHECK-LABEL: @decrement_slt_0_use2( 250; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1 251; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]] 252; CHECK-NEXT: call void @use(i8 [[OR]]) 253; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X]], 1 254; CHECK-NEXT: ret i1 [[R]] 255; 256 %dec = add i8 %x, -1 257 %or = or i8 %dec, %x 258 call void @use(i8 %or) 259 %r = icmp slt i8 %or, 0 260 ret i1 %r 261} 262 263; negative test - wrong cmp constant 264 265define i1 @decrement_slt_n1(i8 %x) { 266; CHECK-LABEL: @decrement_slt_n1( 267; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1 268; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]] 269; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[OR]], -1 270; CHECK-NEXT: ret i1 [[R]] 271; 272 %dec = add i8 %x, -1 273 %or = or i8 %dec, %x 274 %r = icmp slt i8 %or, -1 275 ret i1 %r 276} 277 278; negative test - wrong add constant 279 280define i1 @not_decrement_slt_0(i8 %x) { 281; CHECK-LABEL: @not_decrement_slt_0( 282; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -2 283; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]] 284; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[OR]], 0 285; CHECK-NEXT: ret i1 [[R]] 286; 287 %dec = add i8 %x, -2 288 %or = or i8 %dec, %x 289 %r = icmp slt i8 %or, 0 290 ret i1 %r 291} 292 293; (x | (x - 1)) s> -1 294 295define <2 x i1> @decrement_sgt_n1(<2 x i8> %x) { 296; CHECK-LABEL: @decrement_sgt_n1( 297; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[X:%.*]], zeroinitializer 298; CHECK-NEXT: ret <2 x i1> [[R]] 299; 300 %dec = add <2 x i8> %x, <i8 -1, i8 -1> 301 %or = or <2 x i8> %dec, %x 302 %r = icmp sgt <2 x i8> %or, <i8 -1, i8 -1> 303 ret <2 x i1> %r 304} 305 306define i1 @decrement_sgt_n1_commute_use1(i8 %px) { 307; CHECK-LABEL: @decrement_sgt_n1_commute_use1( 308; CHECK-NEXT: [[X:%.*]] = mul i8 [[PX:%.*]], 42 309; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X]], -1 310; CHECK-NEXT: call void @use(i8 [[DEC]]) 311; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X]], 0 312; CHECK-NEXT: ret i1 [[R]] 313; 314 %x = mul i8 %px, 42 ; thwart complexity-based canonicalization 315 %dec = add i8 %x, -1 316 call void @use(i8 %dec) 317 %or = or i8 %x, %dec 318 %r = icmp sgt i8 %or, -1 319 ret i1 %r 320} 321 322define i1 @decrement_sgt_n1_use2(i8 %x) { 323; CHECK-LABEL: @decrement_sgt_n1_use2( 324; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1 325; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]] 326; CHECK-NEXT: call void @use(i8 [[OR]]) 327; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X]], 0 328; CHECK-NEXT: ret i1 [[R]] 329; 330 %dec = add i8 %x, -1 331 %or = or i8 %dec, %x 332 call void @use(i8 %or) 333 %r = icmp sgt i8 %or, -1 334 ret i1 %r 335} 336 337; negative test - wrong cmp constant 338 339define i1 @decrement_sgt_0(i8 %x) { 340; CHECK-LABEL: @decrement_sgt_0( 341; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -1 342; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]] 343; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[OR]], 0 344; CHECK-NEXT: ret i1 [[R]] 345; 346 %dec = add i8 %x, -1 347 %or = or i8 %dec, %x 348 %r = icmp sgt i8 %or, 0 349 ret i1 %r 350} 351 352; negative test - wrong add constant 353 354define i1 @not_decrement_sgt_n1(i8 %x) { 355; CHECK-LABEL: @not_decrement_sgt_n1( 356; CHECK-NEXT: [[DEC:%.*]] = add i8 [[X:%.*]], -2 357; CHECK-NEXT: [[OR:%.*]] = or i8 [[DEC]], [[X]] 358; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[OR]], -1 359; CHECK-NEXT: ret i1 [[R]] 360; 361 %dec = add i8 %x, -2 362 %or = or i8 %dec, %x 363 %r = icmp sgt i8 %or, -1 364 ret i1 %r 365} 366 367define i1 @icmp_or_xor_2_eq(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 368; CHECK-LABEL: @icmp_or_xor_2_eq( 369; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 370; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 371; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]] 372; CHECK-NEXT: ret i1 [[CMP]] 373; 374 %xor = xor i64 %x1, %y1 375 %xor1 = xor i64 %x2, %y2 376 %or = or i64 %xor, %xor1 377 %cmp = icmp eq i64 %or, 0 378 ret i1 %cmp 379} 380 381define i1 @icmp_or_xor_2_ne(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 382; CHECK-LABEL: @icmp_or_xor_2_ne( 383; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[X1:%.*]], [[Y1:%.*]] 384; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[X2:%.*]], [[Y2:%.*]] 385; CHECK-NEXT: [[CMP:%.*]] = or i1 [[TMP1]], [[TMP2]] 386; CHECK-NEXT: ret i1 [[CMP]] 387; 388 %xor = xor i64 %x1, %y1 389 %xor1 = xor i64 %x2, %y2 390 %or = or i64 %xor, %xor1 391 %cmp = icmp ne i64 %or, 0 392 ret i1 %cmp 393} 394 395; negative test - wrong cmp constant 396 397define i1 @icmp_or_xor_2_eq_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 398; CHECK-LABEL: @icmp_or_xor_2_eq_fail( 399; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]] 400; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]] 401; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]] 402; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 1 403; CHECK-NEXT: ret i1 [[CMP]] 404; 405 %xor = xor i64 %x1, %y1 406 %xor1 = xor i64 %x2, %y2 407 %or = or i64 %xor, %xor1 408 %cmp = icmp eq i64 %or, 1 409 ret i1 %cmp 410} 411 412; negative test - wrong cmp constant 413 414define i1 @icmp_or_xor_2_ne_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 415; CHECK-LABEL: @icmp_or_xor_2_ne_fail( 416; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]] 417; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]] 418; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]] 419; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[OR]], 1 420; CHECK-NEXT: ret i1 [[CMP]] 421; 422 %xor = xor i64 %x1, %y1 423 %xor1 = xor i64 %x2, %y2 424 %or = or i64 %xor, %xor1 425 %cmp = icmp ne i64 %or, 1 426 ret i1 %cmp 427} 428 429; negative test - xor multiuse 430 431; NB: This requires more than 1 iteration to simplify. After we 432; simplify `%cmp_1 = icmp eq i64 %xor, 0`, `%xor = xor i64 %x1, %y1` 433; has one use which allows for complete simplification (rooted on 434; `%or1 = or i1 %cmp, %cmp_1` so we don't end up adding it back). 435define i1 @icmp_or_xor_2_3_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) "instcombine-no-verify-fixpoint" { 436; CHECK-LABEL: @icmp_or_xor_2_3_fail( 437; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]] 438; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]] 439; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]] 440; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0 441; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[X1]], [[Y1]] 442; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]] 443; CHECK-NEXT: ret i1 [[OR1]] 444; 445 %xor = xor i64 %x1, %y1 446 %xor1 = xor i64 %x2, %y2 447 %or = or i64 %xor, %xor1 448 %cmp = icmp eq i64 %or, 0 449 %cmp_1 = icmp eq i64 %xor, 0 450 %or1 = or i1 %cmp, %cmp_1 451 ret i1 %or1 452} 453 454; negative test - xor multiuse 455 456define i1 @icmp_or_xor_2_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) "instcombine-no-verify-fixpoint" { 457; CHECK-LABEL: @icmp_or_xor_2_4_fail( 458; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]] 459; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]] 460; CHECK-NEXT: [[OR:%.*]] = or i64 [[XOR]], [[XOR1]] 461; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0 462; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[X2]], [[Y2]] 463; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]] 464; CHECK-NEXT: ret i1 [[OR1]] 465; 466 %xor = xor i64 %x1, %y1 467 %xor1 = xor i64 %x2, %y2 468 %or = or i64 %xor, %xor1 469 %cmp = icmp eq i64 %or, 0 470 %cmp_1 = icmp eq i64 %xor1, 0 471 %or1 = or i1 %cmp, %cmp_1 472 ret i1 %or1 473} 474 475define i1 @icmp_or_xor_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 476; CHECK-LABEL: @icmp_or_xor_3_1( 477; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 478; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 479; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 480; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 481; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 482; CHECK-NEXT: ret i1 [[CMP]] 483; 484 %xor = xor i64 %x1, %y1 485 %xor1 = xor i64 %x2, %y2 486 %or = or i64 %xor, %xor1 487 %xor2 = xor i64 %x3, %y3 488 %or1 = or i64 %or, %xor2 489 %cmp = icmp eq i64 %or1, 0 490 ret i1 %cmp 491} 492 493; negative test - and instead of or 494 495define i1 @icmp_or_xor_3_2_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 496; CHECK-LABEL: @icmp_or_xor_3_2_fail( 497; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]] 498; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]] 499; CHECK-NEXT: [[AND:%.*]] = and i64 [[XOR]], [[XOR1]] 500; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[X3:%.*]], [[Y3:%.*]] 501; CHECK-NEXT: [[OR1:%.*]] = or i64 [[AND]], [[XOR2]] 502; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0 503; CHECK-NEXT: ret i1 [[CMP]] 504; 505 %xor = xor i64 %x1, %y1 506 %xor1 = xor i64 %x2, %y2 507 %and = and i64 %xor, %xor1 508 %xor2 = xor i64 %x3, %y3 509 %or1 = or i64 %and, %xor2 510 %cmp = icmp eq i64 %or1, 0 511 ret i1 %cmp 512} 513 514define i1 @icmp_or_xor_3_3(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 515; CHECK-LABEL: @icmp_or_xor_3_3( 516; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 517; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 518; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 519; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 520; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 521; CHECK-NEXT: ret i1 [[CMP]] 522; 523 %xor = xor i64 %x1, %y1 524 %xor1 = xor i64 %x2, %y2 525 %or = or i64 %xor, %xor1 526 %xor2 = xor i64 %x3, %y3 527 %or1 = or i64 %xor2, %or 528 %cmp = icmp eq i64 %or1, 0 529 ret i1 %cmp 530} 531 532; negative test - and instead of or 533 534define i1 @icmp_or_xor_3_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 535; CHECK-LABEL: @icmp_or_xor_3_4_fail( 536; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[X1:%.*]], [[Y1:%.*]] 537; CHECK-NEXT: [[XOR1:%.*]] = xor i64 [[X2:%.*]], [[Y2:%.*]] 538; CHECK-NEXT: [[AND:%.*]] = and i64 [[XOR]], [[XOR1]] 539; CHECK-NEXT: [[XOR2:%.*]] = xor i64 [[X3:%.*]], [[Y3:%.*]] 540; CHECK-NEXT: [[OR1:%.*]] = or i64 [[XOR2]], [[AND]] 541; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0 542; CHECK-NEXT: ret i1 [[CMP]] 543; 544 %xor = xor i64 %x1, %y1 545 %xor1 = xor i64 %x2, %y2 546 %and = and i64 %xor, %xor1 547 %xor2 = xor i64 %x3, %y3 548 %or1 = or i64 %xor2, %and 549 %cmp = icmp eq i64 %or1, 0 550 ret i1 %cmp 551} 552 553define i1 @icmp_or_xor_4_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) { 554; CHECK-LABEL: @icmp_or_xor_4_1( 555; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 556; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]] 557; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 558; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 559; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]] 560; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 561; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]] 562; CHECK-NEXT: ret i1 [[CMP]] 563; 564 %xor = xor i64 %x1, %y1 565 %xor1 = xor i64 %x2, %y2 566 %or = or i64 %xor, %xor1 567 %xor2 = xor i64 %x3, %y3 568 %xor3 = xor i64 %x4, %y4 569 %or1 = or i64 %xor2, %xor3 570 %or2 = or i64 %or, %or1 571 %cmp = icmp eq i64 %or2, 0 572 ret i1 %cmp 573} 574 575define i1 @icmp_or_xor_4_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) { 576; CHECK-LABEL: @icmp_or_xor_4_2( 577; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 578; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 579; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 580; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 581; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]] 582; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]] 583; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]] 584; CHECK-NEXT: ret i1 [[CMP]] 585; 586 %xor = xor i64 %x1, %y1 587 %xor1 = xor i64 %x2, %y2 588 %or = or i64 %xor, %xor1 589 %xor2 = xor i64 %x3, %y3 590 %xor3 = xor i64 %x4, %y4 591 %or1 = or i64 %xor2, %xor3 592 %or2 = or i64 %or1, %or 593 %cmp = icmp eq i64 %or2, 0 594 ret i1 %cmp 595} 596 597define i1 @icmp_or_sub_2_eq(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 598; CHECK-LABEL: @icmp_or_sub_2_eq( 599; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 600; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 601; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]] 602; CHECK-NEXT: ret i1 [[CMP]] 603; 604 %sub = sub i64 %x1, %y1 605 %sub1 = sub i64 %x2, %y2 606 %or = or i64 %sub, %sub1 607 %cmp = icmp eq i64 %or, 0 608 ret i1 %cmp 609} 610 611define i1 @icmp_or_sub_2_ne(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 612; CHECK-LABEL: @icmp_or_sub_2_ne( 613; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[X1:%.*]], [[Y1:%.*]] 614; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[X2:%.*]], [[Y2:%.*]] 615; CHECK-NEXT: [[CMP:%.*]] = or i1 [[TMP1]], [[TMP2]] 616; CHECK-NEXT: ret i1 [[CMP]] 617; 618 %sub = sub i64 %x1, %y1 619 %sub1 = sub i64 %x2, %y2 620 %or = or i64 %sub, %sub1 621 %cmp = icmp ne i64 %or, 0 622 ret i1 %cmp 623} 624 625; negative test - wrong cmp constant 626 627define i1 @icmp_or_sub_2_eq_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 628; CHECK-LABEL: @icmp_or_sub_2_eq_fail( 629; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]] 630; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]] 631; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]] 632; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 1 633; CHECK-NEXT: ret i1 [[CMP]] 634; 635 %sub = sub i64 %x1, %y1 636 %sub1 = sub i64 %x2, %y2 637 %or = or i64 %sub, %sub1 638 %cmp = icmp eq i64 %or, 1 639 ret i1 %cmp 640} 641 642; negative test - wrong cmp constant 643 644define i1 @icmp_or_sub_2_ne_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 645; CHECK-LABEL: @icmp_or_sub_2_ne_fail( 646; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]] 647; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]] 648; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]] 649; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[OR]], 1 650; CHECK-NEXT: ret i1 [[CMP]] 651; 652 %sub = sub i64 %x1, %y1 653 %sub1 = sub i64 %x2, %y2 654 %or = or i64 %sub, %sub1 655 %cmp = icmp ne i64 %or, 1 656 ret i1 %cmp 657} 658 659; negative test - sub multiuse 660 661define i1 @icmp_or_sub_2_3_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 662; CHECK-LABEL: @icmp_or_sub_2_3_fail( 663; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]] 664; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]] 665; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]] 666; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0 667; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[SUB]], 1 668; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]] 669; CHECK-NEXT: ret i1 [[OR1]] 670; 671 %sub = sub i64 %x1, %y1 672 %sub1 = sub i64 %x2, %y2 673 %or = or i64 %sub, %sub1 674 %cmp = icmp eq i64 %or, 0 675 %cmp_1 = icmp eq i64 %sub, 1 676 %or1 = or i1 %cmp, %cmp_1 677 ret i1 %or1 678} 679 680; negative test - sub multiuse 681 682define i1 @icmp_or_sub_2_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 683; CHECK-LABEL: @icmp_or_sub_2_4_fail( 684; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]] 685; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]] 686; CHECK-NEXT: [[OR:%.*]] = or i64 [[SUB]], [[SUB1]] 687; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR]], 0 688; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[SUB1]], 1 689; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP]], [[CMP_1]] 690; CHECK-NEXT: ret i1 [[OR1]] 691; 692 %sub = sub i64 %x1, %y1 693 %sub1 = sub i64 %x2, %y2 694 %or = or i64 %sub, %sub1 695 %cmp = icmp eq i64 %or, 0 696 %cmp_1 = icmp eq i64 %sub1, 1 697 %or1 = or i1 %cmp, %cmp_1 698 ret i1 %or1 699} 700 701define i1 @icmp_or_sub_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 702; CHECK-LABEL: @icmp_or_sub_3_1( 703; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 704; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 705; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 706; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 707; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 708; CHECK-NEXT: ret i1 [[CMP]] 709; 710 %sub = sub i64 %x1, %y1 711 %sub1 = sub i64 %x2, %y2 712 %or = or i64 %sub, %sub1 713 %sub2 = sub i64 %x3, %y3 714 %or1 = or i64 %or, %sub2 715 %cmp = icmp eq i64 %or1, 0 716 ret i1 %cmp 717} 718 719; negative test - and instead of or 720 721define i1 @icmp_or_sub_3_2_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 722; CHECK-LABEL: @icmp_or_sub_3_2_fail( 723; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]] 724; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]] 725; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[SUB1]] 726; CHECK-NEXT: [[SUB2:%.*]] = sub i64 [[X3:%.*]], [[Y3:%.*]] 727; CHECK-NEXT: [[OR1:%.*]] = or i64 [[AND]], [[SUB2]] 728; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0 729; CHECK-NEXT: ret i1 [[CMP]] 730; 731 %sub = sub i64 %x1, %y1 732 %sub1 = sub i64 %x2, %y2 733 %and = and i64 %sub, %sub1 734 %sub2 = sub i64 %x3, %y3 735 %or1 = or i64 %and, %sub2 736 %cmp = icmp eq i64 %or1, 0 737 ret i1 %cmp 738} 739 740define i1 @icmp_or_sub_3_3(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 741; CHECK-LABEL: @icmp_or_sub_3_3( 742; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 743; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 744; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 745; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 746; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 747; CHECK-NEXT: ret i1 [[CMP]] 748; 749 %sub = sub i64 %x1, %y1 750 %sub1 = sub i64 %x2, %y2 751 %or = or i64 %sub, %sub1 752 %sub2 = sub i64 %x3, %y3 753 %or1 = or i64 %sub2, %or 754 %cmp = icmp eq i64 %or1, 0 755 ret i1 %cmp 756} 757 758; negative test - and instead of or 759 760define i1 @icmp_or_sub_3_4_fail(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 761; CHECK-LABEL: @icmp_or_sub_3_4_fail( 762; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X1:%.*]], [[Y1:%.*]] 763; CHECK-NEXT: [[SUB1:%.*]] = sub i64 [[X2:%.*]], [[Y2:%.*]] 764; CHECK-NEXT: [[AND:%.*]] = and i64 [[SUB]], [[SUB1]] 765; CHECK-NEXT: [[SUB2:%.*]] = sub i64 [[X3:%.*]], [[Y3:%.*]] 766; CHECK-NEXT: [[OR1:%.*]] = or i64 [[SUB2]], [[AND]] 767; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[OR1]], 0 768; CHECK-NEXT: ret i1 [[CMP]] 769; 770 %sub = sub i64 %x1, %y1 771 %sub1 = sub i64 %x2, %y2 772 %and = and i64 %sub, %sub1 773 %sub2 = sub i64 %x3, %y3 774 %or1 = or i64 %sub2, %and 775 %cmp = icmp eq i64 %or1, 0 776 ret i1 %cmp 777} 778 779define i1 @icmp_or_sub_4_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) { 780; CHECK-LABEL: @icmp_or_sub_4_1( 781; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 782; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]] 783; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 784; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 785; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]] 786; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 787; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]] 788; CHECK-NEXT: ret i1 [[CMP]] 789; 790 %sub = sub i64 %x1, %y1 791 %sub1 = sub i64 %x2, %y2 792 %or = or i64 %sub, %sub1 793 %sub2 = sub i64 %x3, %y3 794 %sub3 = sub i64 %x4, %y4 795 %or1 = or i64 %sub2, %sub3 796 %or2 = or i64 %or, %or1 797 %cmp = icmp eq i64 %or2, 0 798 ret i1 %cmp 799} 800 801define i1 @icmp_or_sub_4_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3, i64 %x4, i64 %y4) { 802; CHECK-LABEL: @icmp_or_sub_4_2( 803; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 804; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 805; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 806; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 807; CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP3]], [[TMP4]] 808; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[X4:%.*]], [[Y4:%.*]] 809; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP5]], [[TMP6]] 810; CHECK-NEXT: ret i1 [[CMP]] 811; 812 %sub = sub i64 %x1, %y1 813 %sub1 = sub i64 %x2, %y2 814 %or = or i64 %sub, %sub1 815 %sub2 = sub i64 %x3, %y3 816 %sub3 = sub i64 %x4, %y4 817 %or1 = or i64 %sub2, %sub3 818 %or2 = or i64 %or1, %or 819 %cmp = icmp eq i64 %or2, 0 820 ret i1 %cmp 821} 822 823define i1 @icmp_or_xor_with_sub_2_eq(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 824; CHECK-LABEL: @icmp_or_xor_with_sub_2_eq( 825; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 826; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 827; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]] 828; CHECK-NEXT: ret i1 [[CMP]] 829; 830 %xor = xor i64 %x1, %y1 831 %sub = sub i64 %x2, %y2 832 %or = or i64 %xor, %sub 833 %cmp = icmp eq i64 %or, 0 834 ret i1 %cmp 835} 836 837define i1 @icmp_or_xor_with_sub_2_ne(i64 %x1, i64 %y1, i64 %x2, i64 %y2) { 838; CHECK-LABEL: @icmp_or_xor_with_sub_2_ne( 839; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i64 [[X1:%.*]], [[Y1:%.*]] 840; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i64 [[X2:%.*]], [[Y2:%.*]] 841; CHECK-NEXT: [[CMP:%.*]] = or i1 [[TMP1]], [[TMP2]] 842; CHECK-NEXT: ret i1 [[CMP]] 843; 844 %xor = xor i64 %x1, %y1 845 %sub = sub i64 %x2, %y2 846 %or = or i64 %xor, %sub 847 %cmp = icmp ne i64 %or, 0 848 ret i1 %cmp 849} 850 851define i1 @icmp_or_xor_with_sub_3_1(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 852; CHECK-LABEL: @icmp_or_xor_with_sub_3_1( 853; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 854; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 855; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 856; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 857; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 858; CHECK-NEXT: ret i1 [[CMP]] 859; 860 %xor = xor i64 %x1, %y1 861 %xor1 = xor i64 %x2, %y2 862 %or = or i64 %xor, %xor1 863 %sub1 = sub i64 %x3, %y3 864 %or1 = or i64 %or, %sub1 865 %cmp = icmp eq i64 %or1, 0 866 ret i1 %cmp 867} 868 869define i1 @icmp_or_xor_with_sub_3_2(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 870; CHECK-LABEL: @icmp_or_xor_with_sub_3_2( 871; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 872; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 873; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 874; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 875; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 876; CHECK-NEXT: ret i1 [[CMP]] 877; 878 %xor = xor i64 %x1, %y1 879 %sub = sub i64 %x2, %y2 880 %or = or i64 %xor, %sub 881 %xor1 = xor i64 %x3, %y3 882 %or1 = or i64 %or, %xor1 883 %cmp = icmp eq i64 %or1, 0 884 ret i1 %cmp 885} 886 887define i1 @icmp_or_xor_with_sub_3_3(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 888; CHECK-LABEL: @icmp_or_xor_with_sub_3_3( 889; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 890; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 891; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 892; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 893; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 894; CHECK-NEXT: ret i1 [[CMP]] 895; 896 %xor = xor i64 %x1, %y1 897 %sub = sub i64 %x2, %y2 898 %or = or i64 %xor, %sub 899 %sub1 = sub i64 %x3, %y3 900 %or1 = or i64 %or, %sub1 901 %cmp = icmp eq i64 %or1, 0 902 ret i1 %cmp 903} 904 905define i1 @icmp_or_xor_with_sub_3_4(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 906; CHECK-LABEL: @icmp_or_xor_with_sub_3_4( 907; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 908; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 909; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 910; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 911; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 912; CHECK-NEXT: ret i1 [[CMP]] 913; 914 %sub = sub i64 %x1, %y1 915 %xor = xor i64 %x2, %y2 916 %or = or i64 %sub, %xor 917 %xor1 = xor i64 %x3, %y3 918 %or1 = or i64 %or, %xor1 919 %cmp = icmp eq i64 %or1, 0 920 ret i1 %cmp 921} 922 923define i1 @icmp_or_xor_with_sub_3_5(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 924; CHECK-LABEL: @icmp_or_xor_with_sub_3_5( 925; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 926; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 927; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 928; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 929; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 930; CHECK-NEXT: ret i1 [[CMP]] 931; 932 %sub = sub i64 %x1, %y1 933 %xor = xor i64 %x2, %y2 934 %or = or i64 %sub, %xor 935 %sub1 = sub i64 %x3, %y3 936 %or1 = or i64 %or, %sub1 937 %cmp = icmp eq i64 %or1, 0 938 ret i1 %cmp 939} 940 941define i1 @icmp_or_xor_with_sub_3_6(i64 %x1, i64 %y1, i64 %x2, i64 %y2, i64 %x3, i64 %y3) { 942; CHECK-LABEL: @icmp_or_xor_with_sub_3_6( 943; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i64 [[X1:%.*]], [[Y1:%.*]] 944; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[X2:%.*]], [[Y2:%.*]] 945; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]] 946; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[X3:%.*]], [[Y3:%.*]] 947; CHECK-NEXT: [[CMP:%.*]] = and i1 [[TMP3]], [[TMP4]] 948; CHECK-NEXT: ret i1 [[CMP]] 949; 950 %sub = sub i64 %x1, %y1 951 %sub1 = sub i64 %x2, %y2 952 %or = or i64 %sub, %sub1 953 %xor = xor i64 %x3, %y3 954 %or1 = or i64 %or, %xor 955 %cmp = icmp eq i64 %or1, 0 956 ret i1 %cmp 957} 958 959 960define i1 @or_disjoint_with_constants(i8 %x) { 961; CHECK-LABEL: @or_disjoint_with_constants( 962; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 18 963; CHECK-NEXT: ret i1 [[CMP]] 964; 965 %or = or disjoint i8 %x, 1 966 %cmp = icmp eq i8 %or, 19 967 ret i1 %cmp 968} 969 970 971define i1 @or_disjoint_with_constants2(i8 %x) { 972; CHECK-LABEL: @or_disjoint_with_constants2( 973; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], 5 974; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], 66 975; CHECK-NEXT: call void @use(i8 [[OR]]) 976; CHECK-NEXT: ret i1 [[CMP]] 977; 978 %or = or disjoint i8 %x, 5 979 %cmp = icmp ne i8 %or, 71 980 call void @use(i8 %or) 981 ret i1 %cmp 982} 983 984 985define i1 @or_disjoint_with_constants_fail_missing_const1(i8 %x, i8 %y) { 986; CHECK-LABEL: @or_disjoint_with_constants_fail_missing_const1( 987; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], [[Y:%.*]] 988; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 19 989; CHECK-NEXT: ret i1 [[CMP]] 990; 991 %or = or disjoint i8 %x, %y 992 %cmp = icmp eq i8 %or, 19 993 ret i1 %cmp 994} 995 996define i1 @or_disjoint_with_constants_fail_missing_const2(i8 %x, i8 %y) { 997; CHECK-LABEL: @or_disjoint_with_constants_fail_missing_const2( 998; CHECK-NEXT: [[OR:%.*]] = or disjoint i8 [[X:%.*]], 19 999; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], [[Y:%.*]] 1000; CHECK-NEXT: ret i1 [[CMP]] 1001; 1002 %or = or disjoint i8 %x, 19 1003 %cmp = icmp eq i8 %or, %y 1004 ret i1 %cmp 1005} 1006 1007