mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-27 05:32:22 +00:00
Fix nondeterministic output in local stack slot alloc pass
This finds all of the references to a frame index in a function, and sorts by the offset. If multiple instructions use the same offset, nothing was breaking the tie for sorting. This avoids the test failures the reverted r282999 introduced. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285201 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d0147e5c78
commit
f205f3b0f4
@ -51,13 +51,21 @@ namespace {
|
||||
MachineBasicBlock::iterator MI; // Instr referencing the frame
|
||||
int64_t LocalOffset; // Local offset of the frame idx referenced
|
||||
int FrameIdx; // The frame index
|
||||
|
||||
// Order reference instruction appears in program. Used to ensure
|
||||
// deterministic order when multiple instructions may reference the same
|
||||
// location.
|
||||
unsigned Order;
|
||||
|
||||
public:
|
||||
FrameRef(MachineBasicBlock::iterator I, int64_t Offset, int Idx) :
|
||||
MI(I), LocalOffset(Offset), FrameIdx(Idx) {}
|
||||
FrameRef(MachineInstr *I, int64_t Offset, int Idx, unsigned Ord) :
|
||||
MI(I), LocalOffset(Offset), FrameIdx(Idx), Order(Ord) {}
|
||||
|
||||
bool operator<(const FrameRef &RHS) const {
|
||||
return std::tie(LocalOffset, FrameIdx) <
|
||||
std::tie(RHS.LocalOffset, RHS.FrameIdx);
|
||||
return std::tie(LocalOffset, FrameIdx, Order) <
|
||||
std::tie(RHS.LocalOffset, RHS.FrameIdx, RHS.Order);
|
||||
}
|
||||
|
||||
MachineBasicBlock::iterator getMachineInstr() const { return MI; }
|
||||
int64_t getLocalOffset() const { return LocalOffset; }
|
||||
int getFrameIndex() const { return FrameIdx; }
|
||||
@ -78,7 +86,7 @@ namespace {
|
||||
bool insertFrameReferenceRegisters(MachineFunction &Fn);
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
explicit LocalStackSlotPass() : MachineFunctionPass(ID) {
|
||||
explicit LocalStackSlotPass() : MachineFunctionPass(ID) {
|
||||
initializeLocalStackSlotPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
bool runOnMachineFunction(MachineFunction &MF) override;
|
||||
@ -286,6 +294,8 @@ bool LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
|
||||
// choose the first one).
|
||||
SmallVector<FrameRef, 64> FrameReferenceInsns;
|
||||
|
||||
unsigned Order = 0;
|
||||
|
||||
for (MachineBasicBlock &BB : Fn) {
|
||||
for (MachineInstr &MI : BB) {
|
||||
// Debug value, stackmap and patchpoint instructions can't be out of
|
||||
@ -312,7 +322,7 @@ bool LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
|
||||
int64_t LocalOffset = LocalOffsets[Idx];
|
||||
if (!TRI->needsFrameBaseReg(&MI, LocalOffset))
|
||||
break;
|
||||
FrameReferenceInsns.push_back(FrameRef(&MI, LocalOffset, Idx));
|
||||
FrameReferenceInsns.push_back(FrameRef(&MI, LocalOffset, Idx, Order++));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user