LLVM: lib/CodeGen/BranchFolding.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
58#include
59#include
60#include
61#include
62
63using namespace llvm;
64
65#define DEBUG_TYPE "branch-folder"
66
67STATISTIC(NumDeadBlocks, "Number of dead blocks removed");
68STATISTIC(NumBranchOpts, "Number of branches optimized");
69STATISTIC(NumTailMerge , "Number of block tails merged");
70STATISTIC(NumHoist , "Number of times common instructions are hoisted");
71STATISTIC(NumTailCalls, "Number of tail calls optimized");
72
75
76
79 cl::desc("Max number of predecessors to consider tail merging"),
81
82
85 cl::desc("Min number of instructions to consider tail merging"),
87
88namespace {
89
90
92 public:
93 static char ID;
94
96
98
105 }
106
109 MachineFunctionProperties::Property::NoPHIs);
110 }
111 };
112
113}
114
115char BranchFolderPass::ID = 0;
116
118
120 "Control Flow Optimizer", false, false)
121
123 if (skipFunction(MF.getFunction()))
124 return false;
125
126 TargetPassConfig *PassConfig = &getAnalysis();
127
128
129 bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() &&
132 getAnalysis().getMBFI());
134 EnableTailMerge, true, MBBFreqInfo,
135 getAnalysis().getMBPI(),
136 &getAnalysis().getPSI());
137 return Folder.OptimizeFunction(MF, MF.getSubtarget().getInstrInfo(),
138 MF.getSubtarget().getRegisterInfo());
139}
140
145 : EnableHoistCommonCode(CommonHoist), MinCommonTailLength(MinTailLength),
146 MBBFreqInfo(FreqInfo), MBPI(ProbInfo), PSI(PSI) {
149 EnableTailMerge = DefaultEnableTailMerge;
150 break;
151 case cl::BOU_TRUE: EnableTailMerge = true; break;
152 case cl::BOU_FALSE: EnableTailMerge = false; break;
153 }
154}
155
159
161
164
165
166 TriedMerging.erase(MBB);
167
168
170 if (MI.shouldUpdateAdditionalCallInfo())
172
173
175 EHScopeMembership.erase(MBB);
176 if (MLI)
178}
179
184 if (!tii) return false;
185
186 TriedMerging.clear();
187
189 AfterBlockPlacement = AfterPlacement;
190 TII = tii;
191 TRI = tri;
192 MLI = mli;
193 this->MRI = &MRI;
194
195 if (MinCommonTailLength == 0) {
196 MinCommonTailLength = TailMergeSize.getNumOccurrences() > 0
199 }
200
202 if (!UpdateLiveIns)
203 MRI.invalidateLiveness();
204
205 bool MadeChange = false;
206
207
209
210 bool MadeChangeThisIteration = true;
211 while (MadeChangeThisIteration) {
212 MadeChangeThisIteration = TailMergeBlocks(MF);
213
214
215 if (!AfterBlockPlacement || MadeChangeThisIteration)
216 MadeChangeThisIteration |= OptimizeBranches(MF);
217 if (EnableHoistCommonCode)
218 MadeChangeThisIteration |= HoistCommonCode(MF);
219 MadeChange |= MadeChangeThisIteration;
220 }
221
222
223
225 if (!JTI)
226 return MadeChange;
227
228
233 if (.isJTI()) continue;
234
235
236 JTIsLive.set(Op.getIndex());
237 }
238 }
239
240
241
242 for (unsigned i = 0, e = JTIsLive.size(); i != e; ++i)
243 if (!JTIsLive.test(i)) {
245 MadeChange = true;
246 }
247
248 return MadeChange;
249}
250
251
252
253
254
255
257 unsigned Hash = MI.getOpcode();
258 for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
260
261
262
263
264 unsigned OperandHash = 0;
265 switch (Op.getType()) {
267 OperandHash = Op.getReg();
268 break;
270 OperandHash = Op.getImm();
271 break;
273 OperandHash = Op.getMBB()->getNumber();
274 break;
278 OperandHash = Op.getIndex();
279 break;
282
283
284 OperandHash = Op.getOffset();
285 break;
286 default:
287 break;
288 }
289
290 Hash += ((OperandHash << 3) | Op.getType()) << (i & 31);
291 }
292 return Hash;
293}
294
295
299 return 0;
300
302}
303
304
306 return !(MI.isDebugInstr() || MI.isCFIInstruction());
307}
308
309
310
311
316 --I;
318 return I;
319 }
321}
322
323
324
325
326
327
328
335
336 unsigned TailLen = 0;
337 while (true) {
340 if (MBBI1 == MBB1->end() || MBBI2 == MBB2->end())
341 break;
342 if (!MBBI1->isIdenticalTo(*MBBI2) ||
343
344
345
346
347
348 MBBI1->isInlineAsm()) {
349 break;
350 }
353 break;
354 ++TailLen;
355 I1 = MBBI1;
356 I2 = MBBI2;
357 }
358
359 return TailLen;
360}
361
364 if (UpdateLiveIns) {
365
367 LiveRegs.clear();
369
371 do {
372 --I;
374 } while (I != OldInst);
375
376
377
378
380
381
383 "Can only handle full register.");
385 if (!LiveRegs.available(*MRI, Reg))
386 continue;
388 BuildMI(OldMBB, OldInst, DL, TII->get(TargetOpcode::IMPLICIT_DEF), Reg);
389 }
390 }
391
393 ++NumTailMerge;
394}
395
400 return nullptr;
401
403
404
408
409
411
412
414
415
416 NewMBB->splice(NewMBB->end(), &CurMBB, BBI1, CurMBB.end());
417
418
419 if (MLI)
421 ML->addBasicBlockToLoop(NewMBB, *MLI);
422
423
425
426 if (UpdateLiveIns)
428
429
430 const auto &EHScopeI = EHScopeMembership.find(&CurMBB);
431 if (EHScopeI != EHScopeMembership.end()) {
432 auto n = EHScopeI->second;
433 EHScopeMembership[NewMBB] = n;
434 }
435
436 return NewMBB;
437}
438
439
440
443 unsigned Time = 0;
446 continue;
447 if (I->isCall())
448 Time += 10;
449 else if (I->mayLoadOrStore())
450 Time += 2;
451 else
452 ++Time;
453 }
454 return Time;
455}
456
457
458
459
460
468 if (!dl)
469 dl = BranchDL;
472 if (TBB == NextBB && .empty() && !FBB) {
476 return;
477 }
478 }
479 }
482}
483
484bool
485BranchFolder::MergePotentialsElt::operator<(const MergePotentialsElt &o) const {
486 if (getHash() < o.getHash())
487 return true;
488 if (getHash() > o.getHash())
489 return false;
490 if (getBlock()->getNumber() < o.getBlock()->getNumber())
491 return true;
492 if (getBlock()->getNumber() > o.getBlock()->getNumber())
493 return false;
494 return false;
495}
496
497
498
499
503 unsigned NumTerms = 0;
504 while (true) {
507 break;
508 }
509 --I;
510 if (->isTerminator()) break;
511 ++NumTerms;
512 }
513 return NumTerms;
514}
515
516
517
518
521 return false;
523 return true;
525}
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543static bool
545 unsigned MinCommonTailLength, unsigned &CommonTailLen,
550 bool AfterPlacement,
553
554 if (!EHScopeMembership.empty()) {
555 auto EHScope1 = EHScopeMembership.find(MBB1);
556 assert(EHScope1 != EHScopeMembership.end());
557 auto EHScope2 = EHScopeMembership.find(MBB2);
558 assert(EHScope2 != EHScopeMembership.end());
559 if (EHScope1->second != EHScope2->second)
560 return false;
561 }
562
564 if (CommonTailLen == 0)
565 return false;
568 << CommonTailLen << '\n');
569
570
571
572
574 I1 = MBB1->begin();
576 I2 = MBB2->begin();
577
578 bool FullBlockTail1 = I1 == MBB1->begin();
579 bool FullBlockTail2 = I2 == MBB2->begin();
580
581
582
583
584
585
586 if ((MBB1 == PredBB || MBB2 == PredBB) &&
587 (!AfterPlacement || MBB1->succ_size() == 1)) {
589 unsigned NumTerms = CountTerminators(MBB1 == PredBB ? MBB2 : MBB1, I);
590 if (CommonTailLen > NumTerms)
591 return true;
592 }
593
594
595
596
597
598
599 if (FullBlockTail1 && FullBlockTail2 &&
601 return true;
602
603
604
605
606
608 return true;
610 return true;
611
612
613
614
615
616 if (AfterPlacement && FullBlockTail1 && FullBlockTail2) {
619 return false;
622 return (MBB != &*MF->begin()) && std::prev(I)->canFallThrough();
623 };
624 if (!BothFallThrough(MBB1) || !BothFallThrough(MBB2))
625 return true;
626 }
627
628
629
630
631
632
633 unsigned EffectiveTailLen = CommonTailLen;
634 if (SuccBB && MBB1 != PredBB && MBB2 != PredBB &&
635 (MBB1->succ_size() == 1 || !AfterPlacement) &&
638 ++EffectiveTailLen;
639
640
641 if (EffectiveTailLen >= MinCommonTailLength)
642 return true;
643
644
645
646
647
650 return EffectiveTailLen >= 2 && OptForSize &&
651 (FullBlockTail1 || FullBlockTail2);
652}
653
654unsigned BranchFolder::ComputeSameTails(unsigned CurHash,
655 unsigned MinCommonTailLength,
658 unsigned maxCommonTailLength = 0U;
659 SameTails.clear();
661 MPIterator HighestMPIter = std::prev(MergePotentials.end());
662 for (MPIterator CurMPIter = std::prev(MergePotentials.end()),
663 B = MergePotentials.begin();
664 CurMPIter != B && CurMPIter->getHash() == CurHash; --CurMPIter) {
665 for (MPIterator I = std::prev(CurMPIter); I->getHash() == CurHash; --I) {
666 unsigned CommonTailLen;
668 MinCommonTailLength,
669 CommonTailLen, TrialBBI1, TrialBBI2,
670 SuccBB, PredBB,
671 EHScopeMembership,
672 AfterBlockPlacement, MBBFreqInfo, PSI)) {
673 if (CommonTailLen > maxCommonTailLength) {
674 SameTails.clear();
675 maxCommonTailLength = CommonTailLen;
676 HighestMPIter = CurMPIter;
677 SameTails.push_back(SameTailElt(CurMPIter, TrialBBI1));
678 }
679 if (HighestMPIter == CurMPIter &&
680 CommonTailLen == maxCommonTailLength)
681 SameTails.push_back(SameTailElt(I, TrialBBI2));
682 }
684 break;
685 }
686 }
687 return maxCommonTailLength;
688}
689
690void BranchFolder::RemoveBlocksWithHash(unsigned CurHash,
694 MPIterator CurMPIter, B;
695 for (CurMPIter = std::prev(MergePotentials.end()),
696 B = MergePotentials.begin();
697 CurMPIter->getHash() == CurHash; --CurMPIter) {
698
700 if (SuccBB && CurMBB != PredBB)
701 FixTail(CurMBB, SuccBB, TII, BranchDL);
702 if (CurMPIter == B)
703 break;
704 }
705 if (CurMPIter->getHash() != CurHash)
706 CurMPIter++;
707 MergePotentials.erase(CurMPIter, MergePotentials.end());
708}
709
710bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
712 unsigned maxCommonTailLength,
713 unsigned &commonTailIndex) {
714 commonTailIndex = 0;
715 unsigned TimeEstimate = ~0U;
716 for (unsigned i = 0, e = SameTails.size(); i != e; ++i) {
717
718 if (SameTails[i].getBlock() == PredBB) {
719 commonTailIndex = i;
720 break;
721 }
722
723
725 SameTails[i].getTailStartPos());
726 if (t <= TimeEstimate) {
727 TimeEstimate = t;
728 commonTailIndex = i;
729 }
730 }
731
733 SameTails[commonTailIndex].getTailStartPos();
735
737 << maxCommonTailLength);
738
739
740
741
745 if (!newMBB) {
747 return false;
748 }
749
750 SameTails[commonTailIndex].setBlock(newMBB);
751 SameTails[commonTailIndex].setTailStartPos(newMBB->begin());
752
753
754 if (PredBB == MBB)
755 PredBB = newMBB;
756
757 return true;
758}
759
760static void
764
765
766
767 unsigned CommonTailLen = 0;
768 for (auto E = MBB->end(); MBBIStartPos != E; ++MBBIStartPos)
769 ++CommonTailLen;
770
775
776 while (CommonTailLen--) {
777 assert(MBBI != MBBIE && "Reached BB end within common tail length!");
778 (void)MBBIE;
779
782 continue;
783 }
784
786 ++MBBICommon;
787
788 assert(MBBICommon != MBBIECommon &&
789 "Reached BB end within common tail length!");
790 assert(MBBICommon->isIdenticalTo(*MBBI) && "Expected matching MIIs!");
791
792
793 if (MBBICommon->mayLoadOrStore())
794 MBBICommon->cloneMergedMemRefs(*MBB->getParent(), {&*MBBICommon, &*MBBI});
795
796 for (unsigned I = 0, E = MBBICommon->getNumOperands(); I != E; ++I) {
802 }
803 }
804
806 ++MBBICommon;
807 }
808}
809
810void BranchFolder::mergeCommonTails(unsigned commonTailIndex) {
812
813 std::vectorMachineBasicBlock::iterator NextCommonInsts(SameTails.size());
814 for (unsigned int i = 0 ; i != SameTails.size() ; ++i) {
815 if (i != commonTailIndex) {
816 NextCommonInsts[i] = SameTails[i].getTailStartPos();
818 } else {
819 assert(SameTails[i].getTailStartPos() == MBB->begin() &&
820 "MBB is not a common tail only block");
821 }
822 }
823
826 continue;
828 for (unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) {
829 if (i == commonTailIndex)
830 continue;
831
832 auto &Pos = NextCommonInsts[i];
833 assert(Pos != SameTails[i].getBlock()->end() &&
834 "Reached BB end within common tail");
836 ++Pos;
837 assert(Pos != SameTails[i].getBlock()->end() &&
838 "Reached BB end within common tail");
839 }
840 assert(MI.isIdenticalTo(*Pos) && "Expected matching MIIs!");
842 NextCommonInsts[i] = ++Pos;
843 }
845 }
846
847 if (UpdateLiveIns) {
850 LiveRegs.init(*TRI);
851
852
853
855 LiveRegs.clear();
858 for (Register Reg : NewLiveIns) {
859 if (!LiveRegs.available(*MRI, Reg))
860 continue;
861
862
863
865 return NewLiveIns.contains(SReg) && !MRI->isReserved(SReg);
866 }))
867 continue;
868
870 BuildMI(*Pred, InsertBefore, DL, TII->get(TargetOpcode::IMPLICIT_DEF),
871 Reg);
872 }
873 }
874
877 }
878}
879
880
881
882
883
884
885
886
887
888
891 unsigned MinCommonTailLength) {
892 bool MadeChange = false;
893
895 dbgs() << "\nTryTailMergeBlocks: ";
896 for (unsigned i = 0, e = MergePotentials.size(); i != e; ++i)
898 << (i == e - 1 ? "" : ", ");
899 dbgs() << "\n";
900 if (SuccBB) {
902 if (PredBB)
904 << "\n";
905 }
906 dbgs() << "Looking for common tails of at least " << MinCommonTailLength
907 << " instruction" << (MinCommonTailLength == 1 ? "" : "s") << '\n';
908 });
909
910
911
912 array_pod_sort(MergePotentials.begin(), MergePotentials.end());
913
914
915 while (MergePotentials.size() > 1) {
916 unsigned CurHash = MergePotentials.back().getHash();
917 const DebugLoc &BranchDL = MergePotentials.back().getBranchDebugLoc();
918
919
920
921 unsigned maxCommonTailLength = ComputeSameTails(CurHash,
922 MinCommonTailLength,
923 SuccBB, PredBB);
924
925
926
927 if (SameTails.empty()) {
928 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
929 continue;
930 }
931
932
933
934
935
937 &MergePotentials.front().getBlock()->getParent()->front();
938 unsigned commonTailIndex = SameTails.size();
939
940
941 if (SameTails.size() == 2 &&
942 SameTails[0].getBlock()->isLayoutSuccessor(SameTails[1].getBlock()) &&
943 SameTails[1].tailIsWholeBlock() && !SameTails[1].getBlock()->isEHPad())
944 commonTailIndex = 1;
945 else if (SameTails.size() == 2 &&
946 SameTails[1].getBlock()->isLayoutSuccessor(
947 SameTails[0].getBlock()) &&
948 SameTails[0].tailIsWholeBlock() &&
949 !SameTails[0].getBlock()->isEHPad())
950 commonTailIndex = 0;
951 else {
952
953
954 for (unsigned i = 0, e = SameTails.size(); i != e; ++i) {
957 SameTails[i].tailIsWholeBlock())
958 continue;
959 if (MBB == PredBB) {
960 commonTailIndex = i;
961 break;
962 }
963 if (SameTails[i].tailIsWholeBlock())
964 commonTailIndex = i;
965 }
966 }
967
968 if (commonTailIndex == SameTails.size() ||
969 (SameTails[commonTailIndex].getBlock() == PredBB &&
970 !SameTails[commonTailIndex].tailIsWholeBlock())) {
971
972
973 if (!CreateCommonTailOnlyBlock(PredBB, SuccBB,
974 maxCommonTailLength, commonTailIndex)) {
975 RemoveBlocksWithHash(CurHash, SuccBB, PredBB, BranchDL);
976 continue;
977 }
978 }
979
981
982
983 setCommonTailEdgeWeights(*MBB);
984
985
986
987 mergeCommonTails(commonTailIndex);
988
989
990
992 << " for ");
993 for (unsigned int i=0, e = SameTails.size(); i != e; ++i) {
994 if (commonTailIndex == i)
995 continue;
997 << (i == e - 1 ? "" : ", "));
998
999 replaceTailWithBranchTo(SameTails[i].getTailStartPos(), *MBB);
1000
1001 MergePotentials.erase(SameTails[i].getMPIter());
1002 }
1004
1005
1006 MadeChange = true;
1007 }
1008 return MadeChange;
1009}
1010
1011bool BranchFolder::TailMergeBlocks(MachineFunction &MF) {
1012 bool MadeChange = false;
1013 if (!EnableTailMerge)
1014 return MadeChange;
1015
1016
1017
1018 MergePotentials.clear();
1021 break;
1023 MergePotentials.push_back(MergePotentialsElt(HashEndOfMBB(MBB), &MBB,
1025 }
1026
1027
1028
1030 for (const MergePotentialsElt &Elt : MergePotentials)
1031 TriedMerging.insert(Elt.getBlock());
1032
1033
1034 if (MergePotentials.size() >= 2)
1035 MadeChange |= TryTailMergeBlocks(nullptr, nullptr, MinCommonTailLength);
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1058 if (I->pred_size() < 2) continue;
1062 MergePotentials.clear();
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075 if (AfterBlockPlacement && MLI) {
1077 if (ML && IBB == ML->getHeader())
1078 continue;
1079 }
1080
1083 break;
1084
1085 if (TriedMerging.count(PBB))
1086 continue;
1087
1088
1089 if (PBB == IBB)
1090 continue;
1091
1092
1093 if (!UniquePreds.insert(PBB).second)
1094 continue;
1095
1096
1097
1098 if (PBB->hasEHPadSuccessor() || PBB->mayHaveInlineAsmBr())
1099 continue;
1100
1101
1102
1103
1104 if (AfterBlockPlacement && MLI)
1106 continue;
1107
1111
1112
1114 if (.empty() && TBB == IBB) {
1116 continue;
1117
1118 if (!FBB) {
1119 auto Next = ++PBB->getIterator();
1120 if (Next != MF.end())
1121 FBB = &*Next;
1122 }
1123 }
1124
1125
1126 DebugLoc dl = PBB->findBranchDebugLoc();
1127 if (TBB && (Cond.empty() || FBB)) {
1129 if (.empty())
1130
1132 NewCond, dl);
1133 }
1134
1135 MergePotentials.push_back(
1136 MergePotentialsElt(HashEndOfMBB(*PBB), PBB, dl));
1137 }
1138 }
1139
1140
1141
1143 for (MergePotentialsElt &Elt : MergePotentials)
1144 TriedMerging.insert(Elt.getBlock());
1145
1146 if (MergePotentials.size() >= 2)
1147 MadeChange |= TryTailMergeBlocks(IBB, PredBB, MinCommonTailLength);
1148
1149
1150
1151 PredBB = &*std::prev(I);
1152 if (MergePotentials.size() == 1 &&
1153 MergePotentials.begin()->getBlock() != PredBB)
1154 FixTail(MergePotentials.begin()->getBlock(), IBB, TII,
1155 MergePotentials.begin()->getBranchDebugLoc());
1156 }
1157
1158 return MadeChange;
1159}
1160
1161void BranchFolder::setCommonTailEdgeWeights(MachineBasicBlock &TailMBB) {
1164
1165
1166
1167
1168 for (const auto &Src : SameTails) {
1171 AccumulatedMBBFreq += BlockFreq;
1172
1173
1174
1176 continue;
1177
1178 auto EdgeFreq = EdgeFreqLs.begin();
1179
1181 SuccI != SuccE; ++SuccI, ++EdgeFreq)
1183 }
1184
1185 MBBFreqInfo.setBlockFreq(&TailMBB, AccumulatedMBBFreq);
1186
1188 return;
1189
1190 auto SumEdgeFreq =
1191 std::accumulate(EdgeFreqLs.begin(), EdgeFreqLs.end(), BlockFrequency(0))
1192 .getFrequency();
1193 auto EdgeFreq = EdgeFreqLs.begin();
1194
1195 if (SumEdgeFreq > 0) {
1197 SuccI != SuccE; ++SuccI, ++EdgeFreq) {
1199 EdgeFreq->getFrequency(), SumEdgeFreq);
1201 }
1202 }
1203}
1204
1205
1206
1207
1208
1209bool BranchFolder::OptimizeBranches(MachineFunction &MF) {
1210 bool MadeChange = false;
1211
1212
1214
1216
1219 MadeChange |= OptimizeBlock(&MBB);
1220
1221
1223 RemoveDeadBlock(&MBB);
1224 MadeChange = true;
1225 ++NumDeadBlocks;
1226 }
1227 }
1228
1229 return MadeChange;
1230}
1231
1232
1233
1236}
1237
1238
1239
1243 return I->isBranch();
1244}
1245
1246
1247
1248
1249
1252 assert(MBB1 && MBB2 && "Unknown MachineBasicBlock");
1253
1254
1255
1256
1257
1260 if (MBB1I == MBB1->end() || MBB2I == MBB2->end())
1261 return false;
1262
1263
1264
1265 if (MBB1->isSuccessor(MBB2)) return true;
1266 if (MBB2->isSuccessor(MBB1)) return false;
1267
1268 return MBB2I->isCall() && !MBB1I->isCall();
1269}
1270
1271
1272
1275 if (I != MBB.end() && I->isBranch())
1276 return I->getDebugLoc();
1278}
1279
1285 if (MI.isDebugInstr()) {
1286 TII->duplicate(PredMBB, InsertBefore, MI);
1287 LLVM_DEBUG(dbgs() << "Copied debug entity from empty block to pred: "
1288 << MI);
1289 }
1290}
1291
1297 if (MI.isDebugInstr()) {
1298 TII->duplicate(SuccMBB, InsertBefore, MI);
1299 LLVM_DEBUG(dbgs() << "Copied debug entity from empty block to succ: "
1300 << MI);
1301 }
1302}
1303
1304
1305
1306
1307
1308
1309
1310
1314
1315
1319
1320
1321
1325}
1326
1328 bool MadeChange = false;
1330ReoptimizeBlock:
1331
1333 ++FallThrough;
1334
1335
1336 bool SameEHScope = true;
1337 if (!EHScopeMembership.empty() && FallThrough != MF.end()) {
1338 auto MBBEHScope = EHScopeMembership.find(MBB);
1339 assert(MBBEHScope != EHScopeMembership.end());
1340 auto FallThroughEHScope = EHScopeMembership.find(&*FallThrough);
1341 assert(FallThroughEHScope != EHScopeMembership.end());
1342 SameEHScope = MBBEHScope->second == FallThroughEHScope->second;
1343 }
1344
1345
1346
1349 bool CurUnAnalyzable =
1351
1352
1353
1354
1355
1357 SameEHScope) {
1359
1361
1362 if (FallThrough == MF.end()) {
1363
1364 } else if (FallThrough->isEHPad()) {
1365
1366
1367
1368
1370
1371
1375 }
1376
1377
1378
1380 if (*SI != &*FallThrough && !FallThrough->isSuccessor(*SI)) {
1381 assert((*SI)->isEHPad() && "Bad CFG");
1382 FallThrough->copySuccessor(MBB, SI);
1383 }
1384
1385
1387 MJTI->ReplaceMBBInJumpTables(MBB, &*FallThrough);
1388 MadeChange = true;
1389 }
1390 return MadeChange;
1391 }
1392
1393
1394
1396
1399 bool PriorUnAnalyzable =
1400 TII->analyzeBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, true);
1401 if (!PriorUnAnalyzable) {
1402
1403
1404
1405 if (PriorTBB && PriorTBB == PriorFBB) {
1408 PriorCond.clear();
1409 if (PriorTBB != MBB)
1410 TII->insertBranch(PrevBB, PriorTBB, nullptr, PriorCond, dl);
1411 MadeChange = true;
1412 ++NumBranchOpts;
1413 goto ReoptimizeBlock;
1414 }
1415
1416
1417
1418
1419
1420
1421
1422
1426 LLVM_DEBUG(dbgs() << "\nMerging into block: " << PrevBB
1427 << "From MBB: " << *MBB);
1428
1429 if (!PrevBB.empty()) {
1431 --PrevBBIter;
1433
1434
1435 while (PrevBBIter != PrevBB.begin() && MBBIter != MBB->end()
1436 && PrevBBIter->isDebugInstr() && MBBIter->isDebugInstr()) {
1437 if (!MBBIter->isIdenticalTo(*PrevBBIter))
1438 break;
1440 ++MBBIter; -- PrevBBIter;
1442 }
1443 }
1448 MadeChange = true;
1449 return MadeChange;
1450 }
1451
1452
1453
1454 if (PriorTBB == MBB && !PriorFBB) {
1456 MadeChange = true;
1457 ++NumBranchOpts;
1458 goto ReoptimizeBlock;
1459 }
1460
1461
1462
1463 if (PriorFBB == MBB) {
1466 TII->insertBranch(PrevBB, PriorTBB, nullptr, PriorCond, dl);
1467 MadeChange = true;
1468 ++NumBranchOpts;
1469 goto ReoptimizeBlock;
1470 }
1471
1472
1473
1474
1475 if (PriorTBB == MBB) {
1480 TII->insertBranch(PrevBB, PriorFBB, nullptr, NewPriorCond, dl);
1481 MadeChange = true;
1482 ++NumBranchOpts;
1483 goto ReoptimizeBlock;
1484 }
1485 }
1486
1487
1488
1489
1490
1491
1492
1493
1494
1498 bool DoTransform = true;
1499
1500
1501
1502
1503
1504
1505 if (FallThrough == --MF.end() &&
1507 DoTransform = false;
1508
1509 if (DoTransform) {
1510
1514 << "To make fallthrough to: " << *PriorTBB << "\n");
1515
1518 TII->insertBranch(PrevBB, MBB, nullptr, NewPriorCond, dl);
1519
1520
1522 MadeChange = true;
1523 ++NumBranchOpts;
1524 return MadeChange;
1525 }
1526 }
1527 }
1528 }
1529
1537 bool PredAnalyzable =
1538 !TII->analyzeBranch(*Pred, PredTBB, PredFBB, PredCond, true);
1539
1540
1541 if (PredAnalyzable && !PredCond.empty() && PredTBB == MBB &&
1542 PredTBB != PredFBB) {
1543
1544
1545
1547
1548
1549
1552 }
1553 }
1554
1555
1556
1557
1558
1559 }
1560 if (!PredsChanged.empty()) {
1561 NumTailCalls += PredsChanged.size();
1562 for (auto &Pred : PredsChanged)
1564
1565 return true;
1566 }
1567 }
1568 }
1569
1570 if (!CurUnAnalyzable) {
1571
1572
1573
1574
1575
1576 if (CurTBB && CurFBB && CurFBB == MBB && CurTBB != MBB) {
1582 MadeChange = true;
1583 ++NumBranchOpts;
1584 goto ReoptimizeBlock;
1585 }
1586 }
1587
1588
1589
1590 if (CurTBB && CurCond.empty() && !CurFBB &&
1594
1595
1596
1598
1599
1600
1602
1603
1605 }
1606
1607
1608
1609
1610
1612 bool PredHasNoFallThrough = !PrevBB.canFallThrough();
1613 if (PredHasNoFallThrough || !PriorUnAnalyzable ||
1615
1616
1617 if (!PredHasNoFallThrough && PrevBB.isSuccessor(MBB) &&
1618 PriorTBB != MBB && PriorFBB != MBB) {
1619 if (!PriorTBB) {
1620 assert(PriorCond.empty() && !PriorFBB &&
1621 "Bad branch analysis");
1622 PriorTBB = MBB;
1623 } else {
1624 assert(!PriorFBB && "Machine CFG out of date!");
1625 PriorFBB = MBB;
1626 }
1629 TII->insertBranch(PrevBB, PriorTBB, PriorFBB, PriorCond, pdl);
1630 }
1631
1632
1633 size_t PI = 0;
1634 bool DidChange = false;
1635 bool HasBranchToSelf = false;
1638 if (PMBB == MBB) {
1639
1640 ++PI;
1641 HasBranchToSelf = true;
1642 } else {
1643 DidChange = true;
1645
1646
1647
1649 ++SI)
1650 if (*SI != CurTBB && !CurTBB->isSuccessor(*SI)) {
1651 assert((*SI)->isEHPad() && "Bad CFG");
1653 }
1654
1655
1656
1660 *PMBB, NewCurTBB, NewCurFBB, NewCurCond, true);
1661 if (!NewCurUnAnalyzable && NewCurTBB && NewCurTBB == NewCurFBB) {
1664 NewCurCond.clear();
1665 TII->insertBranch(*PMBB, NewCurTBB, nullptr, NewCurCond, pdl);
1666 MadeChange = true;
1667 ++NumBranchOpts;
1668 }
1669 }
1670 }
1671
1672
1674 MJTI->ReplaceMBBInJumpTables(MBB, CurTBB);
1675 if (DidChange) {
1676 ++NumBranchOpts;
1677 MadeChange = true;
1678 if (!HasBranchToSelf) return MadeChange;
1679 }
1680 }
1681 }
1682
1683
1685 }
1686 }
1687
1688
1689
1690
1692
1693
1695
1697
1698
1699
1701
1705 !TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true) &&
1706 (PredTBB == MBB || PredFBB == MBB) &&
1707 (!CurFallsThru || !CurTBB || !CurFBB) &&
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719 if (CurFallsThru) {
1721 CurCond.clear();
1723 }
1725 MadeChange = true;
1726 goto ReoptimizeBlock;
1727 }
1728 }
1729 }
1730
1731 if (!CurFallsThru) {
1732
1733
1734 if (!CurUnAnalyzable) {
1736 if (!SuccBB)
1737 continue;
1738
1740
1741
1742
1743
1744 if (SuccBB != MBB && &*SuccPrev != MBB &&
1745 !SuccPrev->canFallThrough()) {
1747 MadeChange = true;
1748 goto ReoptimizeBlock;
1749 }
1750 }
1751 }
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1769 if (FallThrough != MF.end() &&
1770 !FallThrough->isEHPad() &&
1771 !TII->analyzeBranch(PrevBB, PrevTBB, PrevFBB, PrevCond, true) &&
1774 MadeChange = true;
1775 return MadeChange;
1776 }
1777 }
1778 }
1779
1780 return MadeChange;
1781}
1782
1783
1784
1785
1786
1787bool BranchFolder::HoistCommonCode(MachineFunction &MF) {
1788 bool MadeChange = false;
1790 MadeChange |= HoistCommonCodeInSuccs(&MBB);
1791
1792 return MadeChange;
1793}
1794
1795
1796
1800 if (SuccBB != TrueBB)
1801 return SuccBB;
1802 return nullptr;
1803}
1804
1805template
1807 Container &Set) {
1808 if (Reg.isPhysical()) {
1810 Set.insert(*AI);
1811 } else {
1812 Set.insert(Reg);
1813 }
1814}
1815
1816
1817
1818
1819
1820
1821
1822
1823static
1830 if (->isUnpredicatedTerminator(*Loc))
1832
1834 if (!MO.isReg())
1835 continue;
1837 if (!Reg)
1838 continue;
1839 if (MO.isUse()) {
1841 } else {
1842 if (!MO.isDead())
1843
1844
1846
1847
1848
1850 }
1851 }
1852
1853 if (Uses.empty())
1854 return Loc;
1855
1856
1857
1858
1860 return Loc;
1861
1862
1863
1865
1866 bool IsDef = false;
1868
1869 if (MO.isRegMask())
1870 return Loc;
1871 if (!MO.isReg() || MO.isUse())
1872 continue;
1874 if (!Reg)
1875 continue;
1876 if (Uses.count(Reg)) {
1877 IsDef = true;
1878 break;
1879 }
1880 }
1881 if (!IsDef)
1882
1883
1884 return Loc;
1885
1886
1887
1888
1889
1890
1891
1892 bool DontMoveAcrossStore = true;
1893 if (!PI->isSafeToMove(DontMoveAcrossStore) || TII->isPredicated(*PI))
1895
1896
1897
1899 if (!MO.isReg())
1900 continue;
1902 if (!Reg)
1903 continue;
1904 if (MO.isUse()) {
1906 } else {
1907 if (Uses.erase(Reg)) {
1908 if (Reg.isPhysical()) {
1911 }
1912 }
1914 }
1915 }
1916
1917 return PI;
1918}
1919
1924 return false;
1925
1927 if (!FBB)
1928
1929 return false;
1930
1931
1932
1933 if (TBB->pred_size() > 1 || FBB->pred_size() > 1)
1934 return false;
1935
1936
1937
1938
1943 return false;
1944
1945 bool HasDups = false;
1951 while (TIB != TIE && FIB != FIE) {
1952
1955 if (TIB == TIE || FIB == FIE)
1956 break;
1957
1959 break;
1960
1962
1963 break;
1964
1965 bool IsSafe = true;
1967
1968 if (MO.isRegMask()) {
1969 IsSafe = false;
1970 break;
1971 }
1972 if (!MO.isReg())
1973 continue;
1975 if (!Reg)
1976 continue;
1977 if (MO.isDef()) {
1978 if (Uses.count(Reg)) {
1979
1980
1981 IsSafe = false;
1982 break;
1983 }
1984
1985 if (Defs.count(Reg) && !MO.isDead()) {
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997 IsSafe = false;
1998 break;
1999 }
2000 } else if (!ActiveDefsSet.count(Reg)) {
2001 if (Defs.count(Reg)) {
2002
2003 IsSafe = false;
2004 break;
2005 }
2006
2007 if (MO.isKill() && Uses.count(Reg))
2008
2009
2010 MO.setIsKill(false);
2011 }
2012 }
2013 if (!IsSafe)
2014 break;
2015
2016 bool DontMoveAcrossStore = true;
2017 if (!TIB->isSafeToMove(DontMoveAcrossStore))
2018 break;
2019
2020
2022 if (!MO.isKill())
2023 continue;
2025 if (!Reg)
2026 continue;
2027 if (!AllDefsSet.count(Reg)) {
2028 continue;
2029 }
2030 if (Reg.isPhysical()) {
2032 ActiveDefsSet.erase(*AI);
2033 } else {
2034 ActiveDefsSet.erase(Reg);
2035 }
2036 }
2037
2038
2040 if (MO.isDead())
2041 continue;
2043 if (!Reg || Reg.isVirtual())
2044 continue;
2047 }
2048
2049 HasDups = true;
2050 ++TIB;
2051 ++FIB;
2052 }
2053
2054 if (!HasDups)
2055 return false;
2056
2058 FBB->erase(FBB->begin(), FIB);
2059
2060 if (UpdateLiveIns)
2062
2063 ++NumHoist;
2064 return true;
2065}
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file implements the BitVector class.
static unsigned EstimateRuntime(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
EstimateRuntime - Make a rough estimate for how long it will take to run the specified code.
static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2)
Given two machine basic blocks, return the number of instructions they actually have in common togeth...
static MachineBasicBlock * findFalseBlock(MachineBasicBlock *BB, MachineBasicBlock *TrueBB)
findFalseBlock - BB has a fallthrough.
static void copyDebugInfoToPredecessor(const TargetInstrInfo *TII, MachineBasicBlock &MBB, MachineBasicBlock &PredMBB)
static unsigned HashMachineInstr(const MachineInstr &MI)
HashMachineInstr - Compute a hash value for MI and its operands.
static bool countsAsInstruction(const MachineInstr &MI)
Whether MI should be counted as an instruction when calculating common tail.
static unsigned CountTerminators(MachineBasicBlock *MBB, MachineBasicBlock::iterator &I)
CountTerminators - Count the number of terminators in the given block and set I to the position of th...
static bool blockEndsInUnreachable(const MachineBasicBlock *MBB)
A no successor, non-return block probably ends in unreachable and is cold.
static void salvageDebugInfoFromEmptyBlock(const TargetInstrInfo *TII, MachineBasicBlock &MBB)
static MachineBasicBlock::iterator skipBackwardPastNonInstructions(MachineBasicBlock::iterator I, MachineBasicBlock *MBB)
Iterate backwards from the given iterator I, towards the beginning of the block.
static cl::opt< unsigned > TailMergeThreshold("tail-merge-threshold", cl::desc("Max number of predecessors to consider tail merging"), cl::init(150), cl::Hidden)
static void addRegAndItsAliases(Register Reg, const TargetRegisterInfo *TRI, Container &Set)
static cl::opt< cl::boolOrDefault > FlagEnableTailMerge("enable-tail-merge", cl::init(cl::BOU_UNSET), cl::Hidden)
static cl::opt< unsigned > TailMergeSize("tail-merge-size", cl::desc("Min number of instructions to consider tail merging"), cl::init(3), cl::Hidden)
static bool IsEmptyBlock(MachineBasicBlock *MBB)
static bool ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2, unsigned MinCommonTailLength, unsigned &CommonTailLen, MachineBasicBlock::iterator &I1, MachineBasicBlock::iterator &I2, MachineBasicBlock *SuccBB, MachineBasicBlock *PredBB, DenseMap< const MachineBasicBlock *, int > &EHScopeMembership, bool AfterPlacement, MBFIWrapper &MBBFreqInfo, ProfileSummaryInfo *PSI)
ProfitableToMerge - Check if two machine basic blocks have a common tail and decide if it would be pr...
static void copyDebugInfoToSuccessor(const TargetInstrInfo *TII, MachineBasicBlock &MBB, MachineBasicBlock &SuccMBB)
static bool IsBranchOnlyBlock(MachineBasicBlock *MBB)
static void FixTail(MachineBasicBlock *CurMBB, MachineBasicBlock *SuccBB, const TargetInstrInfo *TII, const DebugLoc &BranchDL)
static bool IsBetterFallthrough(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2)
IsBetterFallthrough - Return true if it would be clearly better to fall-through to MBB1 than to fall ...
static unsigned HashEndOfMBB(const MachineBasicBlock &MBB)
HashEndOfMBB - Hash the last instruction in the MBB.
static void mergeOperations(MachineBasicBlock::iterator MBBIStartPos, MachineBasicBlock &MBBCommon)
static MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, SmallSet< Register, 4 > &Uses, SmallSet< Register, 4 > &Defs)
findHoistingInsertPosAndDeps - Find the location to move common instructions in successors to.
static DebugLoc getBranchDebugLoc(MachineBasicBlock &MBB)
getBranchDebugLoc - Find and return, if any, the DebugLoc of the branch instructions on the block.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
A common definition of LaneBitmask for use in TableGen and CodeGen.
unsigned const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
Remove Loads Into Fake Uses
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Target-Independent Code Generator Pass Configuration Options pass.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
LLVM Basic Block Representation.
bool test(unsigned Idx) const
size_type size() const
size - Returns the number of bits in this bitvector.
bool OptimizeFunction(MachineFunction &MF, const TargetInstrInfo *tii, const TargetRegisterInfo *tri, MachineLoopInfo *mli=nullptr, bool AfterPlacement=false)
Perhaps branch folding, tail merging and other CFG optimizations on the given function.
BranchFolder(bool DefaultEnableTailMerge, bool CommonHoist, MBFIWrapper &FreqInfo, const MachineBranchProbabilityInfo &ProbInfo, ProfileSummaryInfo *PSI, unsigned MinTailLength=0)
static BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
static DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
This class represents an Operation in the Expression.
iterator find(const_arg_type_t< KeyT > Val)
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Remove the branching code at the end of the specific MBB.
bool isPredicated(const MachineInstr &MI) const override
Returns true if the instruction is already predicated.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
Reverses the branch condition of the specified condition list, returning false on success and true if...
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
Insert branch code into the end of the specified MachineBasicBlock.
A set of physical registers with utility functions to track liveness when walking backward/forward th...
void clear()
Clears the set.
bool available(const MachineRegisterInfo &MRI, MCPhysReg Reg) const
Returns true if register Reg and no aliasing register is in the set.
void stepBackward(const MachineInstr &MI)
Simulates liveness when stepping backwards over an instruction(bundle).
void init(const TargetRegisterInfo &TRI)
(re-)initializes and clears the set.
void addLiveOuts(const MachineBasicBlock &MBB)
Adds all live-out registers of basic block MBB.
void removeBlock(BlockT *BB)
This method completely removes BB from all data structures, including all of the Loop objects it is n...
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
void setBlockFreq(const MachineBasicBlock *MBB, BlockFrequency F)
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
MCRegAliasIterator enumerates all registers aliasing Reg.
iterator_range< MCSuperRegIterator > superregs(MCRegister Reg) const
Return an iterator range over all super-registers of Reg, excluding Reg.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
void moveBefore(MachineBasicBlock *NewAfter)
Move 'this' block before or after the specified block.
void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
iterator_range< livein_iterator > liveins() const
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
succ_iterator succ_begin()
void clearLiveIns()
Clear live in list.
iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
unsigned succ_size() const
bool hasAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
void copySuccessor(const MachineBasicBlock *Orig, succ_iterator I)
Copy a successor (and any probability info) from original block to this block's.
void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
pred_iterator pred_begin()
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New)
Given a machine basic block that branched to 'Old', change the code and CFG so that it branches to 'N...
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
reverse_iterator rbegin()
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
void moveAfter(MachineBasicBlock *NewBefore)
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
virtual MachineFunctionProperties getRequiredProperties() const
Properties which a MachineFunction may have at a given point in time.
MachineFunctionProperties & set(Property P)
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const MachineBasicBlock & back() const
void eraseAdditionalCallInfo(const MachineInstr *MI)
Following functions update call site info.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
void erase(iterator MBBI)
void insert(iterator MBBI, MachineBasicBlock *MBB)
Representation of each machine instruction.
bool isReturn(QueryType Type=AnyInBundle) const
bool isBarrier(QueryType Type=AnyInBundle) const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
bool isIndirectBranch(QueryType Type=AnyInBundle) const
Return true if this is an indirect branch, such as a branch through a register.
void RemoveJumpTable(unsigned Idx)
RemoveJumpTable - Mark the specific index as being dead.
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void setIsUndef(bool Val=true)
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
virtual bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
Reverses the branch condition of the specified condition list, returning false on success and true if...
virtual unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const
Remove the branching code at the end of the specific MBB.
virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
virtual bool canMakeTailCallConditional(SmallVectorImpl< MachineOperand > &Cond, const MachineInstr &TailCall) const
Returns true if the tail call can be made conditional on BranchCond.
virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const
Delete the instruction OldInst and everything after it, replacing it with an unconditional branch to ...
virtual bool isUnconditionalTailCall(const MachineInstr &MI) const
Returns true if MI is an unconditional tail call.
virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const
Insert branch code into the end of the specified MachineBasicBlock.
virtual unsigned getTailMergeSize(const MachineFunction &MF) const
Returns the target-specific default value for tail merging.
virtual bool isPredicated(const MachineInstr &MI) const
Returns true if the instruction is already predicated.
virtual void replaceBranchWithTailCall(MachineBasicBlock &MBB, SmallVectorImpl< MachineOperand > &Cond, const MachineInstr &TailCall) const
Replace the conditional branch in MBB with a conditional tail call.
virtual bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const
Return true if it's legal to split the given basic block at the specified instruction (i....
Target-Independent Code Generator Pass Configuration Options.
bool getEnableTailMerge() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual bool trackLivenessAfterRegAlloc(const MachineFunction &MF) const
Returns true if the live-ins should be tracked after register allocation.
self_iterator getIterator()
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Reg
All possible values of the reg field in the ModR/M byte.
initializer< Ty > init(const Ty &Val)
const_iterator begin(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get begin iterator over path.
const_iterator end(StringRef path LLVM_LIFETIME_BOUND)
Get end iterator over path.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB)
Convenience function combining computeLiveIns() and addLiveIns().
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
void computeLiveIns(LivePhysRegs &LiveRegs, const MachineBasicBlock &MBB)
Computes registers live-in to MBB assuming all of its successors live-in lists are up-to-date.
char & BranchFolderPassID
BranchFolding - This pass performs machine code CFG based optimizations to delete branches to branche...
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
void fullyRecomputeLiveIns(ArrayRef< MachineBasicBlock * > MBBs)
Convenience function for recomputing live-in's for a set of MBBs until the computation converges.
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
DenseMap< const MachineBasicBlock *, int > getEHScopeMembership(const MachineFunction &MF)
static constexpr LaneBitmask getAll()
Pair of physical register and lane mask.