From: Andrea Di Biagio Date: Fri, 15 Feb 2019 18:05:59 +0000 (+0000) Subject: [MCA][LSUnit] Return the ID of the dependent memory operation from method X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8dbb7788550dda4b19b6889fbb8fea7fad92051d;p=llvm [MCA][LSUnit] Return the ID of the dependent memory operation from method isReady(). NFCI This is yet another change in preparation for a fix for PR37494. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354150 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MCA/HardwareUnits/LSUnit.h b/include/llvm/MCA/HardwareUnits/LSUnit.h index b8a9f2755b0..5ed2b5bc814 100644 --- a/include/llvm/MCA/HardwareUnits/LSUnit.h +++ b/include/llvm/MCA/HardwareUnits/LSUnit.h @@ -187,7 +187,11 @@ public: // 4. A store may not pass a previous load (regardless of flag 'NoAlias'). // 5. A load has to wait until an older load barrier is fully executed. // 6. A store has to wait until an older store barrier is fully executed. - virtual bool isReady(const InstRef &IR) const; + // + // Returns an instruction identifier. If IR is ready, then this method returns + // `IR.getSourceIndex()`. Otherwise it returns the instruction ID of the + // dependent (i.e. conflicting) memory instruction. + virtual unsigned isReady(const InstRef &IR) const; // Load and store instructions are tracked by their corresponding queues from // dispatch until the "instruction executed" event. diff --git a/lib/MCA/HardwareUnits/LSUnit.cpp b/lib/MCA/HardwareUnits/LSUnit.cpp index 2adc20f8255..4f49fbd2bb4 100644 --- a/lib/MCA/HardwareUnits/LSUnit.cpp +++ b/lib/MCA/HardwareUnits/LSUnit.cpp @@ -93,7 +93,7 @@ LSUnit::Status LSUnit::isAvailable(const InstRef &IR) const { return LSUnit::LSU_AVAILABLE; } -bool LSUnit::isReady(const InstRef &IR) const { +unsigned LSUnit::isReady(const InstRef &IR) const { const InstrDesc &Desc = IR.getInstruction()->getDesc(); const unsigned Index = IR.getSourceIndex(); bool IsALoad = Desc.MayLoad; @@ -106,49 +106,52 @@ bool LSUnit::isReady(const InstRef &IR) const { unsigned LoadBarrierIndex = *LoadBarriers.begin(); // A younger load cannot pass a older load barrier. if (Index > LoadBarrierIndex) - return false; + return LoadBarrierIndex; // A load barrier cannot pass a older load. if (Index == LoadBarrierIndex && Index != *LoadQueue.begin()) - return false; + return *LoadQueue.begin(); } if (IsAStore && !StoreBarriers.empty()) { unsigned StoreBarrierIndex = *StoreBarriers.begin(); // A younger store cannot pass a older store barrier. if (Index > StoreBarrierIndex) - return false; + return StoreBarrierIndex; // A store barrier cannot pass a older store. if (Index == StoreBarrierIndex && Index != *StoreQueue.begin()) - return false; + return *StoreQueue.begin(); } // A load may not pass a previous store unless flag 'NoAlias' is set. // A load may pass a previous load. if (NoAlias && IsALoad) - return true; + return Index; if (StoreQueue.size()) { // A load may not pass a previous store. // A store may not pass a previous store. if (Index > *StoreQueue.begin()) - return false; + return *StoreQueue.begin(); } // Okay, we are older than the oldest store in the queue. // If there are no pending loads, then we can say for sure that this // instruction is ready. if (isLQEmpty()) - return true; + return Index; // Check if there are no older loads. if (Index <= *LoadQueue.begin()) - return true; + return Index; // There is at least one younger load. // - // A store may not pass a previous load. // A load may pass a previous load. - return !IsAStore; + if (IsALoad) + return Index; + + // A store may not pass a previous load. + return *LoadQueue.begin(); } void LSUnit::onInstructionExecuted(const InstRef &IR) { diff --git a/lib/MCA/HardwareUnits/Scheduler.cpp b/lib/MCA/HardwareUnits/Scheduler.cpp index a7a6ed9570f..b5f3617b08f 100644 --- a/lib/MCA/HardwareUnits/Scheduler.cpp +++ b/lib/MCA/HardwareUnits/Scheduler.cpp @@ -288,7 +288,8 @@ void Scheduler::dispatch(const InstRef &IR) { bool Scheduler::isReady(const InstRef &IR) const { const InstrDesc &Desc = IR.getInstruction()->getDesc(); bool IsMemOp = Desc.MayLoad || Desc.MayStore; - return IR.getInstruction()->isReady() && (!IsMemOp || LSU.isReady(IR)); + return IR.getInstruction()->isReady() && + (!IsMemOp || LSU.isReady(IR) == IR.getSourceIndex()); } } // namespace mca