diff options
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm/CodeGen/FastISel.h | 18 | ||||
-rw-r--r-- | llvm/include/llvm/CodeGen/FunctionLoweringInfo.h | 2 |
2 files changed, 19 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/FastISel.h b/llvm/include/llvm/CodeGen/FastISel.h index 85bb826dcb8..f6f500beb82 100644 --- a/llvm/include/llvm/CodeGen/FastISel.h +++ b/llvm/include/llvm/CodeGen/FastISel.h @@ -241,9 +241,12 @@ public: } /// \brief Set the current block to which generated machine instructions will - /// be appended, and clear the local CSE map. + /// be appended. void startNewBlock(); + /// Flush the local value map and sink local values if possible. + void finishBasicBlock(); + /// \brief Return current debug location information. DebugLoc getCurDebugLoc() const { return DbgLoc; } @@ -560,6 +563,19 @@ private: /// \brief Removes dead local value instructions after SavedLastLocalvalue. void removeDeadLocalValueCode(MachineInstr *SavedLastLocalValue); + struct InstOrderMap { + DenseMap<MachineInstr *, unsigned> Orders; + MachineInstr *FirstTerminator = nullptr; + unsigned FirstTerminatorOrder = std::numeric_limits<unsigned>::max(); + + void initialize(MachineBasicBlock *MBB); + }; + + /// Sinks the local value materialization instruction LocalMI to its first use + /// in the basic block, or deletes it if it is not used. + void sinkLocalValueMaterialization(MachineInstr &LocalMI, unsigned DefReg, + InstOrderMap &OrderMap); + /// \brief Insertion point before trying to select the current instruction. MachineBasicBlock::iterator SavedInsertPt; diff --git a/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h b/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h index 24f5cd7cc66..2da00b7d61a 100644 --- a/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h +++ b/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h @@ -178,6 +178,8 @@ public: /// RegFixups - Registers which need to be replaced after isel is done. DenseMap<unsigned, unsigned> RegFixups; + DenseSet<unsigned> RegsWithFixups; + /// StatepointStackSlots - A list of temporary stack slots (frame indices) /// used to spill values at a statepoint. We store them here to enable /// reuse of the same stack slots across different statepoints in different |