diff options
author | Djordje Todorovic <djordje.todorovic@rt-rk.com> | 2020-02-27 11:44:53 +0100 |
---|---|---|
committer | Djordje Todorovic <djordje.todorovic@rt-rk.com> | 2020-02-27 13:57:06 +0100 |
commit | 016d91ccbd4d434aa90fbfa6fd28e9da1abc9279 (patch) | |
tree | 6f5bd8ac2fe4db9052351fa2dd0f527074a0664d /llvm/lib/CodeGen/MachineFunction.cpp | |
parent | fa9439fac84ea4eb4050aa1ae150c0ec2cf86c20 (diff) | |
download | llvm-016d91ccbd4d434aa90fbfa6fd28e9da1abc9279.zip llvm-016d91ccbd4d434aa90fbfa6fd28e9da1abc9279.tar.gz llvm-016d91ccbd4d434aa90fbfa6fd28e9da1abc9279.tar.bz2 |
[CallSiteInfo] Handle bundles when updating call site info
This will address the issue: P8198 and P8199 (from D73534).
The methods was not handle bundles properly.
Differential Revision: https://reviews.llvm.org/D74904
Diffstat (limited to 'llvm/lib/CodeGen/MachineFunction.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineFunction.cpp | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index 06b5ab5..25a5f0a 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -393,7 +393,7 @@ MachineFunction::DeleteMachineInstr(MachineInstr *MI) { // be triggered during the implementation of support for the // call site info of a new architecture. If the assertion is triggered, // back trace will tell where to insert a call to updateCallSiteInfo(). - assert((!MI->isCall(MachineInstr::IgnoreBundle) || + assert((!MI->isCandidateForCallSiteEntry() || CallSitesInfo.find(MI) == CallSitesInfo.end()) && "Call site info was not updated!"); // Strip it for parts. The operand array and the MI object itself are @@ -871,27 +871,26 @@ MachineFunction::getCallSiteInfo(const MachineInstr *MI) { return CallSitesInfo.find(MI); } -void MachineFunction::moveCallSiteInfo(const MachineInstr *Old, - const MachineInstr *New) { - assert(Old->isCandidateForCallSiteEntry() && - "Call site info refers only to call (MI) candidates"); - - if (!New->isCandidateForCallSiteEntry()) - return eraseCallSiteInfo(Old); +/// Return the call machine instruction or find a call within bundle. +static const MachineInstr *getCallInstr(const MachineInstr *MI) { + if (!MI->isBundle()) + return MI; - CallSiteInfoMap::iterator CSIt = getCallSiteInfo(Old); - if (CSIt == CallSitesInfo.end()) - return; + for (auto &BMI : make_range(getBundleStart(MI->getIterator()), + getBundleEnd(MI->getIterator()))) + if (BMI.isCandidateForCallSiteEntry()) + return &BMI; - CallSiteInfo CSInfo = std::move(CSIt->second); - CallSitesInfo.erase(CSIt); - CallSitesInfo[New] = CSInfo; + llvm_unreachable("Unexpected bundle without a call site candidate"); } void MachineFunction::eraseCallSiteInfo(const MachineInstr *MI) { - assert(MI->isCandidateForCallSiteEntry() && - "Call site info refers only to call (MI) candidates"); - CallSiteInfoMap::iterator CSIt = getCallSiteInfo(MI); + assert(MI->shouldUpdateCallSiteInfo() && + "Call site info refers only to call (MI) candidates or " + "candidates inside bundles"); + + const MachineInstr *CallMI = getCallInstr(MI); + CallSiteInfoMap::iterator CSIt = getCallSiteInfo(CallMI); if (CSIt == CallSitesInfo.end()) return; CallSitesInfo.erase(CSIt); @@ -899,13 +898,15 @@ void MachineFunction::eraseCallSiteInfo(const MachineInstr *MI) { void MachineFunction::copyCallSiteInfo(const MachineInstr *Old, const MachineInstr *New) { - assert(Old->isCandidateForCallSiteEntry() && - "Call site info refers only to call (MI) candidates"); + assert(Old->shouldUpdateCallSiteInfo() && + "Call site info refers only to call (MI) candidates or " + "candidates inside bundles"); if (!New->isCandidateForCallSiteEntry()) return eraseCallSiteInfo(Old); - CallSiteInfoMap::iterator CSIt = getCallSiteInfo(Old); + const MachineInstr *OldCallMI = getCallInstr(Old); + CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI); if (CSIt == CallSitesInfo.end()) return; @@ -913,6 +914,25 @@ void MachineFunction::copyCallSiteInfo(const MachineInstr *Old, CallSitesInfo[New] = CSInfo; } +void MachineFunction::moveCallSiteInfo(const MachineInstr *Old, + const MachineInstr *New) { + assert(Old->shouldUpdateCallSiteInfo() && + "Call site info refers only to call (MI) candidates or " + "candidates inside bundles"); + + if (!New->isCandidateForCallSiteEntry()) + return eraseCallSiteInfo(Old); + + const MachineInstr *OldCallMI = getCallInstr(Old); + CallSiteInfoMap::iterator CSIt = getCallSiteInfo(OldCallMI); + if (CSIt == CallSitesInfo.end()) + return; + + CallSiteInfo CSInfo = std::move(CSIt->second); + CallSitesInfo.erase(CSIt); + CallSitesInfo[New] = CSInfo; +} + /// \} //===----------------------------------------------------------------------===// |