720 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,NOBMI3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi | FileCheck %s --check-prefixes=CHECK,BMI4 5define zeroext i1 @all_bits_clear(i32 %P, i32 %Q) nounwind {6; CHECK-LABEL: all_bits_clear:7; CHECK: # %bb.0:8; CHECK-NEXT: orl %esi, %edi9; CHECK-NEXT: sete %al10; CHECK-NEXT: retq11 %a = icmp eq i32 %P, 012 %b = icmp eq i32 %Q, 013 %c = and i1 %a, %b14 ret i1 %c15}16 17define zeroext i1 @all_sign_bits_clear(i32 %P, i32 %Q) nounwind {18; CHECK-LABEL: all_sign_bits_clear:19; CHECK: # %bb.0:20; CHECK-NEXT: orl %esi, %edi21; CHECK-NEXT: setns %al22; CHECK-NEXT: retq23 %a = icmp sgt i32 %P, -124 %b = icmp sgt i32 %Q, -125 %c = and i1 %a, %b26 ret i1 %c27}28 29define zeroext i1 @all_bits_set(i32 %P, i32 %Q) nounwind {30; CHECK-LABEL: all_bits_set:31; CHECK: # %bb.0:32; CHECK-NEXT: andl %esi, %edi33; CHECK-NEXT: cmpl $-1, %edi34; CHECK-NEXT: sete %al35; CHECK-NEXT: retq36 %a = icmp eq i32 %P, -137 %b = icmp eq i32 %Q, -138 %c = and i1 %a, %b39 ret i1 %c40}41 42define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q) nounwind {43; CHECK-LABEL: all_sign_bits_set:44; CHECK: # %bb.0:45; CHECK-NEXT: movl %edi, %eax46; CHECK-NEXT: andl %esi, %eax47; CHECK-NEXT: shrl $31, %eax48; CHECK-NEXT: # kill: def $al killed $al killed $eax49; CHECK-NEXT: retq50 %a = icmp slt i32 %P, 051 %b = icmp slt i32 %Q, 052 %c = and i1 %a, %b53 ret i1 %c54}55 56define zeroext i1 @any_bits_set(i32 %P, i32 %Q) nounwind {57; CHECK-LABEL: any_bits_set:58; CHECK: # %bb.0:59; CHECK-NEXT: orl %esi, %edi60; CHECK-NEXT: setne %al61; CHECK-NEXT: retq62 %a = icmp ne i32 %P, 063 %b = icmp ne i32 %Q, 064 %c = or i1 %a, %b65 ret i1 %c66}67 68define zeroext i1 @any_sign_bits_set(i32 %P, i32 %Q) nounwind {69; CHECK-LABEL: any_sign_bits_set:70; CHECK: # %bb.0:71; CHECK-NEXT: movl %edi, %eax72; CHECK-NEXT: orl %esi, %eax73; CHECK-NEXT: shrl $31, %eax74; CHECK-NEXT: # kill: def $al killed $al killed $eax75; CHECK-NEXT: retq76 %a = icmp slt i32 %P, 077 %b = icmp slt i32 %Q, 078 %c = or i1 %a, %b79 ret i1 %c80}81 82define zeroext i1 @any_bits_clear(i32 %P, i32 %Q) nounwind {83; CHECK-LABEL: any_bits_clear:84; CHECK: # %bb.0:85; CHECK-NEXT: andl %esi, %edi86; CHECK-NEXT: cmpl $-1, %edi87; CHECK-NEXT: setne %al88; CHECK-NEXT: retq89 %a = icmp ne i32 %P, -190 %b = icmp ne i32 %Q, -191 %c = or i1 %a, %b92 ret i1 %c93}94 95define zeroext i1 @any_sign_bits_clear(i32 %P, i32 %Q) nounwind {96; CHECK-LABEL: any_sign_bits_clear:97; CHECK: # %bb.0:98; CHECK-NEXT: testl %esi, %edi99; CHECK-NEXT: setns %al100; CHECK-NEXT: retq101 %a = icmp sgt i32 %P, -1102 %b = icmp sgt i32 %Q, -1103 %c = or i1 %a, %b104 ret i1 %c105}106 107; PR3351 - (P == 0) & (Q == 0) -> (P|Q) == 0108define i32 @all_bits_clear_branch(ptr %P, ptr %Q) nounwind {109; CHECK-LABEL: all_bits_clear_branch:110; CHECK: # %bb.0: # %entry111; CHECK-NEXT: orq %rsi, %rdi112; CHECK-NEXT: jne .LBB8_2113; CHECK-NEXT: # %bb.1: # %bb1114; CHECK-NEXT: movl $4, %eax115; CHECK-NEXT: retq116; CHECK-NEXT: .LBB8_2: # %return117; CHECK-NEXT: movl $192, %eax118; CHECK-NEXT: retq119entry:120 %a = icmp eq ptr %P, null121 %b = icmp eq ptr %Q, null122 %c = and i1 %a, %b123 br i1 %c, label %bb1, label %return124 125bb1:126 ret i32 4127 128return:129 ret i32 192130}131 132define i32 @all_sign_bits_clear_branch(i32 %P, i32 %Q) nounwind {133; CHECK-LABEL: all_sign_bits_clear_branch:134; CHECK: # %bb.0: # %entry135; CHECK-NEXT: orl %esi, %edi136; CHECK-NEXT: js .LBB9_2137; CHECK-NEXT: # %bb.1: # %bb1138; CHECK-NEXT: movl $4, %eax139; CHECK-NEXT: retq140; CHECK-NEXT: .LBB9_2: # %return141; CHECK-NEXT: movl $192, %eax142; CHECK-NEXT: retq143entry:144 %a = icmp sgt i32 %P, -1145 %b = icmp sgt i32 %Q, -1146 %c = and i1 %a, %b147 br i1 %c, label %bb1, label %return148 149bb1:150 ret i32 4151 152return:153 ret i32 192154}155 156define i32 @all_bits_set_branch(i32 %P, i32 %Q) nounwind {157; CHECK-LABEL: all_bits_set_branch:158; CHECK: # %bb.0: # %entry159; CHECK-NEXT: andl %esi, %edi160; CHECK-NEXT: cmpl $-1, %edi161; CHECK-NEXT: jne .LBB10_2162; CHECK-NEXT: # %bb.1: # %bb1163; CHECK-NEXT: movl $4, %eax164; CHECK-NEXT: retq165; CHECK-NEXT: .LBB10_2: # %return166; CHECK-NEXT: movl $192, %eax167; CHECK-NEXT: retq168entry:169 %a = icmp eq i32 %P, -1170 %b = icmp eq i32 %Q, -1171 %c = and i1 %a, %b172 br i1 %c, label %bb1, label %return173 174bb1:175 ret i32 4176 177return:178 ret i32 192179}180 181define i32 @all_sign_bits_set_branch(i32 %P, i32 %Q) nounwind {182; CHECK-LABEL: all_sign_bits_set_branch:183; CHECK: # %bb.0: # %entry184; CHECK-NEXT: testl %esi, %edi185; CHECK-NEXT: jns .LBB11_2186; CHECK-NEXT: # %bb.1: # %bb1187; CHECK-NEXT: movl $4, %eax188; CHECK-NEXT: retq189; CHECK-NEXT: .LBB11_2: # %return190; CHECK-NEXT: movl $192, %eax191; CHECK-NEXT: retq192entry:193 %a = icmp slt i32 %P, 0194 %b = icmp slt i32 %Q, 0195 %c = and i1 %a, %b196 br i1 %c, label %bb1, label %return197 198bb1:199 ret i32 4200 201return:202 ret i32 192203}204 205; PR3351 - (P != 0) | (Q != 0) -> (P|Q) != 0206define i32 @any_bits_set_branch(ptr %P, ptr %Q) nounwind {207; CHECK-LABEL: any_bits_set_branch:208; CHECK: # %bb.0: # %entry209; CHECK-NEXT: orq %rsi, %rdi210; CHECK-NEXT: je .LBB12_2211; CHECK-NEXT: # %bb.1: # %bb1212; CHECK-NEXT: movl $4, %eax213; CHECK-NEXT: retq214; CHECK-NEXT: .LBB12_2: # %return215; CHECK-NEXT: movl $192, %eax216; CHECK-NEXT: retq217entry:218 %a = icmp ne ptr %P, null219 %b = icmp ne ptr %Q, null220 %c = or i1 %a, %b221 br i1 %c, label %bb1, label %return222 223bb1:224 ret i32 4225 226return:227 ret i32 192228}229 230define i32 @any_sign_bits_set_branch(i32 %P, i32 %Q) nounwind {231; CHECK-LABEL: any_sign_bits_set_branch:232; CHECK: # %bb.0: # %entry233; CHECK-NEXT: orl %esi, %edi234; CHECK-NEXT: jns .LBB13_2235; CHECK-NEXT: # %bb.1: # %bb1236; CHECK-NEXT: movl $4, %eax237; CHECK-NEXT: retq238; CHECK-NEXT: .LBB13_2: # %return239; CHECK-NEXT: movl $192, %eax240; CHECK-NEXT: retq241entry:242 %a = icmp slt i32 %P, 0243 %b = icmp slt i32 %Q, 0244 %c = or i1 %a, %b245 br i1 %c, label %bb1, label %return246 247bb1:248 ret i32 4249 250return:251 ret i32 192252}253 254define i32 @any_bits_clear_branch(i32 %P, i32 %Q) nounwind {255; CHECK-LABEL: any_bits_clear_branch:256; CHECK: # %bb.0: # %entry257; CHECK-NEXT: andl %esi, %edi258; CHECK-NEXT: cmpl $-1, %edi259; CHECK-NEXT: je .LBB14_2260; CHECK-NEXT: # %bb.1: # %bb1261; CHECK-NEXT: movl $4, %eax262; CHECK-NEXT: retq263; CHECK-NEXT: .LBB14_2: # %return264; CHECK-NEXT: movl $192, %eax265; CHECK-NEXT: retq266entry:267 %a = icmp ne i32 %P, -1268 %b = icmp ne i32 %Q, -1269 %c = or i1 %a, %b270 br i1 %c, label %bb1, label %return271 272bb1:273 ret i32 4274 275return:276 ret i32 192277}278 279define i32 @any_sign_bits_clear_branch(i32 %P, i32 %Q) nounwind {280; CHECK-LABEL: any_sign_bits_clear_branch:281; CHECK: # %bb.0: # %entry282; CHECK-NEXT: testl %esi, %edi283; CHECK-NEXT: js .LBB15_2284; CHECK-NEXT: # %bb.1: # %bb1285; CHECK-NEXT: movl $4, %eax286; CHECK-NEXT: retq287; CHECK-NEXT: .LBB15_2: # %return288; CHECK-NEXT: movl $192, %eax289; CHECK-NEXT: retq290entry:291 %a = icmp sgt i32 %P, -1292 %b = icmp sgt i32 %Q, -1293 %c = or i1 %a, %b294 br i1 %c, label %bb1, label %return295 296bb1:297 ret i32 4298 299return:300 ret i32 192301}302 303; PR44565 - https://bugs.llvm.org/show_bug.cgi?id=44565304 305define i32 @vec_extract_branch(<2 x double> %x) {306; CHECK-LABEL: vec_extract_branch:307; CHECK: # %bb.0:308; CHECK-NEXT: xorpd %xmm1, %xmm1309; CHECK-NEXT: cmpltpd %xmm0, %xmm1310; CHECK-NEXT: movmskpd %xmm1, %eax311; CHECK-NEXT: cmpl $3, %eax312; CHECK-NEXT: jne .LBB16_2313; CHECK-NEXT: # %bb.1: # %true314; CHECK-NEXT: movl $42, %eax315; CHECK-NEXT: retq316; CHECK-NEXT: .LBB16_2: # %false317; CHECK-NEXT: movl $88, %eax318; CHECK-NEXT: retq319 %t1 = fcmp ogt <2 x double> %x, zeroinitializer320 %t2 = extractelement <2 x i1> %t1, i32 0321 %t3 = extractelement <2 x i1> %t1, i32 1322 %t4 = and i1 %t2, %t3323 br i1 %t4, label %true, label %false324true:325 ret i32 42326false:327 ret i32 88328}329 330define <4 x i1> @all_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {331; CHECK-LABEL: all_bits_clear_vec:332; CHECK: # %bb.0:333; CHECK-NEXT: por %xmm1, %xmm0334; CHECK-NEXT: pxor %xmm1, %xmm1335; CHECK-NEXT: pcmpeqd %xmm1, %xmm0336; CHECK-NEXT: retq337 %a = icmp eq <4 x i32> %P, zeroinitializer338 %b = icmp eq <4 x i32> %Q, zeroinitializer339 %c = and <4 x i1> %a, %b340 ret <4 x i1> %c341}342 343define <4 x i1> @all_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {344; CHECK-LABEL: all_sign_bits_clear_vec:345; CHECK: # %bb.0:346; CHECK-NEXT: por %xmm1, %xmm0347; CHECK-NEXT: pcmpeqd %xmm1, %xmm1348; CHECK-NEXT: pcmpgtd %xmm1, %xmm0349; CHECK-NEXT: retq350 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>351 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>352 %c = and <4 x i1> %a, %b353 ret <4 x i1> %c354}355 356define <4 x i1> @all_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {357; CHECK-LABEL: all_bits_set_vec:358; CHECK: # %bb.0:359; CHECK-NEXT: pand %xmm1, %xmm0360; CHECK-NEXT: pcmpeqd %xmm1, %xmm1361; CHECK-NEXT: pcmpeqd %xmm1, %xmm0362; CHECK-NEXT: retq363 %a = icmp eq <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>364 %b = icmp eq <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>365 %c = and <4 x i1> %a, %b366 ret <4 x i1> %c367}368 369define <4 x i1> @all_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {370; CHECK-LABEL: all_sign_bits_set_vec:371; CHECK: # %bb.0:372; CHECK-NEXT: pand %xmm1, %xmm0373; CHECK-NEXT: pxor %xmm1, %xmm1374; CHECK-NEXT: pcmpgtd %xmm0, %xmm1375; CHECK-NEXT: movdqa %xmm1, %xmm0376; CHECK-NEXT: retq377 %a = icmp slt <4 x i32> %P, zeroinitializer378 %b = icmp slt <4 x i32> %Q, zeroinitializer379 %c = and <4 x i1> %a, %b380 ret <4 x i1> %c381}382 383define <4 x i1> @any_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {384; CHECK-LABEL: any_bits_set_vec:385; CHECK: # %bb.0:386; CHECK-NEXT: por %xmm1, %xmm0387; CHECK-NEXT: pxor %xmm1, %xmm1388; CHECK-NEXT: pcmpeqd %xmm1, %xmm0389; CHECK-NEXT: pcmpeqd %xmm1, %xmm1390; CHECK-NEXT: pxor %xmm1, %xmm0391; CHECK-NEXT: retq392 %a = icmp ne <4 x i32> %P, zeroinitializer393 %b = icmp ne <4 x i32> %Q, zeroinitializer394 %c = or <4 x i1> %a, %b395 ret <4 x i1> %c396}397 398define <4 x i1> @any_sign_bits_set_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {399; CHECK-LABEL: any_sign_bits_set_vec:400; CHECK: # %bb.0:401; CHECK-NEXT: por %xmm1, %xmm0402; CHECK-NEXT: pxor %xmm1, %xmm1403; CHECK-NEXT: pcmpgtd %xmm0, %xmm1404; CHECK-NEXT: movdqa %xmm1, %xmm0405; CHECK-NEXT: retq406 %a = icmp slt <4 x i32> %P, zeroinitializer407 %b = icmp slt <4 x i32> %Q, zeroinitializer408 %c = or <4 x i1> %a, %b409 ret <4 x i1> %c410}411 412define <4 x i1> @any_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {413; CHECK-LABEL: any_bits_clear_vec:414; CHECK: # %bb.0:415; CHECK-NEXT: pand %xmm1, %xmm0416; CHECK-NEXT: pcmpeqd %xmm1, %xmm1417; CHECK-NEXT: pcmpeqd %xmm1, %xmm0418; CHECK-NEXT: pxor %xmm1, %xmm0419; CHECK-NEXT: retq420 %a = icmp ne <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>421 %b = icmp ne <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>422 %c = or <4 x i1> %a, %b423 ret <4 x i1> %c424}425 426define <4 x i1> @any_sign_bits_clear_vec(<4 x i32> %P, <4 x i32> %Q) nounwind {427; CHECK-LABEL: any_sign_bits_clear_vec:428; CHECK: # %bb.0:429; CHECK-NEXT: pand %xmm1, %xmm0430; CHECK-NEXT: pcmpeqd %xmm1, %xmm1431; CHECK-NEXT: pcmpgtd %xmm1, %xmm0432; CHECK-NEXT: retq433 %a = icmp sgt <4 x i32> %P, <i32 -1, i32 -1, i32 -1, i32 -1>434 %b = icmp sgt <4 x i32> %Q, <i32 -1, i32 -1, i32 -1, i32 -1>435 %c = or <4 x i1> %a, %b436 ret <4 x i1> %c437}438 439define zeroext i1 @ne_neg1_and_ne_zero(i64 %x) nounwind {440; CHECK-LABEL: ne_neg1_and_ne_zero:441; CHECK: # %bb.0:442; CHECK-NEXT: incq %rdi443; CHECK-NEXT: testq $-2, %rdi444; CHECK-NEXT: setne %al445; CHECK-NEXT: retq446 %cmp1 = icmp ne i64 %x, -1447 %cmp2 = icmp ne i64 %x, 0448 %and = and i1 %cmp1, %cmp2449 ret i1 %and450}451 452; PR32401 - https://bugs.llvm.org/show_bug.cgi?id=32401453 454define zeroext i1 @and_eq(i8 %a, i8 %b, i8 %c, i8 %d) nounwind {455; CHECK-LABEL: and_eq:456; CHECK: # %bb.0:457; CHECK-NEXT: xorl %esi, %edi458; CHECK-NEXT: xorl %ecx, %edx459; CHECK-NEXT: orb %dl, %dil460; CHECK-NEXT: sete %al461; CHECK-NEXT: retq462 %cmp1 = icmp eq i8 %a, %b463 %cmp2 = icmp eq i8 %c, %d464 %and = and i1 %cmp1, %cmp2465 ret i1 %and466}467 468define zeroext i1 @or_ne(i8 %a, i8 %b, i8 %c, i8 %d) nounwind {469; CHECK-LABEL: or_ne:470; CHECK: # %bb.0:471; CHECK-NEXT: xorl %esi, %edi472; CHECK-NEXT: xorl %ecx, %edx473; CHECK-NEXT: orb %dl, %dil474; CHECK-NEXT: setne %al475; CHECK-NEXT: retq476 %cmp1 = icmp ne i8 %a, %b477 %cmp2 = icmp ne i8 %c, %d478 %or = or i1 %cmp1, %cmp2479 ret i1 %or480}481 482; This should not be transformed because vector compares + bitwise logic are faster.483 484define <4 x i1> @and_eq_vec(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c, <4 x i32> %d) nounwind {485; CHECK-LABEL: and_eq_vec:486; CHECK: # %bb.0:487; CHECK-NEXT: pcmpeqd %xmm1, %xmm0488; CHECK-NEXT: pcmpeqd %xmm3, %xmm2489; CHECK-NEXT: pand %xmm2, %xmm0490; CHECK-NEXT: retq491 %cmp1 = icmp eq <4 x i32> %a, %b492 %cmp2 = icmp eq <4 x i32> %c, %d493 %and = and <4 x i1> %cmp1, %cmp2494 ret <4 x i1> %and495}496 497define i1 @or_icmps_const_1bit_diff(i8 %x) {498; CHECK-LABEL: or_icmps_const_1bit_diff:499; CHECK: # %bb.0:500; CHECK-NEXT: addb $-43, %dil501; CHECK-NEXT: testb $-3, %dil502; CHECK-NEXT: sete %al503; CHECK-NEXT: retq504 %a = icmp eq i8 %x, 43505 %b = icmp eq i8 %x, 45506 %r = or i1 %a, %b507 ret i1 %r508}509 510define <4 x i32> @or_icmps_const_1bit_diff_vec(<4 x i32> %x) {511; CHECK-LABEL: or_icmps_const_1bit_diff_vec:512; CHECK: # %bb.0:513; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [43,45,43,45]514; CHECK-NEXT: pcmpeqd %xmm0, %xmm1515; CHECK-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0516; CHECK-NEXT: por %xmm1, %xmm0517; CHECK-NEXT: retq518 %a = icmp eq <4 x i32> %x, <i32 43, i32 45, i32 43, i32 45>519 %b = icmp eq <4 x i32> %x, <i32 45, i32 43, i32 45, i32 43>520 %t = or <4 x i1> %a, %b521 %r = sext <4 x i1> %t to <4 x i32>522 ret <4 x i32> %r523}524 525define i1 @and_icmps_const_1bit_diff(i32 %x) {526; CHECK-LABEL: and_icmps_const_1bit_diff:527; CHECK: # %bb.0:528; CHECK-NEXT: addl $-44, %edi529; CHECK-NEXT: testl $-17, %edi530; CHECK-NEXT: setne %al531; CHECK-NEXT: retq532 %a = icmp ne i32 %x, 44533 %b = icmp ne i32 %x, 60534 %r = and i1 %a, %b535 ret i1 %r536}537 538define <4 x i32> @and_icmps_const_1bit_diff_vec(<4 x i32> %x) {539; CHECK-LABEL: and_icmps_const_1bit_diff_vec:540; CHECK: # %bb.0:541; CHECK-NEXT: movdqa {{.*#+}} xmm1 = [44,60,44,60]542; CHECK-NEXT: pcmpeqd %xmm0, %xmm1543; CHECK-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0544; CHECK-NEXT: por %xmm1, %xmm0545; CHECK-NEXT: pcmpeqd %xmm1, %xmm1546; CHECK-NEXT: pxor %xmm1, %xmm0547; CHECK-NEXT: retq548 %a = icmp ne <4 x i32> %x, <i32 44, i32 60, i32 44, i32 60>549 %b = icmp ne <4 x i32> %x, <i32 60, i32 44, i32 60, i32 44>550 %t = and <4 x i1> %a, %b551 %r = sext <4 x i1> %t to <4 x i32>552 ret <4 x i32> %r553}554 555; Negative test - extra use prevents optimization556 557define i1 @or_icmps_const_1bit_diff_extra_use(i8 %x, ptr %p) {558; CHECK-LABEL: or_icmps_const_1bit_diff_extra_use:559; CHECK: # %bb.0:560; CHECK-NEXT: cmpb $45, %dil561; CHECK-NEXT: sete %cl562; CHECK-NEXT: cmpb $43, %dil563; CHECK-NEXT: sete %al564; CHECK-NEXT: sete (%rsi)565; CHECK-NEXT: orb %cl, %al566; CHECK-NEXT: retq567 %a = icmp eq i8 %x, 43568 %b = icmp eq i8 %x, 45569 %r = or i1 %a, %b570 %z = zext i1 %a to i8571 store i8 %z, ptr %p572 ret i1 %r573}574 575; Negative test - constant diff is >1 bit576 577define i1 @and_icmps_const_not1bit_diff(i32 %x) {578; CHECK-LABEL: and_icmps_const_not1bit_diff:579; CHECK: # %bb.0:580; CHECK-NEXT: cmpl $44, %edi581; CHECK-NEXT: setne %cl582; CHECK-NEXT: cmpl $92, %edi583; CHECK-NEXT: setne %al584; CHECK-NEXT: andb %cl, %al585; CHECK-NEXT: retq586 %a = icmp ne i32 %x, 44587 %b = icmp ne i32 %x, 92588 %r = and i1 %a, %b589 ret i1 %r590}591 592; Negative test - wrong comparison593 594define i1 @and_icmps_const_1bit_diff_wrong_pred(i32 %x) {595; CHECK-LABEL: and_icmps_const_1bit_diff_wrong_pred:596; CHECK: # %bb.0:597; CHECK-NEXT: cmpl $43, %edi598; CHECK-NEXT: sete %cl599; CHECK-NEXT: cmpl $45, %edi600; CHECK-NEXT: setl %al601; CHECK-NEXT: orb %cl, %al602; CHECK-NEXT: retq603 %a = icmp eq i32 %x, 43604 %b = icmp slt i32 %x, 45605 %r = or i1 %a, %b606 ret i1 %r607}608 609; Negative test - no common operand610 611define i1 @and_icmps_const_1bit_diff_common_op(i32 %x, i32 %y) {612; CHECK-LABEL: and_icmps_const_1bit_diff_common_op:613; CHECK: # %bb.0:614; CHECK-NEXT: cmpl $43, %edi615; CHECK-NEXT: sete %cl616; CHECK-NEXT: cmpl $45, %esi617; CHECK-NEXT: sete %al618; CHECK-NEXT: orb %cl, %al619; CHECK-NEXT: retq620 %a = icmp eq i32 %x, 43621 %b = icmp eq i32 %y, 45622 %r = or i1 %a, %b623 ret i1 %r624}625 626; PR44136 - fold cmpeq(or(X,Y),X) --> cmpeq(and(~X,Y),0)627 628define i1 @or_cmp_eq_i64(i64 %x, i64 %y) {629; NOBMI-LABEL: or_cmp_eq_i64:630; NOBMI: # %bb.0:631; NOBMI-NEXT: notq %rdi632; NOBMI-NEXT: testq %rsi, %rdi633; NOBMI-NEXT: sete %al634; NOBMI-NEXT: retq635;636; BMI-LABEL: or_cmp_eq_i64:637; BMI: # %bb.0:638; BMI-NEXT: andnq %rsi, %rdi, %rax639; BMI-NEXT: sete %al640; BMI-NEXT: retq641 %o = or i64 %x, %y642 %c = icmp eq i64 %o, %x643 ret i1 %c644}645 646define i1 @or_cmp_ne_i32(i32 %x, i32 %y) {647; NOBMI-LABEL: or_cmp_ne_i32:648; NOBMI: # %bb.0:649; NOBMI-NEXT: notl %esi650; NOBMI-NEXT: testl %edi, %esi651; NOBMI-NEXT: setne %al652; NOBMI-NEXT: retq653;654; BMI-LABEL: or_cmp_ne_i32:655; BMI: # %bb.0:656; BMI-NEXT: andnl %edi, %esi, %eax657; BMI-NEXT: setne %al658; BMI-NEXT: retq659 %o = or i32 %x, %y660 %c = icmp ne i32 %o, %y661 ret i1 %c662}663 664define i1 @or_cmp_eq_i16(i16 zeroext %x, i16 zeroext %y) {665; NOBMI-LABEL: or_cmp_eq_i16:666; NOBMI: # %bb.0:667; NOBMI-NEXT: notl %edi668; NOBMI-NEXT: testl %esi, %edi669; NOBMI-NEXT: sete %al670; NOBMI-NEXT: retq671;672; BMI-LABEL: or_cmp_eq_i16:673; BMI: # %bb.0:674; BMI-NEXT: andnl %esi, %edi, %eax675; BMI-NEXT: sete %al676; BMI-NEXT: retq677 %o = or i16 %x, %y678 %c = icmp eq i16 %x, %o679 ret i1 %c680}681 682define i1 @or_cmp_ne_i8(i8 zeroext %x, i8 zeroext %y) {683; CHECK-LABEL: or_cmp_ne_i8:684; CHECK: # %bb.0:685; CHECK-NEXT: notb %sil686; CHECK-NEXT: testb %dil, %sil687; CHECK-NEXT: setne %al688; CHECK-NEXT: retq689 %o = or i8 %x, %y690 %c = icmp ne i8 %y, %o691 ret i1 %c692}693 694; Don't fold vectors.695define <4 x i32> @or_cmp_eq_v4i32(<4 x i32> %x, <4 x i32> %y) {696; CHECK-LABEL: or_cmp_eq_v4i32:697; CHECK: # %bb.0:698; CHECK-NEXT: por %xmm0, %xmm1699; CHECK-NEXT: pcmpeqd %xmm1, %xmm0700; CHECK-NEXT: retq701 %o = or <4 x i32> %x, %y702 %c = icmp eq <4 x i32> %o, %x703 %s = sext <4 x i1> %c to <4 x i32>704 ret <4 x i32> %s705}706 707define <16 x i8> @or_cmp_ne_v4i32(<16 x i8> %x, <16 x i8> %y) {708; CHECK-LABEL: or_cmp_ne_v4i32:709; CHECK: # %bb.0:710; CHECK-NEXT: por %xmm0, %xmm1711; CHECK-NEXT: pcmpeqb %xmm1, %xmm0712; CHECK-NEXT: pcmpeqd %xmm1, %xmm1713; CHECK-NEXT: pxor %xmm1, %xmm0714; CHECK-NEXT: retq715 %o = or <16 x i8> %x, %y716 %c = icmp ne <16 x i8> %o, %x717 %s = sext <16 x i1> %c to <16 x i8>718 ret <16 x i8> %s719}720