@@ -125,8 +125,41 @@ static std::unique_ptr<MachineFunction> cloneMF(MachineFunction *SrcMF) {
125
125
auto *DstMRI = &DstMF->getRegInfo ();
126
126
127
127
// Clone blocks.
128
- for (MachineBasicBlock &SrcMBB : *SrcMF)
129
- Src2DstMBB[&SrcMBB] = DstMF->CreateMachineBasicBlock ();
128
+ for (MachineBasicBlock &SrcMBB : *SrcMF) {
129
+ MachineBasicBlock *DstMBB =
130
+ DstMF->CreateMachineBasicBlock (SrcMBB.getBasicBlock ());
131
+ Src2DstMBB[&SrcMBB] = DstMBB;
132
+
133
+ if (SrcMBB.hasAddressTaken ())
134
+ DstMBB->setHasAddressTaken ();
135
+
136
+ // FIXME: This is not serialized
137
+ if (SrcMBB.hasLabelMustBeEmitted ())
138
+ DstMBB->setLabelMustBeEmitted ();
139
+
140
+ DstMBB->setAlignment (SrcMBB.getAlignment ());
141
+
142
+ // FIXME: This is not serialized
143
+ DstMBB->setMaxBytesForAlignment (SrcMBB.getMaxBytesForAlignment ());
144
+
145
+ DstMBB->setIsEHPad (SrcMBB.isEHPad ());
146
+ DstMBB->setIsEHScopeEntry (SrcMBB.isEHScopeEntry ());
147
+ DstMBB->setIsEHCatchretTarget (SrcMBB.isEHCatchretTarget ());
148
+ DstMBB->setIsEHFuncletEntry (SrcMBB.isEHFuncletEntry ());
149
+
150
+ // FIXME: These are not serialized
151
+ DstMBB->setIsCleanupFuncletEntry (SrcMBB.isCleanupFuncletEntry ());
152
+ DstMBB->setIsBeginSection (SrcMBB.isBeginSection ());
153
+ DstMBB->setIsEndSection (SrcMBB.isEndSection ());
154
+
155
+ DstMBB->setSectionID (SrcMBB.getSectionID ());
156
+ DstMBB->setIsInlineAsmBrIndirectTarget (
157
+ SrcMBB.isInlineAsmBrIndirectTarget ());
158
+
159
+ // FIXME: This is not serialized
160
+ if (Optional<uint64_t > Weight = SrcMBB.getIrrLoopHeaderWeight ())
161
+ DstMBB->setIrrLoopHeaderWeight (*Weight);
162
+ }
130
163
131
164
const MachineFrameInfo &SrcMFI = SrcMF->getFrameInfo ();
132
165
MachineFrameInfo &DstMFI = DstMF->getFrameInfo ();
@@ -187,25 +220,36 @@ static std::unique_ptr<MachineFunction> cloneMF(MachineFunction *SrcMF) {
187
220
}
188
221
}
189
222
223
+ const TargetSubtargetInfo &STI = DstMF->getSubtarget ();
224
+ const TargetInstrInfo *TII = STI.getInstrInfo ();
225
+ const TargetRegisterInfo *TRI = STI.getRegisterInfo ();
226
+
190
227
// Link blocks.
191
228
for (auto &SrcMBB : *SrcMF) {
192
229
auto *DstMBB = Src2DstMBB[&SrcMBB];
193
230
DstMF->push_back (DstMBB);
231
+
194
232
for (auto It = SrcMBB.succ_begin (), IterEnd = SrcMBB.succ_end ();
195
233
It != IterEnd; ++It) {
196
234
auto *SrcSuccMBB = *It;
197
235
auto *DstSuccMBB = Src2DstMBB[SrcSuccMBB];
198
- DstMBB->addSuccessor (DstSuccMBB);
236
+ DstMBB->addSuccessor (DstSuccMBB, SrcMBB. getSuccProbability (It) );
199
237
}
200
238
for (auto &LI : SrcMBB.liveins ())
201
239
DstMBB->addLiveIn (LI);
240
+
241
+ // Make sure MRI knows about registers clobbered by unwinder.
242
+ if (DstMBB->isEHPad ()) {
243
+ if (auto *RegMask = TRI->getCustomEHPadPreservedMask (*DstMF))
244
+ DstMRI->addPhysRegsUsedFromRegMask (RegMask);
245
+ }
202
246
}
247
+
203
248
// Clone instructions.
204
249
for (auto &SrcMBB : *SrcMF) {
205
250
auto *DstMBB = Src2DstMBB[&SrcMBB];
206
251
for (auto &SrcMI : SrcMBB) {
207
- const auto &MCID =
208
- DstMF->getSubtarget ().getInstrInfo ()->get (SrcMI.getOpcode ());
252
+ const auto &MCID = TII->get (SrcMI.getOpcode ());
209
253
auto *DstMI = DstMF->CreateMachineInstr (MCID, SrcMI.getDebugLoc (),
210
254
/* NoImplicit=*/ true );
211
255
DstMBB->push_back (DstMI);
0 commit comments