; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi | FileCheck %s
define zeroext i1 @all_bits_clear(i32 %P, i32 %Q) nounwind {
; CHECK-LABEL: all_bits_clear:
%r = or i1 %a, %b
ret i1 %r
}
+
+; TODO: PR44136 - fold cmpeq(or(X,Y),X) --> cmpeq(and(~X,Y),0)
+
+define i1 @or_cmp_eq_i64(i64 %x, i64 %y) {
+; CHECK-LABEL: or_cmp_eq_i64:
+; CHECK: # %bb.0:
+; CHECK-NEXT: orq %rdi, %rsi
+; CHECK-NEXT: cmpq %rdi, %rsi
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+ %o = or i64 %x, %y
+ %c = icmp eq i64 %o, %x
+ ret i1 %c
+}
+
+define i1 @or_cmp_eq_i32(i32 %x, i32 %y) {
+; CHECK-LABEL: or_cmp_eq_i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: orl %esi, %edi
+; CHECK-NEXT: cmpl %esi, %edi
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+ %o = or i32 %x, %y
+ %c = icmp eq i32 %o, %y
+ ret i1 %c
+}
+
+define i1 @or_cmp_eq_i16(i16 zeroext %x, i16 zeroext %y) {
+; CHECK-LABEL: or_cmp_eq_i16:
+; CHECK: # %bb.0:
+; CHECK-NEXT: orl %edi, %esi
+; CHECK-NEXT: cmpw %si, %di
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+ %o = or i16 %x, %y
+ %c = icmp eq i16 %x, %o
+ ret i1 %c
+}
+
+define i1 @or_cmp_eq_i8(i8 zeroext %x, i8 zeroext %y) {
+; CHECK-LABEL: or_cmp_eq_i8:
+; CHECK: # %bb.0:
+; CHECK-NEXT: orl %esi, %edi
+; CHECK-NEXT: cmpb %dil, %sil
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+ %o = or i8 %x, %y
+ %c = icmp eq i8 %y, %o
+ ret i1 %c
+}
+
+; Don't fold vectors.
+define <4 x i32> @or_cmp_eq_v4i32(<4 x i32> %x, <4 x i32> %y) {
+; CHECK-LABEL: or_cmp_eq_v4i32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: por %xmm0, %xmm1
+; CHECK-NEXT: pcmpeqd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %o = or <4 x i32> %x, %y
+ %c = icmp eq <4 x i32> %o, %x
+ %s = sext <4 x i1> %c to <4 x i32>
+ ret <4 x i32> %s
+}