1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00
llvm-mirror/lib/CodeGen
Simon Pilgrim b41431be80 [TargetLowering] Add SimplifyDemandedBits support for ISD::INSERT_VECTOR_ELT
This helps us relax the extension of a lot of scalar elements before they are inserted into a vector.

Its exposes an issue in DAGCombiner::convertBuildVecZextToZext as some/all the zero-extensions may be relaxed to ANY_EXTEND, so we need to handle that case to avoid a couple of AVX2 VPMOVZX test regressions.

Once this is in it should be easier to fix a number of remaining failures to fold loads into VBROADCAST nodes.

Differential Revision: https://reviews.llvm.org/D59484

llvm-svn: 356989
2019-03-26 12:32:01 +00:00
..
AsmPrinter Revert "[llvm] Prevent duplicate files in debug line header in dwarf 5." 2019-03-25 21:09:07 +00:00
GlobalISel GlobalISel: Fix RegBankSelect for REG_SEQUENCE 2019-03-21 20:45:36 +00:00
MIRParser MIR: Allow targets to serialize MachineFunctionInfo 2019-03-14 22:54:43 +00:00
SelectionDAG [TargetLowering] Add SimplifyDemandedBits support for ISD::INSERT_VECTOR_ELT 2019-03-26 12:32:01 +00:00
AggressiveAntiDepBreaker.cpp
AggressiveAntiDepBreaker.h
AllocationOrder.cpp
AllocationOrder.h
Analysis.cpp
AntiDepBreaker.h
AtomicExpandPass.cpp [AtomicExpand] Fix a crash bug when lowering unordered loads to cmpxchg 2019-03-19 17:20:49 +00:00
BasicTargetTransformInfo.cpp
BranchFolding.cpp
BranchFolding.h
BranchRelaxation.cpp
BreakFalseDeps.cpp
BuiltinGCs.cpp
CalcSpillWeights.cpp
CallingConvLower.cpp
CFIInstrInserter.cpp
CMakeLists.txt
CodeGen.cpp
CodeGenPrepare.cpp [CGP] Build the DominatorTree lazily 2019-03-25 18:38:48 +00:00
CriticalAntiDepBreaker.cpp
CriticalAntiDepBreaker.h
DeadMachineInstructionElim.cpp Allow machine dce to remove uses in the same instruction 2019-03-20 21:42:05 +00:00
DetectDeadLanes.cpp
DFAPacketizer.cpp
DwarfEHPrepare.cpp
EarlyIfConversion.cpp
EdgeBundles.cpp
ExecutionDomainFix.cpp
ExpandISelPseudos.cpp
ExpandMemCmp.cpp [ExpandMemCmp] Trigger on bcmp too. 2019-03-20 11:51:11 +00:00
ExpandPostRAPseudos.cpp
ExpandReductions.cpp Reland "Relax constraints for reduction vectorization" 2019-03-12 01:31:44 +00:00
FaultMaps.cpp
FEntryInserter.cpp
FuncletLayout.cpp
GCMetadata.cpp
GCMetadataPrinter.cpp
GCRootLowering.cpp
GCStrategy.cpp
GlobalMerge.cpp
IfConversion.cpp
ImplicitNullChecks.cpp [ImplicitNullChecks] Support unordered atomic accesses 2019-03-13 03:25:20 +00:00
IndirectBrExpandPass.cpp
InlineSpiller.cpp [InlineSpiller] Fix a crash due to lack of forward progress from remat (try 2) 2019-02-12 18:33:01 +00:00
InterferenceCache.cpp
InterferenceCache.h
InterleavedAccessPass.cpp
InterleavedLoadCombinePass.cpp
IntrinsicLowering.cpp
LatencyPriorityQueue.cpp
LazyMachineBlockFrequencyInfo.cpp
LexicalScopes.cpp
LiveDebugValues.cpp
LiveDebugVariables.cpp [NFC] Fix typos: preceeding -> preceding 2019-02-23 01:28:32 +00:00
LiveDebugVariables.h
LiveInterval.cpp
LiveIntervals.cpp
LiveIntervalUnion.cpp
LivePhysRegs.cpp
LiveRangeCalc.cpp
LiveRangeCalc.h
LiveRangeEdit.cpp
LiveRangeShrink.cpp
LiveRangeUtils.h
LiveRegMatrix.cpp
LiveRegUnits.cpp
LiveStacks.cpp
LiveVariables.cpp [NFC] add/modify wrapper function for findRegisterDefOperand(). 2019-02-20 07:01:04 +00:00
LLVMBuild.txt
LLVMTargetMachine.cpp
LocalStackSlotAllocation.cpp
LoopTraversal.cpp
LowerEmuTLS.cpp
LowLevelType.cpp
MachineBasicBlock.cpp
MachineBlockFrequencyInfo.cpp
MachineBlockPlacement.cpp [MBP] Factor out function hasViableTopFallthrough and enhancement 2019-02-22 18:04:37 +00:00
MachineBranchProbabilityInfo.cpp
MachineCombiner.cpp
MachineCopyPropagation.cpp
MachineCSE.cpp [Codegen] Remove dead flags on Physical Defs in machine cse 2019-02-20 10:22:18 +00:00
MachineDominanceFrontier.cpp
MachineDominators.cpp
MachineFrameInfo.cpp
MachineFunction.cpp
MachineFunctionPass.cpp
MachineFunctionPrinterPass.cpp
MachineInstr.cpp Allow unordered loads to be considered invariant in CodeGen 2019-03-19 18:27:18 +00:00
MachineInstrBundle.cpp
MachineLICM.cpp
MachineLoopInfo.cpp
MachineModuleInfo.cpp
MachineModuleInfoImpls.cpp
MachineOperand.cpp
MachineOptimizationRemarkEmitter.cpp
MachineOutliner.cpp
MachinePipeliner.cpp
MachinePostDominators.cpp
MachineRegionInfo.cpp
MachineRegisterInfo.cpp
MachineScheduler.cpp MISched: Don't schedule regions with 0 instructions 2019-03-25 17:15:44 +00:00
MachineSink.cpp Add skipFunction to PostRA machine sinking pass. 2019-02-21 02:11:06 +00:00
MachineSSAUpdater.cpp
MachineTraceMetrics.cpp
MachineVerifier.cpp GlobalISel: Verify g_insert 2019-02-19 16:10:16 +00:00
MacroFusion.cpp
MIRCanonicalizerPass.cpp
MIRPrinter.cpp MIR: Allow targets to serialize MachineFunctionInfo 2019-03-14 22:54:43 +00:00
MIRPrintingPass.cpp
OptimizePHIs.cpp [Codegen] Make sure kill flags are not incorrect from removed machine phi's 2019-02-12 15:02:57 +00:00
ParallelCG.cpp
PatchableFunction.cpp
PeepholeOptimizer.cpp
PHIElimination.cpp
PHIEliminationUtils.cpp
PHIEliminationUtils.h
PostRAHazardRecognizer.cpp
PostRASchedulerList.cpp
PreISelIntrinsicLowering.cpp
ProcessImplicitDefs.cpp
PrologEpilogInserter.cpp [DebugInfo] Keep parameter DBG_VALUEs before prologue code 2019-02-12 10:51:27 +00:00
PseudoSourceValue.cpp
ReachingDefAnalysis.cpp
README.txt
RegAllocBase.cpp
RegAllocBase.h
RegAllocBasic.cpp
RegAllocFast.cpp RegAllocFast: Do not allocate registers for undef uses 2019-03-19 19:16:04 +00:00
RegAllocGreedy.cpp [RegAllocGreedy] Take last chance recoloring into account in split and assign 2019-02-20 07:14:39 +00:00
RegAllocPBQP.cpp
RegisterClassInfo.cpp
RegisterCoalescer.cpp Rename a local variable counter to Counter. 2019-03-08 23:32:07 +00:00
RegisterCoalescer.h
RegisterPressure.cpp
RegisterScavenging.cpp RegisterScavenger: Allow fail without spill 2019-02-25 20:29:04 +00:00
RegisterUsageInfo.cpp
RegUsageInfoCollector.cpp
RegUsageInfoPropagate.cpp
RenameIndependentSubregs.cpp
ResetMachineFunctionPass.cpp [ResetMachineFunctionPass] Add visited functions statistics info 2019-03-14 01:13:15 +00:00
SafeStack.cpp
SafeStackColoring.cpp
SafeStackColoring.h
SafeStackLayout.cpp
SafeStackLayout.h
ScalarizeMaskedMemIntrin.cpp [ScalarizeMaskedMemIntrin] Add support for scalarizing expandload and compressstore intrinsics. 2019-03-21 17:38:52 +00:00
ScheduleDAG.cpp
ScheduleDAGInstrs.cpp
ScheduleDAGPrinter.cpp
ScoreboardHazardRecognizer.cpp
ShadowStackGCLowering.cpp
ShrinkWrap.cpp
SjLjEHPrepare.cpp
SlotIndexes.cpp
Spiller.h
SpillPlacement.cpp
SpillPlacement.h
SplitKit.cpp
SplitKit.h
StackColoring.cpp
StackMapLivenessAnalysis.cpp
StackMaps.cpp
StackProtector.cpp
StackSlotColoring.cpp
TailDuplication.cpp
TailDuplicator.cpp
TargetFrameLoweringImpl.cpp
TargetInstrInfo.cpp
TargetLoweringBase.cpp [CodeGen] Add MMOs to statepoint nodes during SelectionDAG 2019-03-12 19:12:33 +00:00
TargetLoweringObjectFileImpl.cpp [WebAssembly] Remove uses of ThreadModel 2019-02-28 18:39:08 +00:00
TargetOptionsImpl.cpp
TargetPassConfig.cpp CodeGen: Refactor regallocator command line and target selection 2019-03-19 19:33:12 +00:00
TargetRegisterInfo.cpp [RegAlloc] Avoid compile time regression with multiple copy hints. 2019-03-11 19:00:37 +00:00
TargetSchedule.cpp
TargetSubtargetInfo.cpp [Subtarget] Merge ProcSched and ProcDesc arrays in MCSubtargetInfo into a single array. 2019-03-05 18:54:38 +00:00
TwoAddressInstructionPass.cpp [TwoAddressInstructionPass] After commuting an instruction and before trying to look for more commutable operands, resample the number of operands. 2019-02-23 21:41:44 +00:00
UnreachableBlockElim.cpp [Utils] Extract EliminateUnreachableBlocks (NFC) 2019-03-11 17:51:57 +00:00
ValueTypes.cpp [CodeGen] Defined MVTs v3i32, v3f32, v5i32, v5f32 2019-03-17 22:56:38 +00:00
VirtRegMap.cpp
WasmEHPrepare.cpp [WebAssembly] Make rethrow take an except_ref type argument 2019-03-16 05:38:57 +00:00
WinEHPrepare.cpp
XRayInstrumentation.cpp

