- Feb 03, 2009
-
-
Chris Lattner authored
accessed at least once as a vector. This prevents it from compiling the example in not-a-vector into: define double @test(double %A, double %B) { %tmp4 = insertelement <7 x double> undef, double %A, i32 0 %tmp = insertelement <7 x double> %tmp4, double %B, i32 4 %tmp2 = extractelement <7 x double> %tmp, i32 4 ret double %tmp2 } instead, producing the integer code. Producing vectors when they aren't otherwise in the program is dangerous because a lot of other code treats them carefully and doesn't want to break them down. OTOH, many things want to break down tasty i448's. llvm-svn: 63638
-
Chris Lattner authored
llvm-svn: 63620
-
Chris Lattner authored
crazy cases like: struct f { int A, B, C, D, E, F; }; short test4() { struct f A; A.A = 1; memset(&A.B, 2, 12); return A.C; } llvm-svn: 63596
-
Chris Lattner authored
With the new world order, it can handle cases where the first store into the alloca is an element of the vector, instead of requiring the first analyzed store to have the vector type itself. This allows us to un-xfail test/CodeGen/X86/vec_ins_extract.ll. llvm-svn: 63590
-
- Feb 02, 2009
-
-
Chris Lattner authored
llvm-svn: 63544
-
Chris Lattner authored
tests. Thanks for the beautiful reduced testcase Duncan! llvm-svn: 63529
-
Duncan Sands authored
and remove trailing whitespace. No functionality change. llvm-svn: 63511
-
Duncan Sands authored
llvm-svn: 63510
-
- Jan 31, 2009
-
-
Chris Lattner authored
be able to handle *ANY* alloca that is poked by loads and stores of bitcasts and GEPs with constant offsets. Before the code had a number of annoying limitations and caused it to miss cases such as storing into holes in structs and complex casts (as in bitfield-sroa) where we had unions of bitfields etc. This also handles a number of important cases that are exposed due to the ABI lowering stuff we do to pass stuff by value. One case that is pretty great is that we compile 2006-11-07-InvalidArrayPromote.ll into: define i32 @func(<4 x float> %v0, <4 x float> %v1) nounwind { %tmp10 = call <4 x i32> @llvm.x86.sse2.cvttps2dq(<4 x float> %v1) %tmp105 = bitcast <4 x i32> %tmp10 to i128 %tmp1056 = zext i128 %tmp105 to i256 %tmp.upgrd.43 = lshr i256 %tmp1056, 96 %tmp.upgrd.44 = trunc i256 %tmp.upgrd.43 to i32 ret i32 %tmp.upgrd.44 } which turns into: _func: subl $28, %esp cvttps2dq %xmm1, %xmm0 movaps %xmm0, (%esp) movl 12(%esp), %eax addl $28, %esp ret Which is pretty good code all things considering :). One effect of this is that SROA will start generating arbitrary bitwidth integers that are a multiple of 8 bits. In the case above, we got a 256 bit integer, but the codegen guys assure me that it can handle the simple and/or/shift/zext stuff that we're doing on these operations. This addresses rdar://6532315 llvm-svn: 63469
-
- Jan 28, 2009
-
-
Chris Lattner authored
after the others. llvm-svn: 63227
-
- Jan 12, 2009
-
-
Duncan Sands authored
suggested by Chris. llvm-svn: 62099
-
- Jan 09, 2009
-
-
Chris Lattner authored
llvm-svn: 61995
-
- Jan 08, 2009
-
-
Chris Lattner authored
loads from allocas that cover the entire aggregate. This handles some memcpy/byval cases that are produced by llvm-gcc. This triggers a few times in kc++ (with std::pair<std::_Rb_tree_const_iterator <kc::impl_abstract_phylum*>,bool>) and once in 176.gcc (with %struct..0anon). llvm-svn: 61915
-
- Jan 07, 2009
-
-
Chris Lattner authored
integer to a (transitive) bitcast the alloca and if that integer has the full size of the alloca, then it clobbers the whole thing. Handle this by extracting pieces out of the stored integer and filing them away in the SROA'd elements. This triggers fairly frequently because the CFE uses integers to pass small structs by value and the inliner exposes these. For example, in kimwitu++, I see a bunch of these with i64 stores to "%struct.std::pair<std::_Rb_tree_const_iterator<kc::impl_abstract_phylum*>,bool>" In 176.gcc I see a few i32 stores to "%struct..0anon". In the testcase, this is a difference between compiling test1 to: _test1: subl $12, %esp movl 20(%esp), %eax movl %eax, 4(%esp) movl 16(%esp), %eax movl %eax, (%esp) movl (%esp), %eax addl 4(%esp), %eax addl $12, %esp ret vs: _test1: movl 8(%esp), %eax addl 4(%esp), %eax ret The second half of this will be to handle loads of the same form. llvm-svn: 61853
-
Chris Lattner authored
llvm-svn: 61852
-
Chris Lattner authored
change. llvm-svn: 61851
-
Chris Lattner authored
requerying it all over the place. llvm-svn: 61850
-
Chris Lattner authored
code, no functionality change. llvm-svn: 61849
-
- Nov 04, 2008
-
-
Dale Johannesen authored
huge performance regression in something we care about. This may not be final fix. llvm-svn: 58718
-
- Oct 06, 2008
-
-
Matthijs Kooijman authored
This includes not marking a GEP involving a vector as unsafe, but only when it has all zero indices. This allows scalarrepl to work in a few more cases. llvm-svn: 57177
-
- Sep 04, 2008
-
-
Dan Gohman authored
llvm-svn: 55779
-
- Aug 23, 2008
-
-
Chris Lattner authored
indices that start with an array subscript. x->field[10000] is just as bad as (*X)[14][10000]. llvm-svn: 55226
-
- Jun 23, 2008
-
-
Chris Lattner authored
llvm-svn: 52630
-
- Jun 22, 2008
-
-
Chris Lattner authored
structures. Its default threshold is to promote things that are smaller than 128 bytes, which is sane. However, it is not sane to do this for things that turn into 128 *registers*. Add a cap on the number of registers introduced, defaulting to 128/4=32. llvm-svn: 52611
-
- Jun 05, 2008
-
-
Matthijs Kooijman authored
work and how to replace them into individual values. Also, when trying to replace an aggregrate that is used by load or store with a single (large) integer, don't crash (but don't replace the aggregrate either). Also adds a testcase for both structs and arrays. llvm-svn: 51997
-
- Jun 04, 2008
-
-
Duncan Sands authored
are the same as in unpacked structs, only field positions differ. This only matters for structs containing x86 long double or an apint; it may cause backwards compatibility problems if someone has bitcode containing a packed struct with a field of one of those types. The issue is that only 10 bytes are needed to hold an x86 long double: the store size is 10 bytes, but the ABI size is 12 or 16 bytes (linux/ darwin) which comes from rounding the store size up by the alignment. Because it seemed silly not to pack an x86 long double into 10 bytes in a packed struct, this is what was done. I now think this was a mistake. Reserving the ABI size for an x86 long double field even in a packed struct makes things more uniform: the ABI size is now always used when reserving space for a type. This means that developers are less likely to make mistakes. It also makes life easier for the CBE which otherwise could not represent all LLVM packed structs (PR2402). Front-end people might need to adjust the way they create LLVM structs - see following change to llvm-gcc. llvm-svn: 51928
-
- May 23, 2008
-
-
Dan Gohman authored
exclude struct and array types. llvm-svn: 51456
-
- May 16, 2008
-
-
Gabor Greif authored
API change for {BinaryOperator|CmpInst|CastInst}::create*() --> Create. Legacy interfaces will be in place for some time. (Merge from use-diet branch.) llvm-svn: 51200
-
- May 13, 2008
-
-
Dan Gohman authored
several things that were neither in an anonymous namespace nor static but not intended to be global. llvm-svn: 51017
-
- Apr 06, 2008
-
-
Gabor Greif authored
Specifically, introduction of XXX::Create methods for Users that have a potentially variable number of Uses. llvm-svn: 49277
-
- Feb 29, 2008
-
-
Chris Lattner authored
a union containing a vector and an array whose elements were smaller than the vector elements. this means we need to compile the load of the array elements into an extract element plus a truncate. llvm-svn: 47752
-
Chris Lattner authored
functionality change. llvm-svn: 47751
-
- Feb 10, 2008
-
-
Chris Lattner authored
This fixes the store case, my previous patch just fixed the load case. rdar://5707076. llvm-svn: 46932
-
- Jan 30, 2008
-
-
Chris Lattner authored
In practice this can only happen on code with already undefined behavior, but this is still a good thing to handle correctly. llvm-svn: 46539
-
- Dec 29, 2007
-
-
Chris Lattner authored
llvm-svn: 45418
-
- Nov 06, 2007
-
-
Duncan Sands authored
type of SV has changed from what it originally was. However we need the store width of the original. llvm-svn: 43775
-
- Nov 05, 2007
-
-
Duncan Sands authored
that there is no padding. llvm-svn: 43691
-
- Nov 04, 2007
-
-
Duncan Sands authored
or getTypeSizeInBits as appropriate in ScalarReplAggregates. The right change to make was not always obvious, so it would be good to have an sroa guru review this. While there I noticed some bugs, and fixed them: (1) arrays of x86 long double have holes due to alignment padding, but this wasn't being spotted by HasStructPadding (renamed to HasPadding). The same goes for arrays of oddly sized ints. Vectors also suffer from this, in fact the problem for vectors is much worse because basic vector assumptions seem to be broken by vectors of type with alignment padding. I didn't try to fix any of these vector problems. (2) The code for extracting smaller integers from larger ones (in the "int union" case) was wrong on big-endian machines for integers with size not a multiple of 8, like i1. Probably this is impossible to hit via llvm-gcc, but I fixed it anyway while there and added a testcase. I also got rid of some trailing whitespace and changed a function name which had an obvious typo in it. llvm-svn: 43672
-
- Sep 28, 2007
-
-
Dale Johannesen authored
Fixes a SWB crash. llvm-svn: 42422
-
- Sep 04, 2007
-
-
David Greene authored
Update GEP constructors to use an iterator interface to fix GLIBCXX_DEBUG issues. llvm-svn: 41697
-