@@ -63,11 +63,46 @@ bool CopyPropagation::interpretAsCopy(const MachineInstr *MI, EqualityMap &EM) {
63
63
void CopyPropagation::recordCopy (NodeAddr<StmtNode*> SA, EqualityMap &EM) {
64
64
CopyMap.insert (std::make_pair (SA.Id , EM));
65
65
Copies.push_back (SA.Id );
66
+
67
+ for (auto I : EM) {
68
+ auto FS = DefM.find (I.second .Reg );
69
+ if (FS == DefM.end () || FS->second .empty ())
70
+ continue ; // Undefined source
71
+ RDefMap[I.second ][SA.Id ] = FS->second .top ()->Id ;
72
+ // Insert DstR into the map.
73
+ RDefMap[I.first ];
74
+ }
75
+ }
76
+
77
+
78
+ void CopyPropagation::updateMap (NodeAddr<InstrNode*> IA) {
79
+ RegisterSet RRs;
80
+ for (NodeAddr<RefNode*> RA : IA.Addr ->members (DFG))
81
+ RRs.insert (RA.Addr ->getRegRef (DFG));
82
+ bool Common = false ;
83
+ for (auto &R : RDefMap) {
84
+ if (!RRs.count (R.first ))
85
+ continue ;
86
+ Common = true ;
87
+ break ;
88
+ }
89
+ if (!Common)
90
+ return ;
91
+
92
+ for (auto &R : RDefMap) {
93
+ if (!RRs.count (R.first ))
94
+ continue ;
95
+ auto F = DefM.find (R.first .Reg );
96
+ if (F == DefM.end () || F->second .empty ())
97
+ continue ;
98
+ R.second [IA.Id ] = F->second .top ()->Id ;
99
+ }
66
100
}
67
101
68
102
bool CopyPropagation::scanBlock (MachineBasicBlock *B) {
69
103
bool Changed = false ;
70
104
NodeAddr<BlockNode*> BA = DFG.findBlock (B);
105
+ DFG.markBlock (BA.Id , DefM);
71
106
72
107
for (NodeAddr<InstrNode*> IA : BA.Addr ->members (DFG)) {
73
108
if (DFG.IsCode <NodeAttrs::Stmt>(IA)) {
@@ -76,28 +111,19 @@ bool CopyPropagation::scanBlock(MachineBasicBlock *B) {
76
111
if (interpretAsCopy (SA.Addr ->getCode (), EM))
77
112
recordCopy (SA, EM);
78
113
}
114
+
115
+ updateMap (IA);
116
+ DFG.pushAllDefs (IA, DefM);
79
117
}
80
118
81
119
MachineDomTreeNode *N = MDT.getNode (B);
82
120
for (auto *I : *N)
83
121
Changed |= scanBlock (I->getBlock ());
84
122
123
+ DFG.releaseBlock (BA.Id , DefM);
85
124
return Changed;
86
125
}
87
126
88
- NodeId CopyPropagation::getLocalReachingDef (RegisterRef RefRR,
89
- NodeAddr<InstrNode*> IA) {
90
- NodeAddr<RefNode*> RA = L.getNearestAliasedRef (RefRR, IA);
91
- if (RA.Id != 0 ) {
92
- if (RA.Addr ->getKind () == NodeAttrs::Def)
93
- return RA.Id ;
94
- assert (RA.Addr ->getKind () == NodeAttrs::Use);
95
- if (NodeId RD = RA.Addr ->getReachingDef ())
96
- return RD;
97
- }
98
- return 0 ;
99
- }
100
-
101
127
bool CopyPropagation::run () {
102
128
scanBlock (&DFG.getMF ().front ());
103
129
@@ -111,6 +137,14 @@ bool CopyPropagation::run() {
111
137
<< Print<RegisterRef>(J.second , DFG);
112
138
dbgs () << " }\n " ;
113
139
}
140
+ dbgs () << " \n RDef map:\n " ;
141
+ for (auto R : RDefMap) {
142
+ dbgs () << Print<RegisterRef>(R.first , DFG) << " -> {" ;
143
+ for (auto &M : R.second )
144
+ dbgs () << ' ' << Print<NodeId>(M.first , DFG) << ' :'
145
+ << Print<NodeId>(M.second , DFG);
146
+ dbgs () << " }\n " ;
147
+ }
114
148
}
115
149
116
150
bool Changed = false ;
@@ -150,7 +184,8 @@ bool CopyPropagation::run() {
150
184
if (DR == SR)
151
185
continue ;
152
186
153
- NodeId AtCopy = getLocalReachingDef (SR, SA);
187
+ auto &RDefSR = RDefMap[SR];
188
+ NodeId RDefSR_SA = RDefSR[SA.Id ];
154
189
155
190
for (NodeId N = DA.Addr ->getReachedUse (), NextN; N; N = NextN) {
156
191
auto UA = DFG.addr <UseNode*>(N);
@@ -163,8 +198,7 @@ bool CopyPropagation::run() {
163
198
164
199
NodeAddr<InstrNode*> IA = UA.Addr ->getOwner (DFG);
165
200
assert (DFG.IsCode <NodeAttrs::Stmt>(IA));
166
- NodeId AtUse = getLocalReachingDef (SR, IA);
167
- if (AtCopy != AtUse)
201
+ if (RDefSR[IA.Id ] != RDefSR_SA)
168
202
continue ;
169
203
170
204
MachineOperand &Op = UA.Addr ->getOp ();
@@ -180,8 +214,8 @@ bool CopyPropagation::run() {
180
214
Op.setReg (NewReg);
181
215
Op.setSubReg (0 );
182
216
DFG.unlinkUse (UA, false );
183
- if (AtCopy != 0 ) {
184
- UA.Addr ->linkToDef (UA.Id , DFG.addr <DefNode*>(AtCopy ));
217
+ if (RDefSR_SA != 0 ) {
218
+ UA.Addr ->linkToDef (UA.Id , DFG.addr <DefNode*>(RDefSR_SA ));
185
219
} else {
186
220
UA.Addr ->setReachingDef (0 );
187
221
UA.Addr ->setSibling (0 );
0 commit comments