[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