[PATCH] R600/SI: Fix dependency calculation for DS writes instructions in SIInsertWaits
Matt Arsenault
Matthew.Arsenault at amd.com
Tue Jan 6 08:13:52 PST 2015
On 12/29/2014 03:14 PM, 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(+)
LGTM
> 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) {
>
More information about the llvm-commits
mailing list