summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2010-06-14 07:03:30 +0000
committerEli Friedman <eli.friedman@gmail.com>2010-06-14 07:03:30 +0000
commite103194851df47318af456aa3478911cf0279336 (patch)
tree4c9303d32a34c334487f957c98f72c44af45b1b0
parent2214b811961285ae4b857598dfee538bc456ad2e (diff)
downloadllvm-e103194851df47318af456aa3478911cf0279336.tar.gz
llvm-e103194851df47318af456aa3478911cf0279336.tar.bz2
llvm-e103194851df47318af456aa3478911cf0279336.tar.xz
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.txt31
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 b7ebc461f3..78c4dc00ee 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.
+
+//===---------------------------------------------------------------------===//