diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2010-06-14 07:03:30 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2010-06-14 07:03:30 +0000 |
commit | e103194851df47318af456aa3478911cf0279336 (patch) | |
tree | 4c9303d32a34c334487f957c98f72c44af45b1b0 | |
parent | 2214b811961285ae4b857598dfee538bc456ad2e (diff) | |
download | external_llvm-e103194851df47318af456aa3478911cf0279336.zip external_llvm-e103194851df47318af456aa3478911cf0279336.tar.gz external_llvm-e103194851df47318af456aa3478911cf0279336.tar.bz2 |
Add back some possible optimizations for va_arg, with wording that makes it
more clear what exactly is missing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105934 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/README-X86-64.txt | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/Target/X86/README-X86-64.txt b/lib/Target/X86/README-X86-64.txt index b7ebc46..78c4dc0 100644 --- a/lib/Target/X86/README-X86-64.txt +++ b/lib/Target/X86/README-X86-64.txt @@ -240,3 +240,34 @@ Issues: expensive addressing mode. //===---------------------------------------------------------------------===// + +Consider the following (contrived testcase, but contains common factors): + +#include <stdarg.h> +int test(int x, ...) { + int sum, i; + va_list l; + va_start(l, x); + for (i = 0; i < x; i++) + sum += va_arg(l, int); + va_end(l); + return sum; +} + +Testcase given in C because fixing it will likely involve changing the IR +generated for it. The primary issue with the result is that it doesn't do any +of the optimizations which are possible if we know the address of a va_list +in the current function is never taken: +1. We shouldn't spill the XMM registers because we only call va_arg with "int". +2. It would be nice if we could scalarrepl the va_list. +3. Probably overkill, but it'd be cool if we could peel off the first five +iterations of the loop. + +Other optimizations involving functions which use va_arg on floats which don't +have the address of a va_list taken: +1. Conversely to the above, we shouldn't spill general registers if we only + call va_arg on "double". +2. If we know nothing more than 64 bits wide is read from the XMM registers, + we can change the spilling code to reduce the amount of stack used by half. + +//===---------------------------------------------------------------------===// |