| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
| |
llvm-svn: 147867
|
| |
|
|
|
|
|
| |
conventions. Also, clarify the grouping of one of the asserts to silence
-Wparentheses.
llvm-svn: 147863
|
| |
|
|
|
|
|
|
| |
of several newly un-defaulted switches. This also helps optimizers
(including LLVM's) recognize that every case is covered, and we should
assume as much.
llvm-svn: 147861
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
assembly source when it generates the TAG_subprogram dwarf debug info for
the labels that have nothing between them as in this bit of assembly source:
% cat ZeroLength.s
_func1:
_func2:
nop
One solution would be to not emit the subsequent labels with the same address
and use the next label with a different address or the end of the section for
the AT_high_pc value of the TAG_subprogram.
Turns out in llvm-mc it is not possible in all cases to determine of two
symbols have the same value at the point we put out the TAG_subprogram dwarf
debug info.
So we will have llvm-mc instead of putting out TAG_subprogram's put out
DW_TAG_label's. And the DW_TAG_label does not have a AT_high_pc value which
avoids the problem.
This commit is only the functional change to make the diffs clear as to what is
really being changed. The next commit will be to clean up the names of such
things like MCGenDwarfSubprogramEntry to something like MCGenDwarfLabelEntry.
rdar://10666925
llvm-svn: 147860
|
| |
|
|
|
|
| |
Right now, this just adds additional entries in match table. The parser does not use them yet.
llvm-svn: 147859
|
| |
|
|
| |
llvm-svn: 147855
|
| |
|
|
|
|
| |
using BUILD_VECTORS we may be using a BV of different type. Make sure to cast it back.
llvm-svn: 147851
|
| |
|
|
| |
llvm-svn: 147846
|
| |
|
|
|
|
| |
There is no vbroadcastsd xmm, but we do need to support 64-bit integers broadcasted into xmm. Also factor the AVX check into the isVectorBroadcast function. This makes more sense since the AVX2 check was already inside.
llvm-svn: 147844
|
| |
|
|
|
|
| |
the final piece to remove the AVX hack that disabled SSE.
llvm-svn: 147843
|
| |
|
|
|
|
| |
AVX is now an SSE level and no longer disables SSE checks.
llvm-svn: 147842
|
| |
|
|
|
|
| |
predicates. Another commit will remove orAVX functions from X86SubTarget.
llvm-svn: 147841
|
| |
|
|
|
|
|
|
|
|
| |
define physical registers. It's currently very restrictive, only catching
cases where the CE is in an immediate (and only) predecessor. But it catches
a surprising large number of cases.
rdar://10660865
llvm-svn: 147827
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
These heuristics are sufficient for enabling IV chains by
default. Performance analysis has been done for i386, x86_64, and
thumbv7. The optimization is rarely important, but can significantly
speed up certain cases by eliminating spill code within the
loop. Unrolled loops are prime candidates for IV chains. In many
cases, the final code could still be improved with more target
specific optimization following LSR. The goal of this feature is for
LSR to make the best choice of induction variables.
Instruction selection may not completely take advantage of this
feature yet. As a result, there could be cases of slight code size
increase.
Code size can be worse on x86 because it doesn't support postincrement
addressing. In fact, when chains are formed, you may see redundant
address plus stride addition in the addressing mode. GenerateIVChains
tries to compensate for the common cases.
On ARM, code size increase can be mitigated by using postincrement
addressing, but downstream codegen currently misses some opportunities.
llvm-svn: 147826
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On Thumb, the displacement computation hardware uses the address of the
current instruction rouned down to a multiple of 4. Include this
rounding in the UserOffset we compute for each instruction.
When inline asm is present, the instruction alignment may not be known.
Constrain the maximum displacement instead in that case.
This makes it possible for CreateNewWater() and OffsetIsInRange() to
agree about the valid displacements. When they disagree, infinite
looping happens.
As always, test cases for this stuff are insane.
<rdar://problem/10660175>
llvm-svn: 147825
|
| |
|
|
| |
llvm-svn: 147820
|
| |
|
|
|
|
|
|
|
| |
The pass is prone to looping, and it is better to crash than loop
forever, even in a -Asserts build.
<rdar://problem/10660175>
llvm-svn: 147806
|
| |
|
|
| |
llvm-svn: 147805
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
After collecting chains, check if any should be materialized. If so,
hide the chained IV users from the LSR solver. LSR will only solve for
the head of the chain. GenerateIVChains will then materialize the
chained IV users by computing the IV relative to its previous value in
the chain.
In theory, chained IV users could be exposed to LSR's solver. This
would be considerably complicated to implement and I'm not aware of a
case where we need it. In practice it's more important to
intelligently prune the search space of nontrivial loops before
running the solver, otherwise the solver is often forced to prune the
most optimal solutions. Hiding the chained users does this well, so
that LSR is more likely to find the best IV for the chain as a whole.
llvm-svn: 147801
|
| |
|
|
|
|
|
|
| |
This collects a set of IV uses within the loop whose values can be
computed relative to each other in a sequence. Following checkins will
make use of this information.
llvm-svn: 147797
|
| |
|
|
|
|
|
| |
AsmParser holds info specific to target parser.
AsmParserVariant holds info specific to asm variants supported by the target.
llvm-svn: 147787
|
| |
|
|
| |
llvm-svn: 147785
|
| |
|
|
|
|
| |
Patch by Joe Groff!
llvm-svn: 147781
|
| |
|
|
| |
llvm-svn: 147779
|
| |
|
|
|
|
|
|
| |
tests.
This subsumes several other transforms while enabling us to catch more cases.
llvm-svn: 147777
|
| |
|
|
|
|
|
|
|
|
|
|
| |
this substraction will result in small negative numbers at worst which
become very large positive numbers on assignment and are thus caught by
the <=4 check on the next line. The >0 check clearly intended to catch
these as negative numbers.
Spotted by inspection, and impossible to trigger given the shift widths
that can be used.
llvm-svn: 147773
|
| |
|
|
|
|
| |
Predicate functions have been altered to maintain previous names and behavior.
llvm-svn: 147770
|
| |
|
|
| |
llvm-svn: 147769
|
| |
|
|
|
|
| |
priority over the SSE version. Another step towards trying to remove the AVX hack that disables SSE from X86Subtarget.
llvm-svn: 147768
|
| |
|
|
|
|
| |
on MOVNTPS and MOVNTDQ. And v4i64 was completely missing.
llvm-svn: 147767
|
| |
|
|
|
|
| |
AVX equivalent so we should use the SSE version.
llvm-svn: 147766
|
| |
|
|
|
|
| |
operations ANDPS/ORPS/XORPS/ANDNPS. This fixes a pattern ordering issue that meant that the SSE2 instructions could never be directly selected since the SSE1 patterns would always match first. This is largely moot with the ExeDepsFix pass, but I'm trying to audit for all such ordering issues.
llvm-svn: 147765
|
| |
|
|
|
|
| |
hasXMM/hasXMMInt instead. Also fix one place that checked SSE3, but accidentally excluded AVX to use hasSSE3orAVX. This is a step towards removing the AVX hack from the X86Subtarget.h
llvm-svn: 147764
|
| |
|
|
| |
llvm-svn: 147763
|
| |
|
|
|
|
| |
instructions that were added along with SSE instructions to check for AVX in addition to SSE level.
llvm-svn: 147762
|
| |
|
|
| |
llvm-svn: 147758
|
| |
|
|
|
|
|
| |
We still save an instruction when just the "and" part is replaced.
Also change the code to match comments more closely.
llvm-svn: 147753
|
| |
|
|
| |
llvm-svn: 147752
|
| |
|
|
|
|
| |
safely proven not to have been clobbered. No small test case possible.
llvm-svn: 147751
|
| |
|
|
|
|
|
|
| |
merge the sign bit into the bit test.
This is common in bit field code, e.g. checking if the first or the last bit of a bit field is set.
llvm-svn: 147749
|
| |
|
|
| |
llvm-svn: 147748
|
| |
|
|
| |
llvm-svn: 147745
|
| |
|
|
|
|
| |
the produce assembly when using CFI just a bit more readable.
llvm-svn: 147743
|
| |
|
|
|
|
| |
Darwin doesn't do static, and ELF targets only support static.
llvm-svn: 147740
|
| |
|
|
| |
llvm-svn: 147739
|
| |
|
|
|
|
| |
is discouraged now.
llvm-svn: 147738
|
| |
|
|
| |
llvm-svn: 147734
|
| |
|
|
| |
llvm-svn: 147733
|
| |
|
|
|
|
| |
subc, turn it into a sub. Turn (subc x, x) into 0 with no borrow. Turn (subc x, 0) into x with no borrow. Turn (subc -1, x) into (xor x, -1) with no borrow. Turn sube with no borrow in into subc.
llvm-svn: 147728
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Reserved registers don't have proper live ranges, their LiveInterval
simply has a snippet of liveness for each def. Virtual registers with a
single value that is a copy of a reserved register (typically %esp) can
be coalesced with the reserved register if the live range doesn't
overlap any reserved register defs.
When coalescing with a reserved register, don't modify the reserved
register live range. Just leave it as a bunch of dead defs. This
eliminates quadratic coalescer behavior in i386 functions with many
function calls.
PR11699
llvm-svn: 147726
|