Index: lib/CodeGen/MachineSink.cpp =================================================================== --- lib/CodeGen/MachineSink.cpp +++ lib/CodeGen/MachineSink.cpp @@ -19,6 +19,7 @@ #include "llvm/CodeGen/Passes.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/SparseBitVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" @@ -70,6 +71,8 @@ // will be split. SetVector > ToSplit; + SparseBitVector<> RegsToClearKillFlags; + public: static char ID; // Pass identification MachineSinking() : MachineFunctionPass(ID) { @@ -287,6 +290,14 @@ if (!MadeChange) break; EverMadeChange = true; } + + // Now clear any kill flags for recorded registers. + if (EverMadeChange) { + for (auto I : RegsToClearKillFlags) + MRI->clearKillFlags(I); + } + RegsToClearKillFlags.clear(); + return EverMadeChange; } @@ -759,9 +770,11 @@ // Note that we have to clear the kill flags for any register this instruction // uses as we may sink over another instruction which currently kills the // used registers. + // Only record registers now, clear any kill flags later, + // since it's possible that they are no longer correct. for (MachineOperand &MO : MI->operands()) { if (MO.isReg() && MO.isUse()) - MRI->clearKillFlags(MO.getReg()); + RegsToClearKillFlags.set(MO.getReg()); } return true;