From 313a94c3d0bf0f0a6e0f8083d09f2fb3add9753f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 19 Sep 2010 00:37:34 +0000 Subject: [PATCH] idiom recognition should catch this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114304 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/README.txt | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 4faf8bcfd41..32e7385d23a 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -2,6 +2,38 @@ Target Independent Opportunities: //===---------------------------------------------------------------------===// +We should recognize idioms for add-with-carry and turn it into the appropriate +intrinsics. This example: + +unsigned add32carry(unsigned sum, unsigned x) { + unsigned z = sum + x; + if (sum + x < x) + z++; + return z; +} + +Compiles to: clang t.c -S -o - -O3 -fomit-frame-pointer -m64 -mkernel + +_add32carry: ## @add32carry + addl %esi, %edi + cmpl %esi, %edi + sbbl %eax, %eax + andl $1, %eax + addl %edi, %eax + ret + +with clang, but to: + +_add32carry: + leal (%rsi,%rdi), %eax + cmpl %esi, %eax + adcl $0, %eax + ret + +with gcc. + +//===---------------------------------------------------------------------===// + Dead argument elimination should be enhanced to handle cases when an argument is dead to an externally visible function. Though the argument can't be removed from the externally visible function, the caller doesn't need to pass it in. -- 2.34.1