Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 1 | //===- llvm/CodeGen/AntiDepBreaker.h - Anti-Dependence Breaking -*- C++ -*-===// |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file implements the AntiDepBreaker class, which implements |
| 10 | // anti-dependence breaking heuristics for post-register-allocation scheduling. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
Benjamin Kramer | a7c40ef | 2014-08-13 16:26:38 +0000 | [diff] [blame] | 14 | #ifndef LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H |
| 15 | #define LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 16 | |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 17 | #include "llvm/ADT/iterator_range.h" |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 18 | #include "llvm/CodeGen/MachineBasicBlock.h" |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 19 | #include "llvm/CodeGen/MachineInstr.h" |
| 20 | #include "llvm/CodeGen/MachineOperand.h" |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 21 | #include "llvm/CodeGen/ScheduleDAG.h" |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 22 | #include "llvm/Support/Compiler.h" |
| 23 | #include <cassert> |
| 24 | #include <utility> |
David Goodwin | 80a03cc | 2009-11-20 19:32:48 +0000 | [diff] [blame] | 25 | #include <vector> |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 26 | |
| 27 | namespace llvm { |
| 28 | |
Sanjay Patel | d649235 | 2014-09-21 14:48:16 +0000 | [diff] [blame] | 29 | /// This class works in conjunction with the post-RA scheduler to rename |
| 30 | /// registers to break register anti-dependencies (WAR hazards). |
Benjamin Kramer | f4c2025 | 2015-07-01 14:47:39 +0000 | [diff] [blame] | 31 | class LLVM_LIBRARY_VISIBILITY AntiDepBreaker { |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 32 | public: |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 33 | using DbgValueVector = |
| 34 | std::vector<std::pair<MachineInstr *, MachineInstr *>>; |
Devang Patel | f02a376 | 2011-06-02 21:26:52 +0000 | [diff] [blame] | 35 | |
David Goodwin | 661ea98 | 2009-10-26 19:41:00 +0000 | [diff] [blame] | 36 | virtual ~AntiDepBreaker(); |
David Goodwin | 6b16b5e | 2009-10-26 19:00:47 +0000 | [diff] [blame] | 37 | |
Sanjay Patel | d649235 | 2014-09-21 14:48:16 +0000 | [diff] [blame] | 38 | /// Initialize anti-dep breaking for a new basic block. |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 39 | virtual void StartBlock(MachineBasicBlock *BB) = 0; |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 40 | |
Sanjay Patel | d649235 | 2014-09-21 14:48:16 +0000 | [diff] [blame] | 41 | /// Identifiy anti-dependencies within a basic-block region and break them by |
| 42 | /// renaming registers. Return the number of anti-dependencies broken. |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 43 | virtual unsigned BreakAntiDependencies(const std::vector<SUnit> &SUnits, |
Devang Patel | f02a376 | 2011-06-02 21:26:52 +0000 | [diff] [blame] | 44 | MachineBasicBlock::iterator Begin, |
| 45 | MachineBasicBlock::iterator End, |
| 46 | unsigned InsertPosIndex, |
| 47 | DbgValueVector &DbgValues) = 0; |
Fangrui Song | f78650a | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 48 | |
Sanjay Patel | d649235 | 2014-09-21 14:48:16 +0000 | [diff] [blame] | 49 | /// Update liveness information to account for the current |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 50 | /// instruction, which will not be scheduled. |
Duncan P. N. Exon Smith | 5e6e8c7 | 2016-02-27 19:33:37 +0000 | [diff] [blame] | 51 | virtual void Observe(MachineInstr &MI, unsigned Count, |
| 52 | unsigned InsertPosIndex) = 0; |
| 53 | |
Sanjay Patel | d649235 | 2014-09-21 14:48:16 +0000 | [diff] [blame] | 54 | /// Finish anti-dep breaking for a basic block. |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 55 | virtual void FinishBlock() = 0; |
Devang Patel | f02a376 | 2011-06-02 21:26:52 +0000 | [diff] [blame] | 56 | |
Sanjay Patel | d649235 | 2014-09-21 14:48:16 +0000 | [diff] [blame] | 57 | /// Update DBG_VALUE if dependency breaker is updating |
Devang Patel | f02a376 | 2011-06-02 21:26:52 +0000 | [diff] [blame] | 58 | /// other machine instruction to use NewReg. |
Duncan P. N. Exon Smith | 5e6e8c7 | 2016-02-27 19:33:37 +0000 | [diff] [blame] | 59 | void UpdateDbgValue(MachineInstr &MI, unsigned OldReg, unsigned NewReg) { |
| 60 | assert(MI.isDebugValue() && "MI is not DBG_VALUE!"); |
| 61 | if (MI.getOperand(0).isReg() && MI.getOperand(0).getReg() == OldReg) |
| 62 | MI.getOperand(0).setReg(NewReg); |
Devang Patel | f02a376 | 2011-06-02 21:26:52 +0000 | [diff] [blame] | 63 | } |
Andrew Ng | 10ebfe0 | 2017-04-25 15:39:57 +0000 | [diff] [blame] | 64 | |
| 65 | /// Update all DBG_VALUE instructions that may be affected by the dependency |
| 66 | /// breaker's update of ParentMI to use NewReg. |
| 67 | void UpdateDbgValues(const DbgValueVector &DbgValues, MachineInstr *ParentMI, |
| 68 | unsigned OldReg, unsigned NewReg) { |
| 69 | // The following code is dependent on the order in which the DbgValues are |
| 70 | // constructed in ScheduleDAGInstrs::buildSchedGraph. |
| 71 | MachineInstr *PrevDbgMI = nullptr; |
| 72 | for (const auto &DV : make_range(DbgValues.crbegin(), DbgValues.crend())) { |
| 73 | MachineInstr *PrevMI = DV.second; |
| 74 | if ((PrevMI == ParentMI) || (PrevMI == PrevDbgMI)) { |
| 75 | MachineInstr *DbgMI = DV.first; |
| 76 | UpdateDbgValue(*DbgMI, OldReg, NewReg); |
| 77 | PrevDbgMI = DbgMI; |
| 78 | } else if (PrevDbgMI) { |
| 79 | break; // If no match and already found a DBG_VALUE, we're done. |
| 80 | } |
| 81 | } |
| 82 | } |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 83 | }; |
| 84 | |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 85 | } // end namespace llvm |
David Goodwin | 8370485 | 2009-10-26 16:59:04 +0000 | [diff] [blame] | 86 | |
Eugene Zelenko | 4f81cdd | 2017-09-29 21:55:49 +0000 | [diff] [blame] | 87 | #endif // LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H |