summaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineInstr.cpp
AgeCommit message (Collapse)Author
2014-01-09Put the functionality for printing a value to a raw_ostream as anChandler Carruth
operand into the Value interface just like the core print method is. That gives a more conistent organization to the IR printing interfaces -- they are all attached to the IR objects themselves. Also, update all the users. This removes the 'Writer.h' header which contained only a single function declaration. llvm-svn: 198836
2014-01-07Move the LLVM IR asm writer header files into the IR directory, as theyChandler Carruth
are part of the core IR library in order to support dumping and other basic functionality. Rename the 'Assembly' include directory to 'AsmParser' to match the library name and the only functionality left their -- printing has been in the core IR library for quite some time. Update all of the #includes to match. All of this started because I wanted to have the layering in good shape before I started adding support for printing LLVM IR using the new pass infrastructure, and commandline support for the new pass infrastructure. llvm-svn: 198688
2014-01-02[RegAlloc] Make tryInstructionSplit less aggressive.Quentin Colombet
The greedy register allocator tries to split a live-range around each instruction where it is used or defined to relax the constraints on the entire live-range (this is a last chance split before falling back to spill). The goal is to have a big live-range that is unconstrained (i.e., that can use the largest legal register class) and several small local live-range that carry the constraints implied by each instruction. E.g., Let csti be the constraints on operation i. V1= op1 V1(cst1) op2 V1(cst2) V1 live-range is constrained on the intersection of cst1 and cst2. tryInstructionSplit relaxes those constraints by aggressively splitting each def/use point: V1= V2 = V1 V3 = V2 op1 V3(cst1) V4 = V2 op2 V4(cst2) Because of how the coalescer infrastructure works, each new variable (V3, V4) that is alive at the same time as V1 (or its copy, here V2) interfere with V1. Thus, we end up with an uncoalescable copy for each split point. To make tryInstructionSplit less aggressive, we check if the split point actually relaxes the constraints on the whole live-range. If it does not, we do not insert it. Indeed, it will not help the global allocation problem: - V1 will have the same constraints. - V1 will have the same interference + possibly the newly added split variable VS. - VS will produce an uncoalesceable copy if alive at the same time as V1. <rdar://problem/15570057> llvm-svn: 198369
2013-12-14[Stackmap] Liveness Analysis PassJuergen Ributzka
This optional register liveness analysis pass can be enabled with either -enable-stackmap-liveness, -enable-patchpoint-liveness, or both. The pass traverses each basic block in a machine function. For each basic block the instructions are processed in reversed order and if a patchpoint or stackmap instruction is encountered the current live-out register set is encoded as a register mask and attached to the instruction. Later on during stackmap generation the live-out register mask is processed and also emitted as part of the stackmap. This information is optional and intended for optimization purposes only. This will enable a client of the stackmap to reason about the registers it can use and which registers need to be preserved. Reviewed by Andy llvm-svn: 197317
2013-12-14Print the address space of a MachineMemOperandMatt Arsenault
llvm-svn: 197288
2013-12-13Revert "Liveness Analysis Pass"Andrew Trick
This reverts commit r197254. This was an accidental merge of Juergen's patch. It will be checked in shortly, but wasn't meant to go in quite yet. Conflicts: include/llvm/CodeGen/StackMaps.h lib/CodeGen/StackMaps.cpp test/CodeGen/X86/stackmap-liveness.ll llvm-svn: 197260
2013-12-13Liveness Analysis PassAndrew Trick
llvm-svn: 197254
2013-10-15Guard the debug temp variable with NDEBUG to avoid warning/error with NDEBUG ↵Pekka Jaaskelainen
defined. llvm-svn: 192709
2013-10-15Do not assert when trying to add a meta data operand withPekka Jaaskelainen
MachineInstr::addOperand(). llvm-svn: 192707
2013-10-10Rename parameter: defined regs are not incoming.Matthias Braun
llvm-svn: 192391
2013-07-05Remove dead function.Jakob Stoklund Olesen
llvm-svn: 185731
2013-06-28Debug Info: clean up usage of Verify.Manman Ren
No functionality change. It should suffice to check the type of a debug info metadata, instead of calling Verify. For cases where we know the type of a DI metadata, use assert. Also update testing cases to make them conform to the format of DI classes. llvm-svn: 185135
2013-02-05Remove liveout lists from MachineRegisterInfo.Jakob Stoklund Olesen
All targets are now adding return value registers as implicit uses on return instructions, and there is no longer a need for the live out lists. llvm-svn: 174417
2013-01-25ScheduleDAG: colorize the DOT graph and improve formatting.Andrew Trick
llvm-svn: 173431
2013-01-11For inline asm:Eric Christopher
- recognize string "{memory}" in the MI generation - mark as mayload/maystore when there's a memory clobber constraint. PR14859. Patch by Krzysztof Parzyszek llvm-svn: 172228
2013-01-10Allow hasProperty() to be called on bundle-internal instructions.Jakob Stoklund Olesen
When calling hasProperty() on an instruction inside a bundle, it should always behave as if IgnoreBundle was passed, and just return properties for the current instruction. Only attempt to aggregate bundle properties whan asked about the bundle header. The assertion fires on existing ARM test cases without this fix. llvm-svn: 172082
2013-01-10Support headerless bundles in MachineInstr::hasProperty().Jakob Stoklund Olesen
This function can still work without a BUNDLE header instruction. llvm-svn: 172029
2013-01-09Don't print bundle flags.Jakob Stoklund Olesen
The bundle flags are used by MachineBasicBlock::print(), they don't need to clutter up individual MachineInstrs. llvm-svn: 171986
2013-01-09Don't require BUNDLE headers in MachineInstr::getBundleSize().Jakob Stoklund Olesen
It is possible to build MI bundles that don't begin with a BUNDLE header. Add support for such bundles, counting all instructions inside the bundle. llvm-svn: 171985
2013-01-09Fix a typo in MachineInstr::unbundleFromSucc() method.Sergei Larin
llvm-svn: 171983
2013-01-07Pack MachineOperand bitfields better.Jakob Stoklund Olesen
Previously, 4 bits were unused. llvm-svn: 171814
2013-01-07Pack MachineInstr fields better.Jakob Stoklund Olesen
This shrinks MachineInstr to 64 bytes (from 72). llvm-svn: 171813
2013-01-05Don't call destructors on MachineInstr and MachineOperand.Jakob Stoklund Olesen
The series of patches leading up to this one makes llc -O0 run 8% faster. When deallocating a MachineFunction, there is no need to visit all MachineInstr and MachineOperand objects to deallocate them. All their memory come from a BumpPtrAllocator that is about to be purged, and they have empty destructors anyway. This only applies when deallocating the MachineFunction. DeleteMachineInstr() should still be used to recycle MI memory during the codegen passes. Remove the LeakDetector support for MachineInstr. I've never seen it used before, and now it definitely doesn't work. With this patch, leaked MachineInstrs would be much less of a problem since all of their memory will be reclaimed by ~MachineFunction(). llvm-svn: 171599
2013-01-05Use ArrayRecycler for MachineInstr operand lists.Jakob Stoklund Olesen
Instead of an std::vector<MachineOperand>, use MachineOperand arrays from an ArrayRecycler living in MachineFunction. This has several advantages: - MachineInstr now has a trivial destructor, making it possible to delete them in batches when destroying MachineFunction. This will be enabled in a later patch. - Bypassing malloc() and free() can be faster, depending on the system library. - MachineInstr objects and their operands are allocated from the same BumpPtrAllocator, so they will usually be next to each other in memory, providing better locality of reference. - Reduce MachineInstr footprint. A std::vector is 24 bytes, the new operand array representation only uses 8+4+1 bytes in MachineInstr. - Better control over operand array reallocations. In the old representation, the use-def chains would be reordered whenever a std::vector reached its capacity. The new implementation never changes the use-def chain order. Note that some decisions in the code generator depend on the use-def chain orders, so this patch may cause different assembly to be produced in a few cases. llvm-svn: 171598
2013-01-02Move all of the header files which are involved in modelling the LLVM IRChandler Carruth
into their new header subdirectory: include/llvm/IR. This matches the directory structure of lib, and begins to correct a long standing point of file layout clutter in LLVM. There are still more header files to move here, but I wanted to handle them in separate commits to make tracking what files make sense at each layer easier. The only really questionable files here are the target intrinsic tablegen files. But that's a battle I'd rather not fight today. I've updated both CMake and Makefile build systems (I think, and my tests think, but I may have missed something). I've also re-sorted the includes throughout the project. I'll be committing updates to Clang, DragonEgg, and Polly momentarily. llvm-svn: 171366
2012-12-22Remove a special case that doesn't seem necessary any longer.Jakob Stoklund Olesen
Back when this exception was added, it was skipping a lot more code, but now it just looks like a premature optimization. llvm-svn: 170989
2012-12-22Use getNumOperands() instead of Operands.size().Jakob Stoklund Olesen
The representation of the Operands array is going to change soon so it can be allocated from a BumpPtrAllocator. llvm-svn: 170988
2012-12-20Require the two-argument MI::addOperand(MF, MO) for dangling instructions.Jakob Stoklund Olesen
Instructions that are inserted in a basic block can still be decorated with addOperand(MO). Make the two-argument addOperand() function contain the actual implementation. This function will now always have a valid MF reference that it can use for memory allocation. llvm-svn: 170798
2012-12-20Add an MF argument to MI::copyImplicitOps().Jakob Stoklund Olesen
This function is often used to decorate dangling instructions, so a context reference is required to allocate memory for the operands. Also add a corresponding MachineInstrBuilder method. llvm-svn: 170797
2012-12-20Use two-arg addOperand(MF, MO) internally in MachineInstr when possible.Jakob Stoklund Olesen
llvm-svn: 170796
2012-12-20Remove two dead functions.Jakob Stoklund Olesen
llvm-svn: 170766
2012-12-18Use bidirectional bundle flags to simplify important functions.Jakob Stoklund Olesen
The bundle_iterator::operator++ function now doesn't need to dig out the basic block and check against end(). It can use the isBundledWithSucc() flag to find the last bundled instruction safely. Similarly, MachineInstr::isBundled() no longer needs to look at iterators etc. It only has to look at flags. llvm-svn: 170473
2012-12-18Verify bundle flag consistency when setting them.Jakob Stoklund Olesen
Now that the bundle flag aware APIs are all in place, it is possible to continuously verify the flag consistency. llvm-svn: 170465
2012-12-18Don't allow the automatically updated MI flags to be set directly.Jakob Stoklund Olesen
The bundle-related MI flags need to be kept in sync with the neighboring instructions. Don't allow the bulk flag-setting setFlags() function to change them. Also don't copy MI flags when cloning an instruction. The clone's bundle flags will be set when it is explicitly inserted into a bundle. llvm-svn: 170459
2012-12-17Tighten up the erase/remove API for bundled instructions.Jakob Stoklund Olesen
Most code is oblivious to bundles and uses the MBB::iterator which only visits whole bundles. MBB::erase() operates on whole bundles at a time as before. MBB::remove() now refuses to remove bundled instructions. It is not safe to remove all instructions in a bundle without deleting them since there is no way of returning pointers to all the removed instructions. MBB::remove_instr() and MBB::erase_instr() will now update bundle flags correctly, lifting individual instructions out of bundles while leaving the remaining bundle intact. The MachineInstr convenience functions are updated so eraseFromParent() erases a whole bundle as before eraseFromBundle() erases a single instruction, leaving the rest of its bundle. removeFromParent() refuses to operate on bundled instructions, and removeFromBundle() lifts a single instruction out of its bundle. These functions will no longer accidentally split or coalesce bundles - bundle flags are updated to preserve the existing bundling, and explicit bundleWith* / unbundleFrom* functions should be used to change the instruction bundling. This API update is still a work in progress. I am going to update APIs first so they maintain bundle flags automatically when possible. Then I'll add stricter verification of the bundle flags. llvm-svn: 170384
2012-12-07Add higher-level API for dealing with bundled MachineInstrs.Jakob Stoklund Olesen
This is still a work in progress. The purpose is to make bundling and unbundling operations explicit, and to catch errors where bundles are broken or created inadvertently. The old IsInsideBundle flag is replaced by two MI flags: BundledPred which has the same meaning as IsInsideBundle, and BundledSucc which is set on instructions that are bundled with a successor. Having two flags provdes redundancy to detect when a bundle is inadvertently torn by a splice() or insert(), and it makes it possible to write bundle iterators that don't need to peek at adjacent instructions. The new flags can't be manipulated directly (once setIsInsideBundle is gone). Instead there are MI functions to make and break bundle bonds. The setIsInsideBundle function will be removed in a future commit. It should be replaced by bundleWithPred(). llvm-svn: 169583
2012-12-05Remove unused MachineInstr constructors.Jakob Stoklund Olesen
A MachineInstr can only ever be constructed by CreateMachineInstr() and CloneMachineInstr(), and those factories don't use the removed constructors. llvm-svn: 169395
2012-12-03Use the new script to sort the includes of every file under lib.Chandler Carruth
Sooooo many of these had incorrect or strange main module includes. I have manually inspected all of these, and fixed the main module include to be the nearest plausible thing I could find. If you own or care about any of these source files, I encourage you to take some time and check that these edits were sensible. I can't have broken anything (I strictly added headers, and reordered them, never removed), but they may not be the headers you'd really like to identify as containing the API being implemented. Many forward declarations and missing includes were added to a header files to allow them to parse cleanly when included first. The main module rule does in fact have its merits. =] llvm-svn: 169131
2012-10-31Check that iterator I is not the end iterator.Akira Hatanaka
llvm-svn: 167086
2012-10-07Remove unused MachineInstr constructors that don't take a DebugLoc argument.Craig Topper
llvm-svn: 165382
2012-09-12Fix PR11985Michael Liao
- BlockAddress has no support of BA + offset form and there is no way to propagate that offset into machine operand; - Add BA + offset support and a new interface 'getTargetBlockAddress' to simplify target block address forming; - All targets are modified to use new interface and X86 backend is enhanced to support BA + offset addressing. llvm-svn: 163743
2012-09-11Release build: guard dump functions withManman Ren
"#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)" No functional change. Update r163339. llvm-svn: 163653
2012-09-06Release build: guard dump functions with "ifndef NDEBUG"Manman Ren
No functional change. llvm-svn: 163339
2012-09-05Cleanup a few magic numbers.Chad Rosier
llvm-svn: 163263
2012-09-05[ms-inline asm] We only need one bit to represent the AsmDialect in theChad Rosier
MachineInstr. llvm-svn: 163257
2012-09-05[ms-inline asm] Propagate the asm dialect into the MachineInstr representation.Chad Rosier
llvm-svn: 163243
2012-09-04Typo.Jakob Stoklund Olesen
llvm-svn: 163154
2012-09-04Actually use the MachineOperand field for isRegTiedToDefOperand().Jakob Stoklund Olesen
The MachineOperand::TiedTo field was maintained, but not used. This patch enables it in isRegTiedToDefOperand() and isRegTiedToUseOperand() which are the actual functions use by the register allocator. llvm-svn: 163153
2012-09-04Allow tied uses and defs in different orders.Jakob Stoklund Olesen
After much agonizing, use a full 4 bits of precious MachineOperand space to encode this. This uses existing padding, and doesn't grow MachineOperand beyond its current 32 bytes. This allows tied defs among the first 15 operands on a normal instruction, just like the current MCInstrDesc constraint encoding. Inline assembly needs to be able to tie more than the first 15 operands, and gets special treatment. Tied uses can appear beyond 15 operands, as long as they are tied to a def that's in range. llvm-svn: 163151
2012-08-31Add MachineInstr::tieOperands, remove setIsTied().Jakob Stoklund Olesen
Manage tied operands entirely internally to MachineInstr. This makes it possible to change the representation of tied operands, as I will do shortly. The constraint that tied uses and defs must be in the same order was too restrictive. llvm-svn: 163021