|  | Commit message (Collapse) | Author | Age | Files | Lines | 
|---|
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | It never does anything when running 'make check', and it get's in the
way of updating live intervals in 2-addr.
The hook was originally added to help form IT blocks in Thumb2 code
before register allocation, but the pass ordering has changed since
then, and we run if-conversion after register allocation now.
When the MI scheduler is enabled, there will be no less than two
schedulers between 2-addr and Thumb2ITBlockPass, so this hook is
unlikely to help anything.
llvm-svn: 161794 | 
| | 
| 
| 
| 
| 
| | since they are equivalent.
llvm-svn: 155188 | 
| | 
| 
| 
| | llvm-svn: 153502 | 
| | 
| 
| 
| | llvm-svn: 153500 | 
| | 
| 
| 
| | llvm-svn: 152978 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | Without this hook, functions w/ a completely empty body (including no
epilogue) will cause an MCEmitter assertion failure.
For example,
define internal fastcc void @empty_function() {
  unreachable
}
rdar://10947471
llvm-svn: 151673 | 
| | 
| 
| 
| 
| 
| | MSP430, PPC, PTX, Sparc, X86, XCore.
llvm-svn: 150878 | 
| | 
| 
| 
| | llvm-svn: 150833 | 
| | 
| 
| 
| 
| 
| | of PseudoSourceValue from lib/Target/.
llvm-svn: 144632 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | Add the predicate operand to the instructions. Update the back end
accordingly where the instructions are used. Restrict the SP operands
to actually only be SP, as otherwise these break assembly parsing for the
normal instruction variants.
llvm-svn: 138445 | 
| | 
| 
| 
| | llvm-svn: 137364 | 
| | 
| 
| 
| 
| 
| | ARM MC code from target.
llvm-svn: 135636 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | Merge the tMOVr, tMOVgpr2tgpr, tMOVtgpr2gpr, and tMOVgpr2gpr instructions
into tMOVr. There's no need to keep them separate. Giving the tMOVr
instruction the proper GPR register class for its operands is sufficient
to give the register allocator enough information to do the right thing
directly.
llvm-svn: 134204 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | Fix a FIXME and allow predication (in Thumb2) for the T1 register to
register MOV instructions. This allows some better codegen with
if-conversion (as seen in the test updates), plus it lays the groundwork
for pseudo-izing the tMOVCC instructions.
llvm-svn: 134197 | 
| | 
| 
| 
| | llvm-svn: 134131 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| | Unlike Thumb1, Thumb2 does not have dedicated encodings for adjusting the
stack pointer. It can just use the normal add-register-immediate encoding
since it can use all registers as a source, not just R0-R7. The extra
instruction definitions are just duplicates of the normal instructions with
the (not well enforced) constraint that the source register was SP.
llvm-svn: 134114 | 
| | 
| 
| 
| | llvm-svn: 134024 | 
| | 
| 
| 
| 
| 
| 
| 
| | sink them into MC layer.
- Added MCInstrInfo, which captures the tablegen generated static data. Chang
TargetInstrInfo so it's based off MCInstrInfo.
llvm-svn: 134021 | 
| | 
| 
| 
| 
| 
| 
| | This is just very first approximation how the stuff should be done
(e.g. ARM-only for now). More to follow.
llvm-svn: 127101 | 
| | 
| 
| 
| | llvm-svn: 126192 | 
| | 
| 
| 
| 
| 
| | in a IT block. rdar://9030770
llvm-svn: 126159 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | difficult on current ARM implementations for a few reasons.
1. Even though a single vmla has latency that is one cycle shorter than a pair
   of vmul + vadd, a RAW hazard during the first (4? on Cortex-a8) can cause
   additional pipeline stall. So it's frequently better to single codegen
   vmul + vadd.
2. A vmla folowed by a vmul, vmadd, or vsub causes the second fp instruction to
   stall for 4 cycles. We need to schedule them apart.
3. A vmla followed vmla is a special case. Obvious issuing back to back RAW
   vmla + vmla is very bad. But this isn't ideal either:
     vmul
     vadd
     vmla
   Instead, we want to expand the second vmla:
     vmla
     vmul
     vadd
   Even with the 4 cycle vmul stall, the second sequence is still 2 cycles
   faster.
Up to now, isel simply avoid codegen'ing fp vmla / vmls. This works well enough
but it isn't the optimial solution. This patch attempts to make it possible to
use vmla / vmls in cases where it is profitable.
A. Add missing isel predicates which cause vmla to be codegen'ed.
B. Make sure the fmul in (fadd (fmul)) has a single use. We don't want to
   compute a fmul and a fmla.
