[llvm-mca] Ensure that instructions with a schedule read-advance are always issued in the right order.

Normally, the Scheduler prioritizes older instructions over younger instructions
during the instruction issue stage. In one particular case where a dependent
instruction had a schedule read-advance associated to one of the input operands,
this rule was not correctly applied.

This patch fixes the issue and adds a test to verify that we don't regress that
particular case.

llvm-svn: 330032
diff --git a/llvm/tools/llvm-mca/Scheduler.h b/llvm/tools/llvm-mca/Scheduler.h
index f273220..4bc8c23 100644
--- a/llvm/tools/llvm-mca/Scheduler.h
+++ b/llvm/tools/llvm-mca/Scheduler.h
@@ -430,17 +430,16 @@
   // Notify the Backend that buffered resources were freed.
   void notifyReleasedBuffers(llvm::ArrayRef<uint64_t> Buffers);
 
-  /// Issue instructions from the ReadyQueue by giving priority to older
-  /// instructions. This method returns true if at least one instruction has
-  /// been promoted in the process from the WaitQueue to the ReadyQueue.
+  /// Issue the next instruction from the ReadyQueue. This method gives priority
+  /// to older instructions.
   bool issue();
 
-  /// Scans the WaitQueue in search of instructions that can be moved to
-  /// the ReadyQueue.
-  bool promoteToReadyQueue();
+  /// Move instructions from the WaitQueue to the ReadyQueue if input operands
+  /// are all available.
+  void promoteToReadyQueue();
 
   /// Issue an instruction without updating the ready queue.
-  void issueInstruction(Instruction &IS, unsigned InstrIndex);
+  void issueInstruction(unsigned Index, Instruction &IS);
   void updatePendingQueue();
   void updateIssuedQueue();