[llvm] r265850 - [x86] show missed opportunities to use andn
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 8 14:26:12 PDT 2016
Author: spatel
Date: Fri Apr 8 16:26:11 2016
New Revision: 265850
URL: http://llvm.org/viewvc/llvm-project?rev=265850&view=rev
Log:
[x86] show missed opportunities to use andn
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=265850&r1=265849&r2=265850&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/bmi.ll (original)
+++ llvm/trunk/test/CodeGen/X86/bmi.ll Fri Apr 8 16:26:11 2016
@@ -136,6 +136,51 @@ define i64 @andn64(i64 %x, i64 %y) {
ret i64 %tmp2
}
+; FIXME: Don't choose a 'test' if an 'andn' can be used.
+define i1 @andn_cmp(i32 %x, i32 %y) {
+; CHECK-LABEL: andn_cmp:
+; CHECK: # BB#0:
+; CHECK-NEXT: notl %edi
+; CHECK-NEXT: testl %esi, %edi
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+;
+ %notx = xor i32 %x, -1
+ %and = and i32 %notx, %y
+ %cmp = icmp eq i32 %and, 0
+ ret i1 %cmp
+}
+
+; FIXME: 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:
+; CHECK: # BB#0:
+; CHECK-NEXT: notq %rdi
+; CHECK-NEXT: testq %rdi, %rsi
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+;
+ %notx = xor i64 %x, -1
+ %and = and i64 %y, %notx
+ %cmp = icmp eq i64 %and, 0
+ ret i1 %cmp
+}
+
+; Use a 'test' (not an 'and') because 'andn' only works for i32/i64.
+define i1 @andn_cmp_i8(i8 %x, i8 %y) {
+; CHECK-LABEL: andn_cmp_i8:
+; CHECK: # BB#0:
+; CHECK-NEXT: notb %sil
+; CHECK-NEXT: testb %sil, %dil
+; CHECK-NEXT: sete %al
+; CHECK-NEXT: retq
+;
+ %noty = xor i8 %y, -1
+ %and = and i8 %x, %noty
+ %cmp = icmp eq i8 %and, 0
+ ret i1 %cmp
+}
+
define i32 @bextr32(i32 %x, i32 %y) {
; CHECK-LABEL: bextr32:
; CHECK: # BB#0:
More information about the llvm-commits
mailing list