C. Add additional isel checks for vmla, avoid cases where vmla is feeding into
   fp instructions (except for the #3 exceptional case).
D. Add ARM hazard recognizer to model the vmla / vmls hazards.
E. Add a special pre-regalloc case to expand vmla / vmls when it's likely the
   vmla / vmls will trigger one of the special hazards.
Work in progress, only A+B are enabled.
llvm-svn: 120960 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | 1. Fix pre-ra scheduler so it doesn't try to push instructions above calls to
   "optimize for latency". Call instructions don't have the right latency and
   this is more likely to use introduce spills.
2. Fix if-converter cost function. For ARM, it should use instruction latencies,
   not # of micro-ops since multi-latency instructions is completely executed
   even when the predicate is false. Also, some instruction will be "slower"
   when they are predicated due to the register def becoming implicit input.
   rdar://8598427
llvm-svn: 118135 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | if-conversion heuristic APIs.  For now,
stick with a constant estimate of 90% (branch predictors are good!), but we might find that we want to provide
more nuanced estimates in the future.
llvm-svn: 115364 | 
| | 
| 
| 
| | llvm-svn: 115339 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | if-conversion profitability.
Rather than having arbitrary cutoffs, actually try to cost model the conversion.
For now, the constants are tuned to more or less match our existing behavior, but these will be
changed to reflect realistic values as this work proceeds.
llvm-svn: 114973 | 
| | 
| 
| 
| | llvm-svn: 114391 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | take multiple cycles to decode.
For the current if-converter clients (actually only ARM), the instructions that
are predicated on false are not nops. They would still take machine cycles to
decode. Micro-coded instructions such as LDM / STM can potentially take multiple
cycles to decode. If-converter should take treat them as non-micro-coded
simple instructions.
llvm-svn: 113570 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | have 4 bits per register in the operand encoding), but have undefined
behavior when the operand value is 13 or 15 (SP and PC, respectively).
The trivial coalescer in linear scan sometimes will merge a copy from
SP into a subsequent instruction which uses the copy, and if that
instruction cannot legally reference SP, we get bad code such as:
  mls r0,r9,r0,sp
instead of:
  mov r2, sp
  mls r0, r9, r0, r2
This patch adds a new register class for use by Thumb2 that excludes
the problematic registers (SP and PC) and is used instead of GPR
for those operands which cannot legally reference PC or SP. The
trivial coalescer explicitly requires that the register class
of the destination for the COPY instruction contain the source
register for the COPY to be considered for coalescing. This prevents
errant instructions like that above.
PR7499
llvm-svn: 109842 | 
| | 
| 
| 
| | llvm-svn: 108078 | 
| | 
| 
| 
| 
| 
| 
| | a CPSR operand to them causes an assertion failure, so apparently these
instructions haven't been getting a lot of use.
llvm-svn: 107147 | 
| | 
| 
| 
| | llvm-svn: 107121 | 
| | 
| 
| 
| | llvm-svn: 106901 | 
| | 
| 
| 
| | llvm-svn: 106517 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | - This fixed a number of bugs in if-converter, tail merging, and post-allocation
  scheduler. If-converter now runs branch folding / tail merging first to
  maximize if-conversion opportunities.
- Also changed the t2IT instruction slightly. It now defines the ITSTATE
  register which is read by instructions in the IT block.
- Added Thumb2 specific hazard recognizer to ensure the scheduler doesn't
  change the instruction ordering in the IT block (since IT mask has been
  finalized). It also ensures no other instructions can be scheduled between
  instructions in the IT block.
This is not yet enabled.
llvm-svn: 106344 | 
| | 
| 
| 
| 
| 
| 
| 
| | call must not be callee-saved; following x86, add a new
regclass to represent this.  Also fixes a couple of bugs.
Still disabled by default; Thumb doesn't work yet.
llvm-svn: 106053 | 
| | 
| 
| 
| 
| 
| | will use this to try to avoid breaking up IT blocks.
llvm-svn: 105745 | 
| | 
| 
| 
| | llvm-svn: 105350 | 
| | 
| 
| 
| 
| 
| | doesn't have to guess.
llvm-svn: 103194 | 
| | 
| 
| 
| | llvm-svn: 103193 | 
| | 
| 
| 
| 
| 
| | Radar 7896289
llvm-svn: 102396 | 
| | 
| 
| 
| | llvm-svn: 100214 | 
| | 
| 
| 
| 
| 
| 
| | through to the generic version. The generic functions use STR/LDR, but T2
needs the t2STR/t2LDR instead so we get the addressing mode correct.
llvm-svn: 99678 | 
| | 
| 
| 
| 
| 
| 
| 
| | immediate instructions cannot set the condition codes, so they do not have
the extra cc_out operand.  We hit an assertion during tail duplication
because the instruction being duplicated had more operands that expected.
llvm-svn: 98001 | 
| | 
| 
| 
| 
| 
| | Radar 7614112.
llvm-svn: 95456 | 
| | 
| 
| 
| 
| 
| 
| | Since the mov is executed unconditionally, make sure that the add didn't have
any predicate.
llvm-svn: 93909 | 
| | 
| 
| 
| 
| 
| 
| | MachineBasicBlock::canFallThrough(), which is target-independent and more
thorough.
llvm-svn: 90634 | 
| | 
| 
| 
| | llvm-svn: 86423 | 
| | 
| 
| 
| | llvm-svn: 86408 | 
| | 
| 
| 
| | llvm-svn: 86400 |