[Beignet] [PATCH V2] backend: add global immediate optimization
Wang, Rander
rander.wang at intel.com
Tue Jun 13 07:44:53 UTC 2017
Ok, I will refine my patch according to discussing
Thank you!
-----Original Message-----
From: Song, Ruiling
Sent: Tuesday, June 13, 2017 3:21 PM
To: Wang, Rander <rander.wang at intel.com>; beignet at freedesktop.org
Subject: RE: [Beignet] [PATCH V2] backend: add global immediate optimization
> -----Original Message-----
> From: Wang, Rander
> Sent: Tuesday, June 13, 2017 1:24 PM
> To: Song, Ruiling <ruiling.song at intel.com>; beignet at freedesktop.org
> Subject: RE: [Beignet] [PATCH V2] backend: add global immediate
> optimization
>
>
>
> -----Original Message-----
> From: Song, Ruiling
> Sent: Tuesday, June 13, 2017 10:24 AM
> To: Wang, Rander <rander.wang at intel.com>; beignet at freedesktop.org
> Cc: Wang, Rander <rander.wang at intel.com>
> Subject: RE: [Beignet] [PATCH V2] backend: add global immediate
> optimization
>
> > + else if (src0.type == GEN_TYPE_D || src0.type == GEN_TYPE_UD)
> > + {
> > + int s0 = src0.value.d;
> > + if (src0.absolute)
> > + s0 = fabs(s0);
> Here I think it should be abs(s0), right? ===== Yes, typo
>
> > + if (src0.negation)
> > + s0 = -s0;
> > +
> > + int s1 = src1.value.d;
> > + if (src1.absolute)
> > + s1 = fabs(s1);
> Same as above. ====== Yes, typo
>
> > +
> > + if(info->intermedia.type != var.type)
> > + {
> > + bool isOk = false;
> > + assert(info->replacement.file == GEN_IMMEDIATE_VALUE);
> > + if(var.type == GEN_TYPE_D && info->intermedia.type == GEN_TYPE_UD)
> > + {
> > + if(info->replacement.value.ud >= 0x80000000)
> > + return false;
> > + isOk = true;
> > + }
> > +
> > + if(var.type == GEN_TYPE_UD && info->intermedia.type == GEN_TYPE_D)
> > + {
> > + if(info->replacement.value.d < 0)
> > + return false;
> > + isOk = true;
> > + }
> Could you explain a little bit about the above checks for negative number?
> Did you have concern over "var with negative modifier"? or any other reason?
>
> ===== There are some global imm are UD or D. but it is retyped to D
> or UD when used later.
Yes, I understand you are checking against the "retype case". But I think even retype occurs, your optimization still works.
For example:
mov.s32 %1, 0xffff0000
and.u32 %3, %2, %1
Your optimization should still work for such case.
>
> > + SelectionBlock &block = *mblockList->begin();
> > + for(SelectionInstruction &insn : block.insnList)
> > + {
> > + GenRegister src0 = insn.src(0);
> > + if(insn.opcode == SEL_OP_MOV &&
> > + src0.file == GEN_IMMEDIATE_VALUE &&
> > + (src0.type == GEN_TYPE_UD || src0.type == GEN_TYPE_UD
> > + ||
> src0.type
>
> Typo? "(src0.type == GEN_TYPE_UD || src0.type == GEN_TYPE_UD"
> =========== Yes, typo
>
> > == GEN_TYPE_F) &&
> > + insn.state.predicate == GEN_PREDICATE_NONE)
> What's your point here to check GEN_PREDICATE_NONE?
> ====== it is a reserved optimization. It is easy to make mistake with
> predicate
Then how about noMask? Do you need to check noMask == 1?
Both predication and pcip-mask could introduce partial write to a register.
>
> Thanks!
> Ruiling
More information about the Beignet
mailing list