- Dec 21, 2011
-
-
Jakob Stoklund Olesen authored
llvm-svn: 147071
-
- Dec 07, 2011
-
-
Evan Cheng authored
generator to it. For non-bundle instructions, these behave exactly the same as the MC layer API. For properties like mayLoad / mayStore, look into the bundle and if any of the bundled instructions has the property it would return true. For properties like isPredicable, only return true if *all* of the bundled instructions have the property. For properties like canFoldAsLoad, isCompare, conservatively return false for bundles. llvm-svn: 146026
-
- Nov 23, 2011
-
-
Jakob Stoklund Olesen authored
This was a bug in keeping track of the available domains when merging domain values. The wrong domain mask caused ExecutionDepsFix to try to move VANDPSYrr to the integer domain which is only available in AVX2. Also add an assertion to catch future attempts at emitting AVX2 instructions. llvm-svn: 145096
-
- Nov 15, 2011
-
-
Jakob Stoklund Olesen authored
A function using any RC alias is enough to enable the ExeDepsFix pass. llvm-svn: 144636
-
Jakob Stoklund Olesen authored
Two new TargetInstrInfo hooks lets the target tell ExecutionDepsFix about instructions with partial register updates causing false unwanted dependencies. The ExecutionDepsFix pass will break the false dependencies if the updated register was written in the previoius N instructions. The small loop added to sse-domains.ll runs twice as fast with dependency-breaking instructions inserted. llvm-svn: 144602
-
Jakob Stoklund Olesen authored
Keep track of the last instruction to define each register individually instead of per DomainValue. This lets us track more accurately when a register was last written. Also track register ages across basic blocks. When entering a new basic block, use the least stale predecessor def as a worst case estimate for register age. The register age is used to arbitrate between conflicting domains. The most recently defined register wins. llvm-svn: 144601
-
- Nov 09, 2011
-
-
Jakob Stoklund Olesen authored
During the initial RPO traversal of the basic blocks, remember the ones that are incomplete because of back-edges from predecessors that haven't been visited yet. After the initial RPO, revisit all those loop headers so the incoming DomainValues on the back-edges can be properly collapsed. This will properly fix execution domains on software pipelined code, like the included test case. llvm-svn: 144151
-
Jakob Stoklund Olesen authored
When merging two uncollapsed DomainValues, place a link to the active DomainValue from the passive DomainValue. This allows old stale references to the passive DomainValue to be updated to point to the active DomainValue. The new resolve() function finds the active DomainValue and updates the pointer. This change makes old live-out lists more useful since they may contain uncollapsed DomainValues that have since been merged into other DomainValues. llvm-svn: 144149
-
Jakob Stoklund Olesen authored
This allows clear() to be called on a DomainValue with references. llvm-svn: 144147
-
- Nov 08, 2011
-
-
Jakob Stoklund Olesen authored
There is no need to involve the LiveRegs array and kill() any longer. llvm-svn: 144133
-
Jakob Stoklund Olesen authored
No functional change. llvm-svn: 144132
-
Jakob Stoklund Olesen authored
This new function will decrement the reference count, and collapse a domain value when the last reference is gone. This simplifies DomainValue reference counting, and decouples it from the LiveRegs array. llvm-svn: 144131
-
Jakob Stoklund Olesen authored
The old value may still be referenced by some live-out list, and we don't wan't to collapse those instructions twice. This fixes the "Can only swizzle VMOVD" assertion in some armv7 SPEC builds. <rdar://problem/10413292> llvm-svn: 144117
-
Jakob Stoklund Olesen authored
DomainValues that are only used by "don't care" instructions are now collapsed to the first possible execution domain after all basic blocks have been processed. This typically means the PS domain on x86. For example, the vsel_i64 and vsel_double functions in sse2-blend.ll are completely collapsed to the PS domain instead of containing a mix of execution domains created by isel. llvm-svn: 144037
-
- Nov 07, 2011
-
-
Jakob Stoklund Olesen authored
The enterBasicBlock() function is combining live-out values from predecessor blocks. The RPO traversal means that more predecessors have been visited when that happens, only back-edges are missing. llvm-svn: 144025
-
Jakob Stoklund Olesen authored
llvm-svn: 144020
-
Jakob Stoklund Olesen authored
llvm-svn: 144015
-
Jakob Stoklund Olesen authored
llvm-svn: 144014
-
- Sep 28, 2011
-
-
Jakob Stoklund Olesen authored
No functional change intended. llvm-svn: 140664
-
Jakob Stoklund Olesen authored
I'll clean up the source in the next commit. llvm-svn: 140663
-
Jakob Stoklund Olesen authored
This also enables domain swizzling for AVX code which required a few trivial test changes. The pass will be moved to lib/CodeGen shortly. llvm-svn: 140659
-
Jakob Stoklund Olesen authored
I am going to unify the SSEDomainFix and NEONMoveFix passes into a single target independent pass. They are essentially doing the same thing. llvm-svn: 140652
-
- Aug 06, 2010
-
-
Owen Anderson authored
llvm-svn: 110460
-
Owen Anderson authored
llvm-svn: 110410
-
Owen Anderson authored
ID member as the sole unique type identifier. Clean up APIs related to this change. llvm-svn: 110396
-
- May 26, 2010
-
-
Jakob Stoklund Olesen authored
This means that our Registers are now ordered R7, R8, R9, R10, R12, ... Not R1, R10, R11, R12, R2, R3, ... llvm-svn: 104745
-
- Apr 13, 2010
-
-
Dan Gohman authored
MachineBasicBlock::livein_iterator a const_iterator, because clients shouldn't ever be using the iterator interface to mutate the livein set. llvm-svn: 101147
-
- Apr 07, 2010
-
-
John McCall authored
solution. The only reason these don't fire with gcc-4.2 is that gcc turns off part of -Wsign-compare in C++ on accident. llvm-svn: 100581
-
- Apr 06, 2010
-
-
Jakob Stoklund Olesen authored
This fixes the Bullet regression on i386/nocona. llvm-svn: 100553
-
- Apr 04, 2010
-
-
Jakob Stoklund Olesen authored
Restrict bit mask operations to the DomainValue class. Rename methods for clarity. llvm-svn: 100353
-
Jakob Stoklund Olesen authored
llvm-svn: 100332
-
- Mar 31, 2010
-
-
Chris Lattner authored
llvm-svn: 100042
-
Jakob Stoklund Olesen authored
llvm-svn: 100037
-
Jakob Stoklund Olesen authored
llvm-svn: 100016
-
Jakob Stoklund Olesen authored
llvm-svn: 99974
-
- Mar 30, 2010
-
-
Jakob Stoklund Olesen authored
llvm-svn: 99916
-
Jakob Stoklund Olesen authored
llvm-svn: 99855
-
Jakob Stoklund Olesen authored
Cross-block inference is primitive and wrong, but the pass is working otherwise. llvm-svn: 99848
-
- Mar 25, 2010
-
-
Daniel Dunbar authored
llvm-svn: 99542
-
Jakob Stoklund Olesen authored
On Nehalem and newer CPUs there is a 2 cycle latency penalty on using a register in a different domain than where it was defined. Some instructions have equvivalents for different domains, like por/orps/orpd. The SSEDomainFix pass tries to minimize the number of domain crossings by changing between equvivalent opcodes where possible. This is a work in progress, in particular the pass doesn't do anything yet. SSE instructions are tagged with their execution domain in TableGen using the last two bits of TSFlags. Note that not all instructions are tagged correctly. Life just isn't that simple. The SSE execution domain issue is very similar to the ARM NEON/VFP pipeline issue handled by NEONMoveFixPass. This pass may become target independent to handle both. llvm-svn: 99524
-