Re: [Mesa-dev] [PATCH 6/8] nv50/ir: optimize ADD3(d, 0x0, b, c) to ADD(d, b, c)
On 07/01/2016 06:19 AM, Ilia Mirkin wrote: On Thu, Jun 30, 2016 at 6:54 PM, Samuel Pitoisetwrote: On 07/01/2016 12:44 AM, Ilia Mirkin wrote: If moveSources doesn't move modifiers, we have a serious problem. However it looks like it does: void Instruction::setSrc(int s, const ValueRef& ref) { setSrc(s, ref.get()); srcs[s].mod = ref.mod; } which is what moveSources calls. I was not sure about moveSources() because we have two variants and the other one doesn't move the modifiers. On Thu, Jun 30, 2016 at 6:26 PM, Samuel Pitoiset wrote: And ADD3(d, a, 0x0, c) to ADD(d, a, c) as well. Signed-off-by: Samuel Pitoiset --- src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 +++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 1cf1fa3..517f779 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -1032,7 +1032,17 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue , int s) i->src(0).mod = Modifier(0); } break; - + case OP_ADD3: + if (i->usesFlags()) + break; Why? ADD can produce/consume a flag just fine. Well, this is loosely based on OP_ADD which does exactly the same check. Right, because you can't get rid of ADD 0, $c. (There is no MOV $c variant... or we don't support it ... we probably should, I think that's what CSET/CSETP are.) However you can definitely flip the ADD3 into an ADD2 even if the carry flag is being added in. Yeah, makes sense. + if (imm0.isInteger(0)) { + i->op = OP_ADD; + for (int k = s; k < 2; k++) { +i->setSrc(k, i->getSrc(k + 1)); +i->src(k).mod = i->src(k + 1).mod; + } aka i->moveSources(s + 1, -1) ? Yes. + } + break; case OP_DIV: if (s != 1 || (i->dType != TYPE_S32 && i->dType != TYPE_U32)) break; -- 2.8.3 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev -- -Samuel ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 6/8] nv50/ir: optimize ADD3(d, 0x0, b, c) to ADD(d, b, c)
On Thu, Jun 30, 2016 at 6:54 PM, Samuel Pitoisetwrote: > > > On 07/01/2016 12:44 AM, Ilia Mirkin wrote: >> >> If moveSources doesn't move modifiers, we have a serious problem. >> However it looks like it does: >> >> void >> Instruction::setSrc(int s, const ValueRef& ref) >> { >>setSrc(s, ref.get()); >>srcs[s].mod = ref.mod; >> } >> >> which is what moveSources calls. > > > I was not sure about moveSources() because we have two variants and the > other one doesn't move the modifiers. >> >> >> >> On Thu, Jun 30, 2016 at 6:26 PM, Samuel Pitoiset >> wrote: >>> >>> And ADD3(d, a, 0x0, c) to ADD(d, a, c) as well. >>> >>> Signed-off-by: Samuel Pitoiset >>> --- >>> src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 >>> +++- >>> 1 file changed, 11 insertions(+), 1 deletion(-) >>> >>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp >>> b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp >>> index 1cf1fa3..517f779 100644 >>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp >>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp >>> @@ -1032,7 +1032,17 @@ ConstantFolding::opnd(Instruction *i, >>> ImmediateValue , int s) >>> i->src(0).mod = Modifier(0); >>>} >>>break; >>> - >>> + case OP_ADD3: >>> + if (i->usesFlags()) >>> + break; >> >> >> Why? ADD can produce/consume a flag just fine. > > > Well, this is loosely based on OP_ADD which does exactly the same check. Right, because you can't get rid of ADD 0, $c. (There is no MOV $c variant... or we don't support it ... we probably should, I think that's what CSET/CSETP are.) However you can definitely flip the ADD3 into an ADD2 even if the carry flag is being added in. > >> >>> + if (imm0.isInteger(0)) { >>> + i->op = OP_ADD; >>> + for (int k = s; k < 2; k++) { >>> +i->setSrc(k, i->getSrc(k + 1)); >>> +i->src(k).mod = i->src(k + 1).mod; >>> + } >> >> >> aka >> >> i->moveSources(s + 1, -1) ? > > > Yes. > > >> >>> + } >>> + break; >>> case OP_DIV: >>>if (s != 1 || (i->dType != TYPE_S32 && i->dType != TYPE_U32)) >>> break; >>> -- >>> 2.8.3 >>> >>> ___ >>> mesa-dev mailing list >>> mesa-dev@lists.freedesktop.org >>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 6/8] nv50/ir: optimize ADD3(d, 0x0, b, c) to ADD(d, b, c)
On 07/01/2016 12:44 AM, Ilia Mirkin wrote: If moveSources doesn't move modifiers, we have a serious problem. However it looks like it does: void Instruction::setSrc(int s, const ValueRef& ref) { setSrc(s, ref.get()); srcs[s].mod = ref.mod; } which is what moveSources calls. I was not sure about moveSources() because we have two variants and the other one doesn't move the modifiers. On Thu, Jun 30, 2016 at 6:26 PM, Samuel Pitoisetwrote: And ADD3(d, a, 0x0, c) to ADD(d, a, c) as well. Signed-off-by: Samuel Pitoiset --- src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 +++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 1cf1fa3..517f779 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -1032,7 +1032,17 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue , int s) i->src(0).mod = Modifier(0); } break; - + case OP_ADD3: + if (i->usesFlags()) + break; Why? ADD can produce/consume a flag just fine. Well, this is loosely based on OP_ADD which does exactly the same check. + if (imm0.isInteger(0)) { + i->op = OP_ADD; + for (int k = s; k < 2; k++) { +i->setSrc(k, i->getSrc(k + 1)); +i->src(k).mod = i->src(k + 1).mod; + } aka i->moveSources(s + 1, -1) ? Yes. + } + break; case OP_DIV: if (s != 1 || (i->dType != TYPE_S32 && i->dType != TYPE_U32)) break; -- 2.8.3 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 6/8] nv50/ir: optimize ADD3(d, 0x0, b, c) to ADD(d, b, c)
If moveSources doesn't move modifiers, we have a serious problem. However it looks like it does: void Instruction::setSrc(int s, const ValueRef& ref) { setSrc(s, ref.get()); srcs[s].mod = ref.mod; } which is what moveSources calls. On Thu, Jun 30, 2016 at 6:26 PM, Samuel Pitoisetwrote: > And ADD3(d, a, 0x0, c) to ADD(d, a, c) as well. > > Signed-off-by: Samuel Pitoiset > --- > src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 +++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp > b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp > index 1cf1fa3..517f779 100644 > --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp > +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp > @@ -1032,7 +1032,17 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue > , int s) > i->src(0).mod = Modifier(0); >} >break; > - > + case OP_ADD3: > + if (i->usesFlags()) > + break; Why? ADD can produce/consume a flag just fine. > + if (imm0.isInteger(0)) { > + i->op = OP_ADD; > + for (int k = s; k < 2; k++) { > +i->setSrc(k, i->getSrc(k + 1)); > +i->src(k).mod = i->src(k + 1).mod; > + } aka i->moveSources(s + 1, -1) ? > + } > + break; > case OP_DIV: >if (s != 1 || (i->dType != TYPE_S32 && i->dType != TYPE_U32)) > break; > -- > 2.8.3 > > ___ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 6/8] nv50/ir: optimize ADD3(d, 0x0, b, c) to ADD(d, b, c)
And ADD3(d, a, 0x0, c) to ADD(d, a, c) as well. Signed-off-by: Samuel Pitoiset--- src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 +++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 1cf1fa3..517f779 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -1032,7 +1032,17 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue , int s) i->src(0).mod = Modifier(0); } break; - + case OP_ADD3: + if (i->usesFlags()) + break; + if (imm0.isInteger(0)) { + i->op = OP_ADD; + for (int k = s; k < 2; k++) { +i->setSrc(k, i->getSrc(k + 1)); +i->src(k).mod = i->src(k + 1).mod; + } + } + break; case OP_DIV: if (s != 1 || (i->dType != TYPE_S32 && i->dType != TYPE_U32)) break; -- 2.8.3 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev