[X86] Add PR44136 test coverage
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 9 Apr 2021 10:31:29 +0000 (11:31 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Fri, 9 Apr 2021 10:42:10 +0000 (11:42 +0100)
llvm/test/CodeGen/X86/setcc-logic.ll

index 59e0efc..b582f2c 100644 (file)
@@ -1,5 +1,6 @@
 ; 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:
@@ -605,3 +606,66 @@ define i1 @and_icmps_const_1bit_diff_common_op(i32 %x, i32 %y) {
   %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
+}