[PATCH] R600/SI: Fix dependency calculation for DS writes instructions in SIInsertWaits

Tom Stellard tom at stellard.net
Tue Jan 6 07:59:50 PST 2015


Ping.

On Mon, Dec 29, 2014 at 03:14:11PM -0500, Tom Stellard wrote:
> 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.
> ---
>  lib/Target/R600/SIInsertWaits.cpp | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/lib/Target/R600/SIInsertWaits.cpp b/lib/Target/R600/SIInsertWaits.cpp
> index f279e5e..2e56508 100644
> --- a/lib/Target/R600/SIInsertWaits.cpp
> +++ b/lib/Target/R600/SIInsertWaits.cpp
> @@ -186,6 +186,29 @@ bool SIInsertWaits::isOpRelevant(MachineOperand &Op) {
>    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) {
>  
> -- 
> 1.8.5.5
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list