diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64InstrInfo.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index 176514dd361..219dd4ddf5a 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -5128,12 +5128,12 @@ AArch64InstrInfo::findRegisterToSaveLRTo(const outliner::Candidate &C) const { outliner::OutlinedFunction AArch64InstrInfo::getOutliningCandidateInfo( std::vector<outliner::Candidate> &RepeatedSequenceLocs) const { - unsigned SequenceSize = std::accumulate( - RepeatedSequenceLocs[0].front(), - std::next(RepeatedSequenceLocs[0].back()), - 0, [this](unsigned Sum, const MachineInstr &MI) { - return Sum + getInstSizeInBytes(MI); - }); + outliner::Candidate &FirstCand = RepeatedSequenceLocs[0]; + unsigned SequenceSize = + std::accumulate(FirstCand.front(), std::next(FirstCand.back()), 0, + [this](unsigned Sum, const MachineInstr &MI) { + return Sum + getInstSizeInBytes(MI); + }); // Compute liveness information for each candidate. const TargetRegisterInfo &TRI = getRegisterInfo(); @@ -5240,21 +5240,25 @@ AArch64InstrInfo::getOutliningCandidateInfo( } } - // Check if the range contains a call. These require a save + restore of the - // link register. - if (std::any_of(RepeatedSequenceLocs[0].front(), - RepeatedSequenceLocs[0].back(), - [](const MachineInstr &MI) { return MI.isCall(); })) - NumBytesToCreateFrame += 8; // Save + restore the link register. - - // Handle the last instruction separately. If this is a tail call, then the - // last instruction is a call. We don't want to save + restore in this case. - // However, it could be possible that the last instruction is a call without - // it being valid to tail call this sequence. We should consider this as well. - else if (FrameID != MachineOutlinerThunk && - FrameID != MachineOutlinerTailCall && - RepeatedSequenceLocs[0].back()->isCall()) - NumBytesToCreateFrame += 8; + // If the MBB containing the first candidate has calls, then it's possible + // that we have calls in the candidate. If there are no calls, then there's + // no way that any candidate could have any calls. + if (FirstCand.Flags & MachineOutlinerMBBFlags::HasCalls) { + // Check if the range contains a call. These require a save + restore of the + // link register. + if (std::any_of(FirstCand.front(), FirstCand.back(), + [](const MachineInstr &MI) { return MI.isCall(); })) + NumBytesToCreateFrame += 8; // Save + restore the link register. + + // Handle the last instruction separately. If this is a tail call, then the + // last instruction is a call. We don't want to save + restore in this case. + // However, it could be possible that the last instruction is a call without + // it being valid to tail call this sequence. We should consider this as + // well. + else if (FrameID != MachineOutlinerThunk && + FrameID != MachineOutlinerTailCall && FirstCand.back()->isCall()) + NumBytesToCreateFrame += 8; + } return outliner::OutlinedFunction(RepeatedSequenceLocs, SequenceSize, NumBytesToCreateFrame, FrameID); |