diff --git a/bolt/include/bolt/Core/BinaryFunction.h b/bolt/include/bolt/Core/BinaryFunction.h --- a/bolt/include/bolt/Core/BinaryFunction.h +++ b/bolt/include/bolt/Core/BinaryFunction.h @@ -1831,6 +1831,11 @@ return ParentFragments.count(Parent); } + /// Return the child fragment form parent function + SmallPtrSet getFragments() { + return Fragments; + } + /// Set the profile data for the number of times the function was called. BinaryFunction &setExecutionCount(uint64_t Count) { ExecutionCount = Count; diff --git a/bolt/lib/Passes/RegReAssign.cpp b/bolt/lib/Passes/RegReAssign.cpp --- a/bolt/lib/Passes/RegReAssign.cpp +++ b/bolt/lib/Passes/RegReAssign.cpp @@ -308,6 +308,10 @@ << " with " << BC.MRI->getName(ExtReg) << "\n\n"); swap(Function, ClassicReg, ExtReg); FuncsChanged.insert(&Function); + for (BinaryFunction *childF : Function.getFragments()) { + swap(*childF, RBX, Candidate); + FuncsChanged.insert(childF); + } ++Begin; if (Begin == End) break; @@ -349,6 +353,10 @@ (void)BC; swap(Function, RBX, Candidate); FuncsChanged.insert(&Function); + for (BinaryFunction *childF : Function.getFragments()) { + swap(*childF, RBX, Candidate); + FuncsChanged.insert(childF); + } return true; } @@ -408,7 +416,7 @@ for (auto &I : BC.getBinaryFunctions()) { BinaryFunction &Function = I.second; - if (!Function.isSimple() || Function.isIgnored()) + if (!Function.isSimple() || Function.isIgnored() || Function.isFragment()) continue; LLVM_DEBUG(dbgs() << "====================================\n");