]> granicus.if.org Git - clang/commit
Change IR generation for return (in the simple case) to avoid doing silly
authorChris Lattner <sabre@nondot.org>
Sun, 27 Jun 2010 01:06:27 +0000 (01:06 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 27 Jun 2010 01:06:27 +0000 (01:06 +0000)
commit35b21b884e5c3447a52a74d7ffaba966b07ac81f
tree77b1e2a68f1b253828bbe3d6891c6ec12c677219
parentc6e6dd2611bccd0d4df1f83a92bebb9b5d139b7d
Change IR generation for return (in the simple case) to avoid doing silly
load/store nonsense in the epilog.  For example, for:

int foo(int X) {
  int A[100];
  return A[X];
}

we used to generate:

  %arrayidx = getelementptr inbounds [100 x i32]* %A, i32 0, i64 %idxprom ; <i32*> [#uses=1]
  %tmp1 = load i32* %arrayidx                     ; <i32> [#uses=1]
  store i32 %tmp1, i32* %retval
  %0 = load i32* %retval                          ; <i32> [#uses=1]
  ret i32 %0
}

which codegen'd to this code:

_foo:                                   ## @foo
## BB#0:                                ## %entry
subq $408, %rsp              ## imm = 0x198
movl %edi, 400(%rsp)
movl 400(%rsp), %edi
movslq %edi, %rax
movl (%rsp,%rax,4), %edi
movl %edi, 404(%rsp)
movl 404(%rsp), %eax
addq $408, %rsp              ## imm = 0x198
ret

Now we generate:

  %arrayidx = getelementptr inbounds [100 x i32]* %A, i32 0, i64 %idxprom ; <i32*> [#uses=1]
  %tmp1 = load i32* %arrayidx                     ; <i32> [#uses=1]
  ret i32 %tmp1
}

and:

_foo:                                   ## @foo
## BB#0:                                ## %entry
subq $408, %rsp              ## imm = 0x198
movl %edi, 404(%rsp)
movl 404(%rsp), %edi
movslq %edi, %rax
movl (%rsp,%rax,4), %eax
addq $408, %rsp              ## imm = 0x198
ret

This actually does matter, cutting out 2000 lines of IR from CGStmt.ll
for example.

Another interesting effect is that altivec.h functions which are dead
now get dce'd by the inliner.  Hence all the changes to
builtins-ppc-altivec.c to ensure the calls aren't dead.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106970 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CGCall.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/CodeGen/CodeGenFunction.h
test/CodeGen/2008-07-29-override-alias-decl.c
test/CodeGen/2008-12-02-logical-or-fold.c
test/CodeGen/builtins-ppc-altivec.c
test/CodeGen/const-unordered-compare.c
test/CodeGenCXX/references.cpp