From 1a0e6258489358043d5831986fe02e70251a2e0a Mon Sep 17 00:00:00 2001 From: Puyan Lotfi Date: Tue, 11 Jun 2019 00:00:25 +0000 Subject: [PATCH] [MIR-Canon] Fixing non-determinism that was breaking bots (NFC). An earlier fix of a subtle iterator invalidation bug had uncovered a nondeterminism that was present in the MultiUsers bag. Problem was that MultiUsers was being looked up using pointers. This patch is an NFC change that numbers each multiuser and processes each in numbered order. This fixes the test failure on netbsd and will likely fix the green-dragon bot too. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363012 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MIRCanonicalizerPass.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/MIRCanonicalizerPass.cpp b/lib/CodeGen/MIRCanonicalizerPass.cpp index c7d1131d7b8..f49bc854e23 100644 --- a/lib/CodeGen/MIRCanonicalizerPass.cpp +++ b/lib/CodeGen/MIRCanonicalizerPass.cpp @@ -180,6 +180,8 @@ static bool rescheduleCanonically(unsigned &PseudoIdempotentInstCount, } std::map> MultiUsers; + std::map MultiUserLookup; + unsigned UseToBringDefCloserToCount = 0; std::vector PseudoIdempotentInstructions; std::vector PhysRegDefs; for (auto *II : Instructions) { @@ -255,6 +257,7 @@ static bool rescheduleCanonically(unsigned &PseudoIdempotentInstCount, if (Delta < Distance) { Distance = Delta; UseToBringDefCloserTo = UseInst; + MultiUserLookup[UseToBringDefCloserToCount++] = UseToBringDefCloserTo; } } @@ -294,11 +297,11 @@ static bool rescheduleCanonically(unsigned &PseudoIdempotentInstCount, } // Sort the defs for users of multiple defs lexographically. - for (const auto &E : MultiUsers) { + for (const auto &E : MultiUserLookup) { auto UseI = std::find_if(MBB->instr_begin(), MBB->instr_end(), - [&](MachineInstr &MI) -> bool { return &MI == E.first; }); + [&](MachineInstr &MI) -> bool { return &MI == E.second; }); if (UseI == MBB->instr_end()) continue; @@ -306,7 +309,8 @@ static bool rescheduleCanonically(unsigned &PseudoIdempotentInstCount, LLVM_DEBUG( dbgs() << "Rescheduling Multi-Use Instructions Lexographically.";); Changed |= rescheduleLexographically( - E.second, MBB, [&]() -> MachineBasicBlock::iterator { return UseI; }); + MultiUsers[E.second], MBB, + [&]() -> MachineBasicBlock::iterator { return UseI; }); } PseudoIdempotentInstCount = PseudoIdempotentInstructions.size(); -- 2.50.1