Chris Lattner
9af2484c39
tidy up code.
...
llvm-svn: 123564
2011-01-16 04:37:29 +00:00
Owen Anderson
6e0fa67f91
Improve the safety of my globalopt enhancement by ensuring that the bitcast
...
of the stored value to the new store type is always. Also, add a testcase.
llvm-svn: 123563
2011-01-16 04:33:33 +00:00
Chris Lattner
e3d0c7819e
simplify this code, it is still broken but will follow up on llvm-commits.
...
llvm-svn: 123558
2011-01-16 02:05:10 +00:00
Chris Lattner
75599bb566
remove the partial specialization pass. It is unmaintained and has bugs.
...
llvm-svn: 123554
2011-01-16 00:27:10 +00:00
Nick Lewycky
7e71443cf2
Add missing whitespace.
...
llvm-svn: 123543
2011-01-15 18:42:52 +00:00
Nick Lewycky
1d57e867a4
Make constmerge a two-pass algorithm so that it won't miss merging
...
opporuntities. Fixes PR8978.
llvm-svn: 123541
2011-01-15 18:14:21 +00:00
Benjamin Kramer
91f0608676
Try to unbreak selfhost.
...
llvm-svn: 123537
2011-01-15 11:25:34 +00:00
Nick Lewycky
9293c403d8
Add a cache that protects mergefunc's internals from more surprises in DenseSet.
...
Also, replace tabs with spaces. Yes, it's 2011.
llvm-svn: 123535
2011-01-15 10:16:23 +00:00
Chris Lattner
55c2150f36
temporarily revert r123526. While working on a follow-on patch I
...
realize that ConstantFoldTerminator doesn't preserve dominfo.
llvm-svn: 123527
2011-01-15 07:51:19 +00:00
Chris Lattner
68a47147ba
fix rdar://8785296 - -fcatch-undefined-behavior generates inefficient code
...
The basic issue is that isel (very reasonably!) expects conditional branches
to be folded, so CGP leaving around a bunch dead computation feeding
conditional branches isn't such a good idea. Just fold branches on constants
into unconditional branches.
llvm-svn: 123526
2011-01-15 07:36:13 +00:00
Chris Lattner
2a7c042c37
simplify code, no functionality change.
...
llvm-svn: 123525
2011-01-15 07:29:01 +00:00
Chris Lattner
d4eaf6eba8
Now that instruction optzns can update the iterator as they go, we can
...
have objectsize folding recursively simplify away their result when it
folds. It is important to catch this here, because otherwise we won't
eliminate the cross-block values at isel and other times.
llvm-svn: 123524
2011-01-15 07:25:29 +00:00
Chris Lattner
939e77a0df
make the current instruction iterator an ivar, allowing xforms that
...
potentially invalidate it (like inline asm lowering) to be sunk into
their proper place, cleaning up a ton of code.
llvm-svn: 123523
2011-01-15 07:14:54 +00:00
Chris Lattner
74ed5d30ca
implement an instcombine xform that canonicalizes casts outside of and-with-constant operations.
...
This fixes rdar://8808586 which observed that we used to compile:
union xy {
struct x { _Bool b[15]; } x;
__attribute__((packed))
struct y {
__attribute__((packed)) unsigned long b0to7;
__attribute__((packed)) unsigned int b8to11;
__attribute__((packed)) unsigned short b12to13;
__attribute__((packed)) unsigned char b14;
} y;
};
struct x
foo(union xy *xy)
{
return xy->x;
}
into:
_foo: ## @foo
movq (%rdi), %rax
movabsq $1095216660480, %rcx ## imm = 0xFF00000000
andq %rax, %rcx
movabsq $-72057594037927936, %rdx ## imm = 0xFF00000000000000
andq %rax, %rdx
movzbl %al, %esi
orq %rdx, %rsi
movq %rax, %rdx
andq $65280, %rdx ## imm = 0xFF00
orq %rsi, %rdx
movq %rax, %rsi
andq $16711680, %rsi ## imm = 0xFF0000
orq %rdx, %rsi
movl %eax, %edx
andl $-16777216, %edx ## imm = 0xFFFFFFFFFF000000
orq %rsi, %rdx
orq %rcx, %rdx
movabsq $280375465082880, %rcx ## imm = 0xFF0000000000
movq %rax, %rsi
andq %rcx, %rsi
orq %rdx, %rsi
movabsq $71776119061217280, %r8 ## imm = 0xFF000000000000
andq %r8, %rax
orq %rsi, %rax
movzwl 12(%rdi), %edx
movzbl 14(%rdi), %esi
shlq $16, %rsi
orl %edx, %esi
movq %rsi, %r9
shlq $32, %r9
movl 8(%rdi), %edx
orq %r9, %rdx
andq %rdx, %rcx
movzbl %sil, %esi
shlq $32, %rsi
orq %rcx, %rsi
movl %edx, %ecx
andl $-16777216, %ecx ## imm = 0xFFFFFFFFFF000000
orq %rsi, %rcx
movq %rdx, %rsi
andq $16711680, %rsi ## imm = 0xFF0000
orq %rcx, %rsi
movq %rdx, %rcx
andq $65280, %rcx ## imm = 0xFF00
orq %rsi, %rcx
movzbl %dl, %esi
orq %rcx, %rsi
andq %r8, %rdx
orq %rsi, %rdx
ret
We now compile this into:
_foo: ## @foo
## BB#0: ## %entry
movzwl 12(%rdi), %eax
movzbl 14(%rdi), %ecx
shlq $16, %rcx
orl %eax, %ecx
shlq $32, %rcx
movl 8(%rdi), %edx
orq %rcx, %rdx
movq (%rdi), %rax
ret
A small improvement :-)
llvm-svn: 123520
2011-01-15 06:32:33 +00:00
Chris Lattner
0868c29c36
one more instcombine variant that is needed to work with future changes,
...
no functionality change currently.
llvm-svn: 123517
2011-01-15 05:50:18 +00:00
Chris Lattner
360fedf20a
fix typo
...
llvm-svn: 123516
2011-01-15 05:42:47 +00:00
Chris Lattner
ca796e7838
Catch ~x < cst just like ~x < ~y, we currently handle this through
...
means that are about to disappear.
llvm-svn: 123515
2011-01-15 05:41:33 +00:00
Chris Lattner
06849c1228
reduce indentation
...
llvm-svn: 123514
2011-01-15 05:40:29 +00:00
Chris Lattner
e6d5b3c4ce
Generalize LoadAndStorePromoter a bit and switch LICM
...
to use it.
llvm-svn: 123501
2011-01-15 00:12:35 +00:00
Owen Anderson
63902f2c99
Fix a false-positive warning.
...
llvm-svn: 123480
2011-01-14 22:31:13 +00:00
Owen Anderson
51dcd56f96
Enhance GlobalOpt to be able evaluate initializers that involve stores through
...
bitcasts, at least in simple cases. This fixes clang's CodeGenCXX/virtual-base-dtor.cpp
llvm-svn: 123477
2011-01-14 22:19:20 +00:00
Chris Lattner
1ce35a0362
switch SRoA to use LoadAndStorePromoter instead of its own copy of the code.
...
llvm-svn: 123457
2011-01-14 19:50:47 +00:00
Chris Lattner
2cf8e75d34
Add a new LoadAndStorePromoter class, which implements the general
...
"promote a bunch of load and stores" logic, allowing the code to
be shared and reused.
llvm-svn: 123456
2011-01-14 19:36:13 +00:00
Chris Lattner
8e171470d3
split SROA into two passes: one that uses DomFrontiers (-scalarrepl)
...
and one that uses SSAUpdater (-scalarrepl-ssa)
llvm-svn: 123436
2011-01-14 08:13:00 +00:00
Chris Lattner
b5c39352d8
Implement full support for promoting allocas to registers using SSAUpdater
...
instead of DomTree/DomFrontier. This may be interesting for reducing compile
time. This is currently disabled, but seems to work just fine.
When this is enabled, we eliminate two runs of dominator frontier, one in the
"early per-function" optimizations and one in the "interlaced with inliner"
function passes.
llvm-svn: 123434
2011-01-14 07:50:47 +00:00
Chris Lattner
b1ba935526
indentation
...
llvm-svn: 123426
2011-01-14 04:23:53 +00:00
Duncan Sands
44c273d907
Move some shift transforms out of instcombine and into InstructionSimplify.
...
While there, I noticed that the transform "undef >>a X -> undef" was wrong.
For example if X is 2 then the top two bits must be equal, so the result can
not be anything. I fixed this in the constant folder as well. Also, I made
the transform for "X << undef" stronger: it now folds to undef always, even
though X might be zero. This is in accordance with the LangRef, but I must
admit that it is fairly aggressive. Also, I added "i32 X << 32 -> undef"
following the LangRef and the constant folder, likewise fairly aggressive.
llvm-svn: 123417
2011-01-14 00:37:45 +00:00
Bob Wilson
1238f872da
Fix whitespace.
...
llvm-svn: 123396
2011-01-13 20:59:44 +00:00
Bob Wilson
fbab825516
Check for empty structs, and for consistency, zero-element arrays.
...
llvm-svn: 123383
2011-01-13 18:26:59 +00:00
Bob Wilson
3b0197489e
Extend SROA to handle arrays accessed as homogeneous structs and vice versa.
...
This is a minor extension of SROA to handle a special case that is
important for some ARM NEON operations. Some of the NEON intrinsics
return multiple values, which are handled as struct types containing
multiple elements of the same vector type. The corresponding return
types declared in the arm_neon.h header have equivalent arrays. We
need SROA to recognize that it can split up those arrays and structs
into separate vectors, even though they are not always accessed with
the same type. SROA already handles loads and stores of an entire
alloca by using insertvalue/extractvalue to access the individual
pieces, and that code works the same regardless of whether the type
is a struct or an array. So, all that needs to be done is to check
for compatible arrays and homogeneous structs.
llvm-svn: 123381
2011-01-13 17:45:11 +00:00
Bob Wilson
9f8d730f9b
Make SROA more aggressive with allocas containing padding.
...
SROA only split up structs and arrays one level at a time, so padding can
only cause trouble if it is located in between the struct or array elements.
llvm-svn: 123380
2011-01-13 17:45:08 +00:00
Devang Patel
52db9b4821
Use SmallVector instead of SmallPtrSet and avoid non-deterministic behavior.
...
llvm-svn: 123318
2011-01-12 19:12:45 +00:00
Chris Lattner
fdef60bef7
revert 123144, reenabling the rest of memset formation.
...
llvm-svn: 123302
2011-01-12 03:25:15 +00:00
Chris Lattner
e288204194
revert r123146 which disabled code that wasn't the root cause
...
of the bootstrap miscompare issue.
llvm-svn: 123299
2011-01-12 01:52:23 +00:00
Chris Lattner
c7a5a12af5
revert r123149, reenabling an improvement to memcpyopt that wasn't
...
the source of the bootstrap problem.
llvm-svn: 123298
2011-01-12 01:43:46 +00:00
Jakob Stoklund Olesen
b935aa1678
Remove the PR8954 workaround.
...
llvm-svn: 123288
2011-01-11 22:56:41 +00:00
Jakob Stoklund Olesen
37fe53c1a9
Fix a non-deterministic loop in llvm::MergeBlockIntoPredecessor.
...
DT->changeImmediateDominator() trivially ignores identity updates, so there is
really no need for the uniqueing provided by SmallPtrSet.
I expect this to fix PR8954.
llvm-svn: 123286
2011-01-11 22:54:38 +00:00
Cameron Zwarich
b0e688cc7c
Dial back the speculative fix for PR8954 a bit, so that we only recompute dominators
...
once at the beginning of GVN instead of once per iteration.
llvm-svn: 123278
2011-01-11 22:14:42 +00:00
Cameron Zwarich
e8c1c44e01
Attempt to fix the bootstrap buildbot. Rafael says this works for him on x86-64 Linux.
...
llvm-svn: 123270
2011-01-11 20:23:34 +00:00
Owen Anderson
a82627567b
Remove dead variable, const-ref-ize an APInt.
...
llvm-svn: 123248
2011-01-11 18:26:37 +00:00
Chris Lattner
1674862564
this pass claims to preserve scev, make sure to tell it about deletions.
...
llvm-svn: 123247
2011-01-11 18:14:50 +00:00
Frits van Bommel
f5bd48972a
Factor the actual simplification out of SimplifyIndirectBrOnSelect and into a new helper function so it can be reused in e.g. an upcoming SimplifySwitchOnSelect.
...
No functional change.
llvm-svn: 123234
2011-01-11 12:52:11 +00:00
Chris Lattner
e5688368c6
update memdep when an instruction is deleted. This code isn't
...
actually reached in the testcase in PR8954, but it's safe and good
practice.
llvm-svn: 123224
2011-01-11 08:19:16 +00:00
Chris Lattner
a82a6cfe6d
when MergeBlockIntoPredecessor merges two blocks, update MemDep if it
...
is floating around in the ether.
llvm-svn: 123223
2011-01-11 08:16:49 +00:00
Chris Lattner
dc7b2160ba
Fix FoldSingleEntryPHINodes to update memdep and AA when it deletes
...
phi nodes. It is called from MergeBlockIntoPredecessor which is
called from GVN, which claims to preserve these.
I'm skeptical that this is the actual problem behind PR8954, but
this is a stab in the right direction.
llvm-svn: 123222
2011-01-11 08:13:40 +00:00
Chris Lattner
b1a9c9ed36
random cleanups
...
llvm-svn: 123221
2011-01-11 08:00:40 +00:00
Chris Lattner
5731a92f5b
remove a bogus assertion: the latch block of a loop is not
...
neccesarily an uncond branch to the header. This fixes
PR8955 (the assertion tripping).
llvm-svn: 123219
2011-01-11 07:47:59 +00:00
Owen Anderson
4479341626
Fix a random missed optimization by making InstCombine more aggressive when determining which bits are demanded by
...
a comparison against a constant.
llvm-svn: 123203
2011-01-11 00:36:45 +00:00
Chandler Carruth
772e26df36
Teach instcombine about the rest of the SSE and SSE2 conversion
...
intrinsics element dependencies. Reviewed by Nick.
llvm-svn: 123161
2011-01-10 07:19:37 +00:00
Chris Lattner
1404348022
another random stab in the dark trying to fix llvm-gcc-i386-linux-selfhost
...
llvm-svn: 123149
2011-01-10 02:34:11 +00:00