[llvm-commits] [125900] Apply a patch from Lauro:
clattner at apple.com
clattner at apple.com
Sun Apr 8 11:39:16 PDT 2007
Revision: 125900
Author: clattner
Date: 2007-04-08 11:39:16 -0700 (Sun, 08 Apr 2007)
Log Message:
-----------
Apply a patch from Lauro:
"This patch makes llvm-gcc use arrays to lower function arguments. For
example a 30 bytes parameter is lowered to { [3 x i64], i32, i16}
instead of { i64, i64, i64, i32, i16}. This reduces the size of ll
file generated from lencod/rdopt.c from 17M to 1.2M."
Thanks Lauro!
Modified Paths:
--------------
apple-local/branches/llvm/gcc/llvm-abi.h
Modified: apple-local/branches/llvm/gcc/llvm-abi.h
===================================================================
--- apple-local/branches/llvm/gcc/llvm-abi.h 2007-04-08 16:42:56 UTC (rev 125899)
+++ apple-local/branches/llvm/gcc/llvm-abi.h 2007-04-08 18:39:16 UTC (rev 125900)
@@ -283,18 +283,23 @@
// Consider cases like { int, int } and {int, short} for example! This will
// produce far better LLVM code!
std::vector<const Type*> Elts;
- if (UseInt64) {
- for (; Size >= 8; Size -= 8)
- Elts.push_back(Type::Int64Ty);
- if (Size >= 4) {
- Elts.push_back(Type::Int32Ty);
- Size -= 4;
- }
- } else {
- for (; Size >= 4; Size -= 4)
- Elts.push_back(Type::Int32Ty);
+
+ unsigned ElementSize = UseInt64 ? 8:4;
+ unsigned ArraySize = Size / ElementSize;
+
+ const Type *ATy = NULL;
+ const Type *ArrayElementType = NULL;
+ if (ArraySize) {
+ Size = Size % ElementSize;
+ ArrayElementType = (UseInt64)?Type::Int64Ty:Type::Int32Ty;
+ ATy = ArrayType::get(ArrayElementType, ArraySize);
+ Elts.push_back(ATy);
}
+ if (Size >= 4) {
+ Elts.push_back(Type::Int32Ty);
+ Size -= 4;
+ }
if (Size >= 2) {
Elts.push_back(Type::Int16Ty);
Size -= 2;
@@ -306,7 +311,18 @@
assert(Size == 0 && "Didn't cover value?");
const StructType *STy = StructType::get(Elts, false);
- for (unsigned i = 0, e = Elts.size(); i != e; ++i) {
+ unsigned i = 0;
+ if (ArraySize) {
+ C.EnterField(0, STy);
+ for (unsigned j = 0; j < ArraySize; ++j) {
+ C.EnterField(j, ATy);
+ C.HandleScalarArgument(ArrayElementType, 0);
+ C.ExitField();
+ }
+ C.ExitField();
+ ++i;
+ }
+ for (unsigned e = Elts.size(); i != e; ++i) {
C.EnterField(i, STy);
C.HandleScalarArgument(Elts[i], 0);
C.ExitField();
More information about the llvm-commits
mailing list