| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
| |
Legalization ends up creating many G_SEQUENCE/G_EXTRACT pairs which leads to
inefficient codegen (even for -O0), so add a quick pass over the function to
remove them again.
llvm-svn: 280155
|
| |
|
|
|
|
|
|
|
|
| |
We're intending to move to a world where the type of a register is determined
by its (unique) def. This is incompatible with physregs, which are untyped.
It also means the other passes don't have to worry quite so much about
register-class compatibility and inserting COPYs appropriately.
llvm-svn: 280132
|
| |
|
|
| |
llvm-svn: 279988
|
| |
|
|
|
|
|
|
|
| |
When global-isel fails on a MachineFunction MF, MF will be cleaned up
and given to SDISel.
Thanks to this fallback, we can already perform correctness test even if
we support only a small portion of the functions in a test.
llvm-svn: 279891
|
| |
|
|
|
|
|
|
| |
It will just be the same as the regular calling convention.
rdar://28029509
llvm-svn: 279853
|
| |
|
|
|
|
|
|
| |
In the code to detect fixed-point conversions and make use of AArch64's special
instructions, we weren't prepared for weird types. The fptosi direction got
fixed recently, but not the similar sitofp code.
llvm-svn: 279852
|
| |
|
|
|
|
| |
Differential Revision: https://reviews.llvm.org/D23677
llvm-svn: 279849
|
| |
|
|
| |
llvm-svn: 279845
|
| |
|
|
| |
llvm-svn: 279844
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
It's unclear how the old
%res(32) = G_ICMP { s32, s32 } intpred(eq), %0, %1
is actually different from an s1 verison
%res(1) = G_ICMP { s1, s32 } intpred(eq), %0, %1
so we'll remove it for now.
llvm-svn: 279843
|
| |
|
|
| |
llvm-svn: 279842
|
| |
|
|
| |
llvm-svn: 279841
|
| |
|
|
| |
llvm-svn: 279840
|
| |
|
|
| |
llvm-svn: 279839
|
| |
|
|
|
|
|
|
| |
This is similar to what was done in r261675, but for CSINC rather than CSINV.
Differential Revision: https://reviews.llvm.org/D23892
llvm-svn: 279822
|
| |
|
|
|
|
|
|
| |
The 32-bit variants of these operations don't depend on the bits not being
operated on, so they also naturally model operations narrower than the actual
register width.
llvm-svn: 279760
|
| |
|
|
| |
llvm-svn: 279759
|
| |
|
|
| |
llvm-svn: 279758
|
| |
|
|
| |
llvm-svn: 279757
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
compute it
Rename AllVRegsAllocated to NoVRegs. This avoids the connotation of
running after register and simply describes that no vregs are used in
a machine function. With that we can simply compute the property and do
not need to dump/parse it in .mir files.
Differential Revision: http://reviews.llvm.org/D23850
llvm-svn: 279698
|
| |
|
|
| |
llvm-svn: 279680
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
print/parser it
tracksSubRegLiveness only depends on the Subtarget and a cl::opt, there
is not need to change it or save/parse it in a .mir file.
Make the field const and move the initialization LiveIntervalAnalysis to the
MachineRegisterInfo constructor. Also cleanup some code and fix some
instances which better use MachineRegisterInfo::subRegLivenessEnabled() instead
of TargetSubtargetInfo::enableSubRegLiveness().
llvm-svn: 279676
|
| |
|
|
| |
llvm-svn: 279633
|
| |
|
|
|
|
|
|
|
| |
Specifying isSSA is an extra line at best and results in invalid MI at
worst. Compute the value instead.
Differential Revision: http://reviews.llvm.org/D22722
llvm-svn: 279600
|
| |
|
|
| |
llvm-svn: 279579
|
| |
|
|
| |
llvm-svn: 279569
|
| |
|
|
|
|
|
| |
They really should have both types represented, but early variants were created
before MachineInstrs could have multiple types so they're rather ambiguous.
llvm-svn: 279567
|
| |
|
|
| |
llvm-svn: 279565
|
| |
|
|
| |
llvm-svn: 279553
|
| |
|
|
|
|
| |
AArch64.
llvm-svn: 279548
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
branches
Looping over all terminators exposed AArch64 tests hitting
an assert from analyzeBranch failing. I believe these cases
were miscompiled before.
e.g.
fcmp s0, s1
b.ne LBB0_1
b.vc LBB0_2
b LBB0_2
LBB0_1:
; Large block
LBB0_2:
; ...
Both of the individual conditional branches need to
be expanded, since neither can reach the final block.
Split the original block into ones which analyzeBranch
will be able to understand.
llvm-svn: 279499
|
| |
|
|
| |
llvm-svn: 279341
|
| |
|
|
| |
llvm-svn: 279340
|
| |
|
|
|
|
|
|
|
|
| |
- Always compile print() regardless of LLVM_ENABLE_DUMP. (We usually
only gard dump() functions with that).
- Only show the set properties to reduce output clutter.
- Remove the unused variant that even shows the unset properties.
- Fix comments
llvm-svn: 279338
|
| |
|
|
| |
llvm-svn: 279320
|
| |
|
|
| |
llvm-svn: 279319
|
| |
|
|
| |
llvm-svn: 279311
|
| |
|
|
| |
llvm-svn: 279310
|
| |
|
|
| |
llvm-svn: 279309
|
| |
|
|
|
|
|
|
|
|
| |
This adds a G_INSERT instruction, which technically makes G_SEQUENCE redundant
(it's equivalent to a G_INSERT into an IMPLICIT_DEF). We'll leave G_SEQUENCE
for now though: it's likely to be far more common as it's a fundamental part of
legalization, so avoiding the mess and bloat of the extra IMPLICIT_DEFs is
probably worthwhile.
llvm-svn: 279306
|
| |
|
|
|
|
|
|
|
|
|
|
| |
First, make sure all types involved are represented, rather than being implicit
from the register width.
Second, canonicalize all types to scalar. These operations just act in bits and
don't care about vectors.
Also standardize spelling of Indices in the MachineIRBuilder (NFC here).
llvm-svn: 279294
|
| |
|
|
| |
llvm-svn: 279287
|
| |
|
|
| |
llvm-svn: 279285
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Unsigned addition and subtraction can reuse the instructions created to
legalize large width operations (i.e. both produce and consume a carry flag).
Signed operations and multiplies get a dedicated op-with-overflow instruction.
Once this is produced the two values are combined into a struct register (which
will almost always be merged with a corresponding G_EXTRACT as part of
legalization).
llvm-svn: 279278
|
| |
|
|
|
|
|
|
| |
The heuristic above this code is incredibly suspect, but disregarding that it mutates the cast opcode so we need to check the *mutated* opcode later to see if we need to emit an AssertSext or AssertZext node.
Fixes PR29041.
llvm-svn: 279223
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Remove an unnecessary round-trip:
iterator => operator->() => getIterator()
In some cases, the iterator is end(), so the dereference of operator->
is invalid (UB).
The testcase only crashes with r278974 (currently reverted to
investigate this), which adds an assertion for invalid dereferences of
ilist nodes.
Fixes PR29035.
llvm-svn: 279104
|
| |
|
|
|
|
| |
There is no FREM instruction, but the others are straightforward.
llvm-svn: 279081
|
| |
|
|
| |
llvm-svn: 279080
|
| |
|
|
|
|
|
|
| |
There is no REM instruction; that will require an expansion.
It's not obvious that should be done in select, rather than as a
(custom?) legalization.
llvm-svn: 279074
|
| |
|
|
| |
llvm-svn: 279073
|