//===---------------------------------------------------------------------===//

Common register allocation / spilling problem:

        mul lr, r4, lr
        str lr, [sp, #+52]
        ldr lr, [r1, #+32]
        sxth r3, r3
        ldr r4, [sp, #+52]
        mla r4, r3, lr, r4

can be:

        mul lr, r4, lr
        mov r4, lr
        str lr, [sp, #+52]
        ldr lr, [r1, #+32]
        sxth r3, r3
        mla r4, r3, lr, r4

and then "merge" mul and mov:

        mul r4, r4, lr
        str r4, [sp, #+52]
        ldr lr, [r1, #+32]
        sxth r3, r3
        mla r4, r3, lr, r4

It also increase the likelihood the store may become dead.

//===---------------------------------------------------------------------===//

bb27 ...
        ...
        %reg1037 = ADDri %reg1039, 1
        %reg1038 = ADDrs %reg1032, %reg1039, %noreg, 10
    Successors according to CFG: 0x8b03bf0 (#5)

bb76 (0x8b03bf0, LLVM BB @0x8b032d0, ID#5):
    Predecessors according to CFG: 0x8b0c5f0 (#3) 0x8b0a7c0 (#4)
        %reg1039 = PHI %reg1070, mbb<bb76.outer,0x8b0c5f0>, %reg1037, mbb<bb27,0x8b0a7c0>

Note ADDri is not a two-address instruction. However, its result %reg1037 is an
operand of the PHI node in bb76 and its operand %reg1039 is the result of the
PHI node. We should treat it as a two-address code and make sure the ADDri is
scheduled after any node that reads %reg1039.

//===---------------------------------------------------------------------===//

Use local info (i.e. register scavenger) to assign it a free register to allow
reuse:
        ldr r3, [sp, #+4]
        add r3, r3, #3
        ldr r2, [sp, #+8]
        add r2, r2, #2
        ldr r1, [sp, #+4]  <==
        add r1, r1, #1
        ldr r0, [sp, #+4]
        add r0, r0, #2

//===---------------------------------------------------------------------===//

LLVM aggressively lift CSE out of loop. Sometimes this can be negative side-
effects:

R1 = X + 4
R2 = X + 7
R3 = X + 15

loop:
load [i + R1]
...
load [i + R2]
...
load [i + R3]

Suppose there is high register pressure, R1, R2, R3, can be spilled. We need
to implement proper re-materialization to handle this:

R1 = X + 4
R2 = X + 7
R3 = X + 15

loop:
R1 = X + 4  @ re-materialized
load [i + R1]
...
R2 = X + 7 @ re-materialized
load [i + R2]
...
R3 = X + 15 @ re-materialized
load [i + R3]

Furthermore, with re-association, we can enable sharing:

R1 = X + 4
R2 = X + 7
R3 = X + 15

loop:
T = i + X
load [T + 4]
...
load [T + 7]
...
load [T + 15]
//===---------------------------------------------------------------------===//

It's not always a good idea to choose rematerialization over spilling. If all
the load / store instructions would be folded then spilling is cheaper because
it won't require new live intervals / registers. See 2003-05-31-LongShifts for
an example.

//===---------------------------------------------------------------------===//

With a copying garbage collector, derived pointers must not be retained across
collector safe points; the collector could move the objects and invalidate the
derived pointer. This is bad enough in the first place, but safe points can
crop up unpredictably. Consider:

        %array = load { i32, [0 x %obj] }** %array_addr
        %nth_el = getelementptr { i32, [0 x %obj] }* %array, i32 0, i32 %n
        %old = load %obj** %nth_el
        %z = div i64 %x, %y
        store %obj* %new, %obj** %nth_el

If the i64 division is lowered to a libcall, then a safe point will (must)
appear for the call site. If a collection occurs, %array and %nth_el no longer
point into the correct object.

The fix for this is to copy address calculations so that dependent pointers
are never live across safe point boundaries. But the loads cannot be copied
like this if there was an intervening store, so may be hard to get right.

Only a concurrent mutator can trigger a collection at the libcall safe point.
So single-threaded programs do not have this requirement, even with a copying
collector. Still, LLVM optimizations would probably undo a front-end's careful
work.

//===---------------------------------------------------------------------===//

The ocaml frametable structure supports liveness information. It would be good
to support it.

//===---------------------------------------------------------------------===//

The FIXME in ComputeCommonTailLength in BranchFolding.cpp needs to be
revisited. The check is there to work around a misuse of directives in inline
assembly.

//===---------------------------------------------------------------------===//

It would be good to detect collector/target compatibility instead of silently
doing the wrong thing.

//===---------------------------------------------------------------------===//

It would be really nice to be able to write patterns in .td files for copies,
which would eliminate a bunch of explicit predicates on them (e.g. no side
effects).  Once this is in place, it would be even better to have tblgen
synthesize the various copy insertion/inspection methods in TargetInstrInfo.

//===---------------------------------------------------------------------===//

Stack coloring improvements:

1. Do proper LiveStacks analysis on all stack objects including those which are
   not spill slots.
2. Reorder objects to fill in gaps between objects.
   e.g. 4, 1, <gap>, 4, 1, 1, 1, <gap>, 4 => 4, 1, 1, 1, 1, 4, 4

//===---------------------------------------------------------------------===//

The scheduler should be able to sort nearby instructions by their address. For
example, in an expanded memset sequence it's not uncommon to see code like this:

  movl $0, 4(%rdi)
  movl $0, 8(%rdi)
  movl $0, 12(%rdi)
  movl $0, 0(%rdi)

Each of the stores is independent, and the scheduler is currently making an
arbitrary decision about the order.

//===---------------------------------------------------------------------===//

Another opportunitiy in this code is that the $0 could be moved to a register:

  movl $0, 4(%rdi)
  movl $0, 8(%rdi)
  movl $0, 12(%rdi)
  movl $0, 0(%rdi)

This would save substantial code size, especially for longer sequences like
this. It would be easy to have a rule telling isel to avoid matching MOV32mi
if the immediate has more than some fixed number of uses. It's more involved
to teach the register allocator how to do late folding to recover from
excessive register pressure.