[llvm] r225289 - R600/SI: Fix dependency calculation for DS writes instructions in SIInsertWaits

Tom Stellard thomas.stellard at amd.com
Tue Jan 6 11:52:04 PST 2015


Author: tstellar
Date: Tue Jan  6 13:52:04 2015
New Revision: 225289

URL: http://llvm.org/viewvc/llvm-project?rev=225289&view=rev
Log:
R600/SI: Fix dependency calculation for DS writes instructions in SIInsertWaits

In DS write instructions, the address operand comes before the value
operand(s) which is reversed from every other instruction type.

The SIInsertWait assumed that the first use for each instruction
was the value, so for DS write it was protecting the address
operand with s_waitcnt instructions when it should have been
protecting the value operand.

Modified:
    llvm/trunk/lib/Target/R600/SIInsertWaits.cpp

Modified: llvm/trunk/lib/Target/R600/SIInsertWaits.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SIInsertWaits.cpp?rev=225289&r1=225288&r2=225289&view=diff
==============================================================================
--- llvm/trunk/lib/Target/R600/SIInsertWaits.cpp (original)
+++ llvm/trunk/lib/Target/R600/SIInsertWaits.cpp Tue Jan  6 13:52:04 2015
@@ -186,6 +186,29 @@ bool SIInsertWaits::isOpRelevant(Machine
   if (!MI.getDesc().mayStore())
     return false;
 
+  // Check if this operand is the value being stored.
+  // Special case for DS instructions, since the address
+  // operand comes before the value operand and it may have
+  // multiple data operands.
+
+  if (TII->isDS(MI.getOpcode())) {
+    MachineOperand *Data = TII->getNamedOperand(MI, AMDGPU::OpName::data);
+    if (Data && Op.isIdenticalTo(*Data))
+      return true;
+
+    MachineOperand *Data0 = TII->getNamedOperand(MI, AMDGPU::OpName::data0);
+    if (Data0 && Op.isIdenticalTo(*Data0))
+      return true;
+
+    MachineOperand *Data1 = TII->getNamedOperand(MI, AMDGPU::OpName::data1);
+    if (Data1 && Op.isIdenticalTo(*Data1))
+      return true;
+
+    return false;
+  }
+
+  // NOTE: This assumes that the value operand is before the
+  // address operand, and that there is only one value operand.
   for (MachineInstr::mop_iterator I = MI.operands_begin(),
        E = MI.operands_end(); I != E; ++I) {
 





More information about the llvm-commits mailing list