summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2017-06-22 23:47:15 +0000
committerSanjay Patel <spatel@rotateright.com>2017-06-22 23:47:15 +0000
commit359ae44fb45205cea2a9a8f12bae9d3748f4e2ad (patch)
treea63014479ceec85805a42805be2191103aa87f7a /llvm/test
parent8456411e3bd4d50c807cc6b785cb49d344081dd3 (diff)
downloadbcm5719-llvm-359ae44fb45205cea2a9a8f12bae9d3748f4e2ad.tar.gz
bcm5719-llvm-359ae44fb45205cea2a9a8f12bae9d3748f4e2ad.zip
[x86] add/sub (X==0) --> sbb(cmp X, 1)
This is very similar to the transform in: https://reviews.llvm.org/rL306040 ...but in this case, we use cmp X, 1 to set the carry bit as needed. Again, we can show that all of these are logically equivalent (although InstCombine currently canonicalizes to a form not seen here), and if we believe IACA, then this is the smallest/fastest code. Eg, with SNB: | Num Of | Ports pressure in cycles | | | Uops | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | | --------------------------------------------------------------------- | 1 | 1.0 | | | | | | | cmp edi, 0x1 | 2 | | 1.0 | | | | 1.0 | CP | sbb eax, eax The larger motivation is to clean up all select-of-constants combining/lowering because we're missing some common cases. llvm-svn: 306072
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/X86/sbb.ll9
1 files changed, 3 insertions, 6 deletions
diff --git a/llvm/test/CodeGen/X86/sbb.ll b/llvm/test/CodeGen/X86/sbb.ll
index 61f639a7a95..409af00d3b2 100644
--- a/llvm/test/CodeGen/X86/sbb.ll
+++ b/llvm/test/CodeGen/X86/sbb.ll
@@ -75,9 +75,8 @@ define i64 @i64_select_neg1_or_0(i64 %x) {
define i32 @i32_select_neg1_or_0_as_math(i32 %x) {
; CHECK-LABEL: i32_select_neg1_or_0_as_math:
; CHECK: # BB#0:
-; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: cmpl $1, %edi
-; CHECK-NEXT: sbbl $0, %eax
+; CHECK-NEXT: sbbl %eax, %eax
; CHECK-NEXT: retq
%cmp = icmp eq i32 %x, 0
%ext = zext i1 %cmp to i32
@@ -91,8 +90,7 @@ define i16 @i16_select_neg1_or_0_commuted(i16 %x) {
; CHECK-LABEL: i16_select_neg1_or_0_commuted:
; CHECK: # BB#0:
; CHECK-NEXT: cmpw $1, %di
-; CHECK-NEXT: movw $-1, %ax
-; CHECK-NEXT: sbbw $-1, %ax
+; CHECK-NEXT: sbbw %ax, %ax
; CHECK-NEXT: retq
%cmp = icmp ne i16 %x, 0
%sel = select i1 %cmp, i16 0, i16 -1
@@ -105,8 +103,7 @@ define i8 @i8_select_neg1_or_0_commuted_as_math(i8 %x) {
; CHECK-LABEL: i8_select_neg1_or_0_commuted_as_math:
; CHECK: # BB#0:
; CHECK-NEXT: cmpb $1, %dil
-; CHECK-NEXT: movb $-1, %al
-; CHECK-NEXT: sbbb $-1, %al
+; CHECK-NEXT: sbbb %al, %al
; CHECK-NEXT: retq
%cmp = icmp ne i8 %x, 0
%ext = zext i1 %cmp to i8
OpenPOWER on IntegriCloud