]> granicus.if.org Git - llvm/commitdiff
[MCA][LSUnit] Return the ID of the dependent memory operation from method
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Fri, 15 Feb 2019 18:05:59 +0000 (18:05 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Fri, 15 Feb 2019 18:05:59 +0000 (18:05 +0000)
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

include/llvm/MCA/HardwareUnits/LSUnit.h
lib/MCA/HardwareUnits/LSUnit.cpp
lib/MCA/HardwareUnits/Scheduler.cpp

index b8a9f2755b0553fc77c998653345b4c87aa3a97e..5ed2b5bc81416cfd1ebc58494350cceae3777ce2 100644 (file)
@@ -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.
index 2adc20f8255a99c36411c773f19b06ff728ee419..4f49fbd2bb4014dfb4707dd336de0f9668d2fcd4 100644 (file)
@@ -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) {
index a7a6ed9570f4f93ec71b7f133ffa6ace3657a82d..b5f3617b08f238549fd8e0e39afb754c560ffc44 100644 (file)
@@ -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