[llvm] r266243 - [x86] add tests to show potential BMI optimization

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 13 13:40:44 PDT 2016


Author: spatel
Date: Wed Apr 13 15:40:43 2016
New Revision: 266243

URL: http://llvm.org/viewvc/llvm-project?rev=266243&view=rev
Log:
[x86] add tests to show potential BMI optimization

Modified:
    llvm/trunk/test/CodeGen/X86/bmi.ll

Modified: llvm/trunk/test/CodeGen/X86/bmi.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/bmi.ll?rev=266243&r1=266242&r2=266243&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/bmi.ll (original)
+++ llvm/trunk/test/CodeGen/X86/bmi.ll Wed Apr 13 15:40:43 2016
@@ -150,6 +150,74 @@ define i1 @andn_cmp(i32 %x, i32 %y) {
   ret i1 %cmp
 }
 
+; TODO: Recognize a disguised andn in the following 4 tests.
+define i1 @and_cmp1(i32 %x, i32 %y) {
+; CHECK-LABEL: and_cmp1:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    andl %esi, %edi
+; CHECK-NEXT:    cmpl %esi, %edi
+; CHECK-NEXT:    sete %al
+; CHECK-NEXT:    retq
+;
+  %and = and i32 %x, %y
+  %cmp = icmp eq i32 %and, %y
+  ret i1 %cmp
+}
+
+define i1 @and_cmp2(i32 %x, i32 %y) {
+; CHECK-LABEL: and_cmp2:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    andl %esi, %edi
+; CHECK-NEXT:    cmpl %esi, %edi
+; CHECK-NEXT:    setne %al
+; CHECK-NEXT:    retq
+;
+  %and = and i32 %y, %x
+  %cmp = icmp ne i32 %and, %y
+  ret i1 %cmp
+}
+
+define i1 @and_cmp3(i32 %x, i32 %y) {
+; CHECK-LABEL: and_cmp3:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    andl %esi, %edi
+; CHECK-NEXT:    cmpl %edi, %esi
+; CHECK-NEXT:    sete %al
+; CHECK-NEXT:    retq
+;
+  %and = and i32 %x, %y
+  %cmp = icmp eq i32 %y, %and
+  ret i1 %cmp
+}
+
+define i1 @and_cmp4(i32 %x, i32 %y) {
+; CHECK-LABEL: and_cmp4:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    andl %esi, %edi
+; CHECK-NEXT:    cmpl %edi, %esi
+; CHECK-NEXT:    setne %al
+; CHECK-NEXT:    retq
+;
+  %and = and i32 %y, %x
+  %cmp = icmp ne i32 %y, %and
+  ret i1 %cmp
+}
+
+; A mask and compare against constant is ok for an 'andn' too
+; even though the BMI instruction doesn't have an immediate form.
+define i1 @and_cmp_const(i32 %x) {
+; CHECK-LABEL: and_cmp_const:
+; CHECK:       # BB#0:
+; CHECK-NEXT:    andl $43, %edi
+; CHECK-NEXT:    cmpl $43, %edi
+; CHECK-NEXT:    sete %al
+; CHECK-NEXT:    retq
+;
+  %and = and i32 %x, 43
+  %cmp = icmp eq i32 %and, 43
+  ret i1 %cmp
+}
+
 ; Don't choose a 'test' if an 'andn' can be used.
 define i1 @andn_cmp_swap_ops(i64 %x, i64 %y) {
 ; CHECK-LABEL: andn_cmp_swap_ops:




More information about the llvm-commits mailing list