annotate lib/CodeGen/AntiDepBreaker.h @ 134:3a76565eade5 LLVM5.0.1

update 5.0.1
author mir3636
date Sat, 17 Feb 2018 09:57:20 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1 //===- llvm/CodeGen/AntiDepBreaker.h - Anti-Dependence Breaking -*- C++ -*-===//
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This file implements the AntiDepBreaker class, which implements
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // anti-dependence breaking heuristics for post-register-allocation scheduling.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15 #ifndef LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
16 #define LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
18 #include "llvm/ADT/iterator_range.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/CodeGen/MachineBasicBlock.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
20 #include "llvm/CodeGen/MachineInstr.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include "llvm/CodeGen/MachineOperand.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "llvm/CodeGen/ScheduleDAG.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
23 #include "llvm/Support/Compiler.h"
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
24 #include <cassert>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
25 #include <utility>
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 #include <vector>
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 namespace llvm {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
30 /// This class works in conjunction with the post-RA scheduler to rename
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
31 /// registers to break register anti-dependencies (WAR hazards).
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
32 class LLVM_LIBRARY_VISIBILITY AntiDepBreaker {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
34 using DbgValueVector =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
35 std::vector<std::pair<MachineInstr *, MachineInstr *>>;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 virtual ~AntiDepBreaker();
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
39 /// Initialize anti-dep breaking for a new basic block.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 virtual void StartBlock(MachineBasicBlock *BB) = 0;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
42 /// Identifiy anti-dependencies within a basic-block region and break them by
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
43 /// renaming registers. Return the number of anti-dependencies broken.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 virtual unsigned BreakAntiDependencies(const std::vector<SUnit> &SUnits,
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 MachineBasicBlock::iterator Begin,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 MachineBasicBlock::iterator End,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 unsigned InsertPosIndex,
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 DbgValueVector &DbgValues) = 0;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
50 /// Update liveness information to account for the current
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 /// instruction, which will not be scheduled.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
52 virtual void Observe(MachineInstr &MI, unsigned Count,
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
53 unsigned InsertPosIndex) = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
54
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
55 /// Finish anti-dep breaking for a basic block.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
56 virtual void FinishBlock() = 0;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
58 /// Update DBG_VALUE if dependency breaker is updating
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 /// other machine instruction to use NewReg.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
60 void UpdateDbgValue(MachineInstr &MI, unsigned OldReg, unsigned NewReg) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
61 assert(MI.isDebugValue() && "MI is not DBG_VALUE!");
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
62 if (MI.getOperand(0).isReg() && MI.getOperand(0).getReg() == OldReg)
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
63 MI.getOperand(0).setReg(NewReg);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
65
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
66 /// Update all DBG_VALUE instructions that may be affected by the dependency
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67 /// breaker's update of ParentMI to use NewReg.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 void UpdateDbgValues(const DbgValueVector &DbgValues, MachineInstr *ParentMI,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 unsigned OldReg, unsigned NewReg) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 // The following code is dependent on the order in which the DbgValues are
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 // constructed in ScheduleDAGInstrs::buildSchedGraph.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 MachineInstr *PrevDbgMI = nullptr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
73 for (const auto &DV : make_range(DbgValues.crbegin(), DbgValues.crend())) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
74 MachineInstr *PrevMI = DV.second;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
75 if ((PrevMI == ParentMI) || (PrevMI == PrevDbgMI)) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
76 MachineInstr *DbgMI = DV.first;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
77 UpdateDbgValue(*DbgMI, OldReg, NewReg);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 PrevDbgMI = DbgMI;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79 } else if (PrevDbgMI) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
80 break; // If no match and already found a DBG_VALUE, we're done.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
81 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
82 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
83 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 };
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
86 } // end namespace llvm
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
88 #endif // LLVM_LIB_CODEGEN_ANTIDEPBREAKER_H