On Mon, Jul 22, 2024 at 7:41 PM Kewen.Lin <li...@linux.ibm.com> wrote:
>
> Hi Andrew,
>
> on 2024/7/23 08:09, Andrew Pinski wrote:
> > On Sun, Jun 30, 2024 at 11:17 PM Kewen.Lin <li...@linux.ibm.com> wrote:
> >>
> >> Hi,
> >>
> >> As PR115659 shows, assuming c = x CMP y, there are some
> >> folding chances for patterns r = c ? 0/z : z/-1:
> >>   - For r = c ? 0 : z, it can be folded into r = ~c & z.
> >>   - For r = c ? z : -1, it can be folded into r = ~c | z.
> >>
> >> But BIT_AND/BIT_IOR applied on one BIT_NOT operand is a
> >> compound operation, I'm not sure if each target with
> >> vector capability have a single vector instruction for it,
> >> if no, it's arguable to consider it always beats vector
> >> selection (like vector constant gets hoisted or combined
> >> and selection has same latency as normal logical operation).
> >> So IMHO we probably need to query target with new optabs.
> >> So this patch is to introduce new optabs andc, iorc and its
> >> corresponding internal functions BIT_{ANDC,IORC} (looking
> >> for suggestion for naming optabs and ifns), and if targets
> >> defines such optabs for vector modes, it means targets
> >> support these hardware insns and should be not worse than
> >> vector selection.  btw, the rs6000 changes are meant to
> >> give an example for a target supporting andc/iorc.
> >>
> >> Does this sound reasonable?
> >
> > Just a quick FYI (I will be making the change and testing the change).
> > The optab names `andc` and `iorc` unfortunately do not work with
> > scalar modes since there are complex modes which start with c and are
> > combined with the scalar modes. So for an example a pattern named
> > `andcsi3` is not for the optab `andc` with the mode of si but rather
> > for `and` optab and for the mode `csi`. The same issue happens for
> > `iorc` too.
>
> ah, thanks for pointing out this!  I guess a "_" can help, that is:
>
> OPTAB_D (andc_optab, "andc_$a3")
> OPTAB_D (iorc_optab, "iorc_$a3")
>
> but the downside is the code naming become different from "and$a3"
> and "ior$a3", so it seems better to use different names like what
> you proposed.
>
> > Thinking out loud on what names we should use instead; `andn` and
> > `iorn` might be ok? Does anyone else have any suggestions?
>
> FWIW, they look good to me.

Just FYI. I also noticed the powerpc backend could define these optabs
for scalars and would benefit for better code with the following
example (after I finish up my patches):
```
long f1(long a, long b)
{
        a = ~0x4;
        return a | ~b;
}
long f2(long a, long b)
{
        a = ~0x4;
        return a & ~b;
}
```

Thanks,
Andrew Pinski

>
> BR,
> Kewen
>
> >
> > Note I will also be adding the cond version of them since at least for
> > aarch64 SVE, bic (andc) can be conditional.
> >
> > Thanks,
> > Andrew Pinski
> >
> >>
>
>

Reply via email to