| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
"For ARM stack frames that utilize variable sized objects and have either
large local stack areas or require dynamic stack realignment, allocate a
base register via which to access the local frame. This allows efficient
access to frame indices not accessible via the FP (either due to being out
of range or due to dynamic realignment) or the SP (due to variable sized
object allocation). In particular, this greatly improves efficiency of access
to spill slots in Thumb functions which contain VLAs."
r112986 fixed a latent bug exposed by the above.
llvm-svn: 112989
|
| |
|
|
|
|
|
|
| |
either", it is breaking oggenc with Clang for ARMv6.
This reverts commit 8d6e29cfda270be483abf638850311670829ee65.
llvm-svn: 112962
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
large local stack areas or require dynamic stack realignment, allocate a
base register via which to access the local frame. This allows efficient
access to frame indices not accessible via the FP (either due to being out
of range or due to dynamic realignment) or the SP (due to variable sized
object allocation). In particular, this greatly improves efficiency of access
to spill slots in Thumb functions which contain VLAs.
rdar://7352504
rdar://8374540
rdar://8355680
llvm-svn: 112883
|
| |
|
|
|
|
| |
to try to re-use scavenged frame index reference registers. rdar://8277890
llvm-svn: 112241
|
| |
|
|
|
|
| |
rdar://8277890
llvm-svn: 111533
|
| |
|
|
|
|
|
|
| |
function stack frame has a var-sized object.
Also added a test case to check for the added benefit of this patch: it's optimizing away the unnecessary restore of sp from fp for some non-leaf functions.
llvm-svn: 110707
|
| |
|
|
|
|
| |
register is", it breaks a couple test-suite tests.
llvm-svn: 110701
|
| |
|
|
|
|
|
|
|
|
| |
reserved, not available for general allocation. This eliminates all the
extra checks for Darwin.
This change also fixes the use of FP to access frame indices in leaf
functions and cleaned up some confusing code in epilogue emission.
llvm-svn: 110655
|
| |
|
|
| |
llvm-svn: 108812
|
| |
|
|
| |
llvm-svn: 108094
|
| |
|
|
| |
llvm-svn: 107154
|
| |
|
|
|
|
| |
eliminateFrameIndex(), leading to llvm_unreachable() assertion failure.
llvm-svn: 102980
|
| |
|
|
| |
llvm-svn: 101379
|
| |
|
|
| |
llvm-svn: 101334
|
| |
|
|
| |
llvm-svn: 100214
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
writebacks to the address register. This gets rid of the hack that the
first register on the list was the magic writeback register operand. There
was an implicit constraint that if that operand was not reg0 it had to match
the base register operand. The post-RA scheduler's antidependency breaker
did not understand that constraint and sometimes changed one without the
other. This also fixes Radar 7495976 and should help the verifier work
better for ARM code.
There are now new ld/st instructions explicit writeback operands and explicit
constraints that tie those registers together.
llvm-svn: 98409
|
| |
|
|
| |
llvm-svn: 98182
|
| |
|
|
| |
llvm-svn: 98109
|
| |
|
|
|
|
|
|
|
|
| |
is preparatory to having PEI's scavenged frame index value reuse logic
properly distinguish types of frame values (e.g., whether the value is
stack-pointer relative or frame-pointer relative).
No functionality change.
llvm-svn: 98086
|
| |
|
|
|
|
|
|
| |
register is involved for thumb1. Work around this for the moment by only
re-using SP-relative offsets. This is temporary 'til the code can distinguish
multiple base registers.
llvm-svn: 98071
|
| |
|
|
|
|
|
| |
registers may be restored via a pop instruction, not just a tRestore.
This fixes nightly test 471.omnetep for Thumb1.
llvm-svn: 97867
|
| |
|
|
| |
llvm-svn: 97013
|
| |
|
|
|
|
|
| |
Since the mov is executed unconditionally, make sure that the add didn't have
any predicate.
llvm-svn: 93909
|
| |
|
|
|
|
| |
Patch by Howard Hinnant!
llvm-svn: 90365
|
| |
|
|
| |
llvm-svn: 86494
|
| |
|
|
| |
llvm-svn: 86408
|
| |
|
|
|
|
| |
Thumb2.
llvm-svn: 85406
|
| |
|
|
| |
llvm-svn: 84832
|
| |
|
|
| |
llvm-svn: 84798
|
| |
|
|
|
|
| |
functions are not needed.
llvm-svn: 84587
|
| |
|
|
| |
llvm-svn: 84563
|
| |
|
|
|
|
|
|
|
|
| |
appropriate restore location for the spill as well as perform the actual
save and restore.
The Thumb1 target uses this to make sure R12 is not clobbered while a spilled
scavenger register is live there.
llvm-svn: 84554
|
| |
|
|
| |
llvm-svn: 83522
|
| |
|
|
| |
llvm-svn: 83521
|
| |
|
|
|
|
| |
what's up.
llvm-svn: 83501
|
| |
|
|
| |
llvm-svn: 83494
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
a virtual register to eliminate a frame index, it can return that register
and the constant stored there to PEI to track. When scavenging to allocate
for those registers, PEI then tracks the last-used register and value, and
if it is still available and matches the value for the next index, reuses
the existing value rather and removes the re-materialization instructions.
Fancier tracking and adjustment of scavenger allocations to keep more
values live for longer is possible, but not yet implemented and would likely
be better done via a different, less special-purpose, approach to the
problem.
eliminateFrameIndex() is modified so the target implementations can return
the registers they wish to be tracked for reuse.
ARM Thumb1 implements and utilizes the new mechanism. All other targets are
simply modified to adjust for the changed eliminateFrameIndex() prototype.
llvm-svn: 83467
|
| |
|
|
|
|
|
|
| |
spill slot. When frame references are via the frame pointer, they will be
negative, but Thumb1 load/store instructions only allow positive immediate
offsets. Instead, Thumb1 will spill to R12.
llvm-svn: 83336
|
| |
|
|
| |
llvm-svn: 83214
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
interest for this, as it currently reserves a register rather than using
the scavenger for matierializing constants as needed.
Instead of scavenging registers on the fly while eliminating frame indices,
new virtual registers are created, and then a scavenged collectively in a
post-pass over the function. This isolates the bits that need to interact
with the scavenger, and sets the stage for more intelligent use, and reuse,
of scavenged registers.
For the time being, this is disabled by default. Once the bugs are worked out,
the current scavenging calls in replaceFrameIndices() will be removed and
the post-pass scavenging will be the default. Until then,
-enable-frame-index-scavenging enables the new code. Currently, only the
Thumb1 back end is set up to use it.
llvm-svn: 82734
|
| |
|
|
|
|
| |
icc (#177, partial). Patch by Erick Tryzelaar.
llvm-svn: 81106
|
| |
|
|
| |
llvm-svn: 78948
|
| |
|
|
| |
llvm-svn: 78717
|
| |
|
|
| |
llvm-svn: 78666
|
| |
|
|
|
|
| |
own struct type.
llvm-svn: 78610
|
| |
|
|
| |
llvm-svn: 77305
|
| |
|
|
|
|
|
|
|
|
|
| |
- This change also makes it possible to switch between ARM / Thumb on a
per-function basis.
- Fixed thumb2 routine which expand reg + arbitrary immediate. It was using
using ARM so_imm logic.
- Use movw and movt to do reg + imm when profitable.
- Other code clean ups and minor optimizations.
llvm-svn: 77300
|
| |
|
|
|
|
| |
low register. It's moving from a GPR register class to a more restrictive tGPR class. Also change tMOVlor2hir, and tMOVhir2hir.
llvm-svn: 77172
|
| |
|
|
| |
llvm-svn: 77164
|
| |
|
|
|
|
| |
thanks to contexts-on-types. More to come.
llvm-svn: 77011
|