R600/SI Patchset: Initial support for compute shaders
Tom Stellard
tom at stellard.net
Tue Mar 12 12:08:10 PDT 2013
On Mon, Mar 11, 2013 at 05:24:36PM +0100, Christian König wrote:
> Am 11.03.2013 14:59, schrieb Tom Stellard:
> >On Mon, Mar 11, 2013 at 10:03:53AM +0100, Christian K?nig wrote:
> >>Am 08.03.2013 22:29, schrieb Tom Stellard:
> >>>Hi,
> >>>
> >>>The attached patches add support for the BUFFER_STORE instruction and
> >>>make it possible to run simple compute shaders on Southern Islands
> >>>hardware with the open source radeonsi GPU driver in
> >>>Mesa (http://www.mesa3d.org).
> >>>
> >>>-Tom
> >>>
> >>>0001-R600-SI-Avoid-generating-S_MOVs-with-64-bit-immediat.patch
> >>>
> >>>
> >>>>From aa3e075e2f0df66e2fe50018704aee28904155f0 Mon Sep 17 00:00:00 2001
> >>>From: Tom Stellard<thomas.stellard at amd.com>
> >>>Date: Wed, 6 Mar 2013 17:28:55 +0000
> >>>Subject: [PATCH 1/5] R600/SI: Avoid generating S_MOVs with 64-bit immediates
> >>>
> >>>SITargetLowering::analyzeImmediate() was converting the 64-bit values
> >>>to 32-bit and then checking if they were an inline immediate. Some
> >>>of these conversions caused this check to succeed and produced
> >>>S_MOV instructions with 64-bit immediates, which are illegal.
> >>>---
> >>> lib/Target/R600/SIISelLowering.cpp | 11 +++++++++--
> >>> test/CodeGen/R600/imm.ll | 34 ++++++++++++++++++++++++++++++++++
> >>> 2 files changed, 43 insertions(+), 2 deletions(-)
> >>> create mode 100644 test/CodeGen/R600/imm.ll
> >>>
> >>>diff --git a/lib/Target/R600/SIISelLowering.cpp b/lib/Target/R600/SIISelLowering.cpp
> >>>index fead115..74b1dc5 100644
> >>>--- a/lib/Target/R600/SIISelLowering.cpp
> >>>+++ b/lib/Target/R600/SIISelLowering.cpp
> >>>@@ -426,9 +426,16 @@ int32_t SITargetLowering::analyzeImmediate(const SDNode *N) const {
> >>> float F;
> >>> } Imm;
> >>>- if (const ConstantSDNode *Node = dyn_cast<ConstantSDNode>(N))
> >>>+ if (const ConstantSDNode *Node = dyn_cast<ConstantSDNode>(N)) {
> >>>+ if (Node->getValueType(0) == MVT::i64) {
> >>>+ int64_t Imm64 = Node->getZExtValue();
> >>>+ if (Imm64 >> 32) {
> >>>+ return -1;
> >>>+ }
> >>>+ Imm.I = Imm64;
> >>>+ }
> >>> Imm.I = Node->getSExtValue();
> >>I wouldn't write it like this, setting Imm.I twice is a bit superfluous.
> >>Also I don't think we should look at the ValueType, maybe something like
> >>this should be more appropriate:
> >>
> >>if (const ConstantSDNode *Node = dyn_cast<ConstantSDNode>(N)) {
> >> int64_t Imm64 = Node->getSExtValue();
> >> if (Imm64 >> 32)
> >> return -1;
> >> Imm.I = Imm64;
> >>} else...
> >>
> >This make sense, but what if this function were used on a 32-bit
> >immediate? Wouldn't if(Imm64 >> 32) be true for all negative integers?
> >If so, then we would miss some opportunities for using inline
> >immediates.
>
> Ups, yeah your right. But checking for i64 type isn't 100% correct
> either, cause the inline immediates are definately sign extended.
>
I just realized that your solution will work fine. We can't use a single
inline immediate for 64-bit values anyway because we need the sign to
extend into the high bits, so any negative 64-bit immediate needs to
be rejected.
-Tom
More information about the llvm-commits
mailing list