| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
|
|
|
| |
Also, move the l-value emission code into CGObjC.cpp and teach it, for
completeness, to store away self for a super send.
Also, inline the super cases for property gets and sets and make them
use the correct result type for implicit getter/setter calls.
llvm-svn: 120887
|
|
|
|
|
|
| |
the l-value.
llvm-svn: 120884
|
|
|
|
| |
llvm-svn: 120881
|
|
|
|
| |
llvm-svn: 120879
|
|
|
|
| |
llvm-svn: 120878
|
|
|
|
| |
llvm-svn: 120812
|
|
|
|
|
|
| |
to distinguish vsri/vsli.
llvm-svn: 120806
|
|
|
|
| |
llvm-svn: 120746
|
|
|
|
|
|
| |
structs with references in them correctly.
llvm-svn: 120722
|
|
|
|
|
|
|
|
| |
objects imported into blocks. //rdar://8594790.
Will have a test case coming (as well as one
sent to llvm test suite).
llvm-svn: 120713
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
when an initializer is variable (I handled the constant case in a previous
patch). This has three pieces:
1. Enhance AggValueSlot to have a 'isZeroed' bit to tell CGExprAgg that
the memory being stored into has previously been memset to zero.
2. Teach CGExprAgg to not emit stores of zero to isZeroed memory.
3. Teach CodeGenFunction::EmitAggExpr to scan initializers to determine
whether they are profitable to emit a memset + inividual stores vs
stores for everything.
The heuristic used is that a global has to be more than 16 bytes and
has to be 3/4 zero to be candidate for this xform. The two testcases
are illustrative of the scenarios this catches. We now codegen test9 into:
call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 400, i32 4, i1 false)
%.array = getelementptr inbounds [100 x i32]* %Arr, i32 0, i32 0
%tmp = load i32* %X.addr, align 4
store i32 %tmp, i32* %.array
and test10 into:
call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 392, i32 8, i1 false)
%tmp = getelementptr inbounds %struct.b* %S, i32 0, i32 0
%tmp1 = getelementptr inbounds %struct.a* %tmp, i32 0, i32 0
%tmp2 = load i32* %X.addr, align 4
store i32 %tmp2, i32* %tmp1, align 4
%tmp5 = getelementptr inbounds %struct.b* %S, i32 0, i32 3
%tmp10 = getelementptr inbounds %struct.a* %tmp5, i32 0, i32 4
%tmp11 = load i32* %X.addr, align 4
store i32 %tmp11, i32* %tmp10, align 4
Previously we produced 99 stores of zero for test9 and also tons for test10.
This xforms should substantially speed up -O0 builds when it kicks in as well
as reducing code size and optimizer heartburn on insane cases. This resolves
PR279.
llvm-svn: 120692
|
|
|
|
| |
llvm-svn: 120688
|
|
|
|
|
|
| |
rdar://8560647
llvm-svn: 120650
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
a global is larger than 32 bytes and has fewer than 6 non-zero values in the
initializer. Previously we'd turn something like this:
char test8(int X) {
char str[10000] = "abc";
into a 10K global variable which we then memcpy'd from. Now we generate:
%str = alloca [10000 x i8], align 16
%tmp = getelementptr inbounds [10000 x i8]* %str, i64 0, i64 0
call void @llvm.memset.p0i8.i64(i8* %tmp, i8 0, i64 10000, i32 16, i1 false)
store i8 97, i8* %tmp, align 16
%0 = getelementptr [10000 x i8]* %str, i64 0, i64 1
store i8 98, i8* %0, align 1
%1 = getelementptr [10000 x i8]* %str, i64 0, i64 2
store i8 99, i8* %1, align 2
Which is much smaller in space and also likely faster.
This is part of PR279
llvm-svn: 120645
|
|
|
|
|
|
|
|
| |
ObjCPropertyRefExpr
into the latter.
llvm-svn: 120643
|
|
|
|
| |
llvm-svn: 120555
|
|
|
|
|
|
|
|
| |
http://llvm.org/bugs/show_bug.cgi?id=279#c3 better.
No functionality change yet.
llvm-svn: 120530
|
|
|
|
|
|
| |
using ConstantInt::get.
llvm-svn: 120527
|
|
|
|
|
|
|
| |
refer to opaque types, they must be held via PATypeHolders. I'm
not sure why this hasn't blown up before.
llvm-svn: 120491
|
|
|
|
| |
llvm-svn: 120489
|
|
|
|
|
|
|
| |
literal declaration caused crash in CodeGen.
This patch fixes it. pr8707
llvm-svn: 120486
|
|
|
|
| |
llvm-svn: 120433
|
|
|
|
|
|
| |
about the reliability of this yet.
llvm-svn: 120422
|
|
|
|
|
|
| |
type info for its component types
llvm-svn: 120401
|
|
|
|
| |
llvm-svn: 120297
|
|
|
|
| |
llvm-svn: 120268
|
|
|
|
| |
llvm-svn: 120257
|
|
|
|
| |
llvm-svn: 120252
|
|
|
|
| |
llvm-svn: 120251
|
|
|
|
| |
llvm-svn: 120250
|
|
|
|
| |
llvm-svn: 120249
|
|
|
|
| |
llvm-svn: 120153
|
|
|
|
| |
llvm-svn: 120140
|
|
|
|
| |
llvm-svn: 120133
|
|
|
|
| |
llvm-svn: 120132
|
|
|
|
| |
llvm-svn: 120129
|
|
|
|
| |
llvm-svn: 120118
|
|
|
|
|
|
| |
for anonymous tag types.
llvm-svn: 120113
|
|
|
|
| |
llvm-svn: 120112
|
|
|
|
|
|
| |
a name to the type.
llvm-svn: 120110
|
|
|
|
| |
llvm-svn: 120109
|
|
|
|
| |
llvm-svn: 120108
|
|
|
|
|
|
| |
exist. This matches ASTContext::getASTRecordLayout and is less confusing.
llvm-svn: 120107
|
|
|
|
| |
llvm-svn: 120106
|
|
|
|
| |
llvm-svn: 120084
|
|
|
|
|
|
| |
that aren't i8 arrays.
llvm-svn: 119980
|
|
|
|
| |
llvm-svn: 119957
|
|
|
|
| |
llvm-svn: 119956
|
|
|
|
| |
llvm-svn: 119955
|
|
|
|
| |
llvm-svn: 119924
|