On Mon, Jan 8, 2024 at 5:57 PM Andrew Pinski <pins...@gmail.com> wrote: > > On Mon, Jan 8, 2024 at 6:44 AM Uros Bizjak <ubiz...@gmail.com> wrote: > > > > Instead of converting XOR or PLUS of two values, ANDed with two constants > > that > > have no bits in common, to IOR expression, convert IOR or XOR of said two > > ANDed values to PLUS expression. > > I think this only helps targets which have leal like instruction. Also > I think it is the same issue as I recorded as PR 111763 . I suspect > BIT_IOR is more of a Canonical form for GIMPLE while we should handle > this in expand to decide if we want to use PLUS or IOR.
For the pr108477.c testcase, expand pass expands: r_3 = a_2(D) & 1; p_5 = b_4(D) & 4294967292; _1 = r_3 | p_5; _6 = _1 + 2; return _6; The transformation ( | -> + ) is valid only when CST1 & CST2 == 0, so we need to determine values of constants. Is this information available in the expand pass? IMO, the transformation from (ra | rb | cst) to (ra + rb + cst) as in the shown testcase would be beneficial when constructing control register values (see e.g. mesa-3d). We can use LEA instead of OR+ADD sequence in this case. Uros.