target-indep codegen memcpy lowering issue.
authorChris Lattner <sabre@nondot.org>
Thu, 28 Feb 2008 05:34:27 +0000 (05:34 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 28 Feb 2008 05:34:27 +0000 (05:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47705 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/README.txt

index ef63b9f913f7ef78483f56d6744cd715b5acaed9..0096b0f9f42f100dd3950b625ac5599732fb66cc 100644 (file)
@@ -628,3 +628,47 @@ to know that it doesn't modify G either.  This is very tricky.
 
 We should add an FRINT node to the DAG to model targets that have legal
 implementations of ceil/floor/rint.
+
+//===---------------------------------------------------------------------===//
+
+Consider:
+
+int test() {
+  long long input[8] = {1,1,1,1,1,1,1,1};
+  foo(input);
+}
+
+We currently compile this into a memcpy from a global array since the 
+initializer is fairly large and not memset'able.  This is good, but the memcpy
+gets lowered to load/stores in the code generator.  This is also ok, except
+that the codegen lowering for memcpy doesn't handle the case when the source
+is a constant global.  This gives us atrocious code like this:
+
+       call    "L1$pb"
+"L1$pb":
+       popl    %eax
+       movl    _C.0.1444-"L1$pb"+32(%eax), %ecx
+       movl    %ecx, 40(%esp)
+       movl    _C.0.1444-"L1$pb"+20(%eax), %ecx
+       movl    %ecx, 28(%esp)
+       movl    _C.0.1444-"L1$pb"+36(%eax), %ecx
+       movl    %ecx, 44(%esp)
+       movl    _C.0.1444-"L1$pb"+44(%eax), %ecx
+       movl    %ecx, 52(%esp)
+       movl    _C.0.1444-"L1$pb"+40(%eax), %ecx
+       movl    %ecx, 48(%esp)
+       movl    _C.0.1444-"L1$pb"+12(%eax), %ecx
+       movl    %ecx, 20(%esp)
+       movl    _C.0.1444-"L1$pb"+4(%eax), %ecx
+...
+
+instead of:
+       movl    $1, 16(%esp)
+       movl    $0, 20(%esp)
+       movl    $1, 24(%esp)
+       movl    $0, 28(%esp)
+       movl    $1, 32(%esp)
+       movl    $0, 36(%esp)
+       ...
+
+//===---------------------------------------------------------------------===//