aboutsummaryrefslogtreecommitdiffstats
path: root/test/CodeGen/X86/iabs.ll
diff options
context:
space:
mode:
authorManman Ren <mren@apple.com>2012-06-07 22:39:10 +0000
committerManman Ren <mren@apple.com>2012-06-07 22:39:10 +0000
commit9236362a64ce1609222512fe3f17eeb886a3ddea (patch)
treecb91606183c09759e1c7b415ea72c4665025cc7c /test/CodeGen/X86/iabs.ll
parentfa371eaff3c06b4d5a5ff5706a552f519b469756 (diff)
downloadexternal_llvm-9236362a64ce1609222512fe3f17eeb886a3ddea.zip
external_llvm-9236362a64ce1609222512fe3f17eeb886a3ddea.tar.gz
external_llvm-9236362a64ce1609222512fe3f17eeb886a3ddea.tar.bz2
X86: optimize generated code for integer ABS
This patch will generate the following for integer ABS: movl %edi, %eax negl %eax cmovll %edi, %eax INSTEAD OF movl %edi, %ecx sarl $31, %ecx leal (%rdi,%rcx), %eax xorl %ecx, %eax There exists a target-independent DAG combine for integer ABS, which converts integer ABS to sar+add+xor. For X86, we match this pattern back to neg+cmov. This is implemented in PerformXorCombine. rdar://10695237 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158175 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86/iabs.ll')
-rw-r--r--test/CodeGen/X86/iabs.ll16
1 files changed, 10 insertions, 6 deletions
diff --git a/test/CodeGen/X86/iabs.ll b/test/CodeGen/X86/iabs.ll
index a8ba015..9196cce 100644
--- a/test/CodeGen/X86/iabs.ll
+++ b/test/CodeGen/X86/iabs.ll
@@ -1,13 +1,17 @@
-; RUN: llc < %s -march=x86-64 -stats |& \
-; RUN: grep {5 .*Number of machine instrs printed}
+; RUN: llc < %s -march=x86-64 | FileCheck %s
;; Integer absolute value, should produce something at least as good as:
-;; movl %edi, %ecx
-;; sarl $31, %ecx
-;; leal (%rdi,%rcx), %eax
-;; xorl %ecx, %eax
+;; movl %edi, %eax
+;; negl %eax
+;; cmovll %edi, %eax
;; ret
+; rdar://10695237
define i32 @test(i32 %a) nounwind {
+; CHECK: test:
+; CHECK: mov
+; CHECK-NEXT: neg
+; CHECK-NEXT: cmov
+; CHECK-NEXT: ret
%tmp1neg = sub i32 0, %a
%b = icmp sgt i32 %a, -1
%abs = select i1 %b, i32 %a, i32 %tmp1neg