|
@@ -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 @@ namespace {
|
|
|
// will be split.
|
|
|
SetVector<std::pair<MachineBasicBlock*,MachineBasicBlock*> > ToSplit;
|
|
|
|
|
|
+ SparseBitVector<> RegsToClearKillFlags;
|
|
|
+
|
|
|
public:
|
|
|
static char ID; // Pass identification
|
|
|
MachineSinking() : MachineFunctionPass(ID) {
|
|
@@ -287,6 +290,12 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
|
|
|
if (!MadeChange) break;
|
|
|
EverMadeChange = true;
|
|
|
}
|
|
|
+
|
|
|
+ // Now clear any kill flags for recorded registers.
|
|
|
+ for (auto I : RegsToClearKillFlags)
|
|
|
+ MRI->clearKillFlags(I);
|
|
|
+ RegsToClearKillFlags.clear();
|
|
|
+
|
|
|
return EverMadeChange;
|
|
|
}
|
|
|
|
|
@@ -761,7 +770,7 @@ bool MachineSinking::SinkInstruction(MachineInstr *MI, bool &SawStore) {
|
|
|
// used registers.
|
|
|
for (MachineOperand &MO : MI->operands()) {
|
|
|
if (MO.isReg() && MO.isUse())
|
|
|
- MRI->clearKillFlags(MO.getReg());
|
|
|
+ RegsToClearKillFlags.set(MO.getReg()); // Remember to clear kill flags.
|
|
|
}
|
|
|
|
|
|
return true;
|