On Sun, Jun 9, 2024 at 2:00 AM Jeff Law <jeffreya...@gmail.com> wrote:

>
>
> On 5/29/24 5:12 AM, Mariam Arutunian wrote:
>
> >
> >     IIRC we looked at the problem of canonicalizing the loop into a form
> >     where we didn't necessarily have conditional blocks, instead we had
> >     branchless sequences for the conditional xor and dealing with the
> high
> >     bit in the crc.  My recollection was that the coremark CRC loop would
> >     always canonicalize, but that in general we still saw multiple CRC
> >     implementations that did not canonicalize and thus we still needed
> the
> >     more complex matching.  Correct?
> >
> >
> > The loop in CoreMark is not fully canonicalized in that form,
> > as there are still branches present for the conditional XOR operation.
> > I checked that using the -O2 and -O3 flags.
> A bit of a surprise.  Though it may be the case that some of the
> canonicalization steps are happening later in the pipeline.  No worries
> as I think we'd already concluded that we'd see at least some CRC
> implementations that wouldn't canonicalize down to branchless sequences
> for the conditional xor.
>

Sorry, I had checked incorrectly. I had checked my added GCC test
(crc-5.c), where I call both the optimized and non-optimized versions, so I
mistakenly checked the non-optimized function.
But, yes, in my pass, the function isn't canonicalized; it is canonicalized
later.


>
>
> >
> >
> >      > +
> >      > +gimple *
> >      > +crc_optimization::find_shift_after_xor (tree xored_crc)
> >      > +{
> >      > +  imm_use_iterator imm_iter;
> >      > +  use_operand_p use_p;
> >      > +
> >      > +  if (TREE_CODE (xored_crc) != SSA_NAME)
> >      > +    return nullptr;
> >     If we always expect XORED_CRC to be an SSA_NAME, we might be able to
> use
> >     gcc_assert TREE_CODE (XORED_CRC) == SSA_NAME);
> >
> > I'm not sure that it always has to be an SSA_NAME.
> For a logical operation like XOR it should always have the form
>
> SSA_NAME = SSA_NAME ^ (SSA_NAME | CONSTANT)
>
> The constant might be a vector  constant, but the basic form won't
> change.  It's one of the nicer properties of gimple.  In contrast RTL
> would allow a variety of lvalues and rvalues, including MEMs, REGs,
> SUBREGs, extensions, other binary ops, etc etc.
>

Ok. Thanks for the explanation.


>
>
> >      > +
> >      > +/* Set M_PHI_FOR_CRC and M_PHI_FOR_DATA fields.
> >      > +   Returns false if there are more than two (as in CRC
> >     calculation only CRC's
> >      > +   and data's phi may exist) or no phi statements in STMTS (at
> >     least there must
> >      > +   be CRC's phi).
> >      > +   Otherwise, returns true.  */
> >      > +
> >      > +bool
> >      > +crc_optimization::set_crc_and_data_phi (auto_vec<gimple *>
> &stmts)
> >      > +{
> >      > +  for (auto stmt_it = stmts.begin (); stmt_it != stmts.end ();
> >     stmt_it++)
> >      > +    {
> >      > +      if (is_a<gphi *> (*stmt_it) && bb_loop_header_p (gimple_bb
> >     (*stmt_it)))
> >      > +     {
> >      > +       if (!m_phi_for_crc)
> >      > +         m_phi_for_crc = as_a<gphi *> (*stmt_it);
> >      > +       else if (!m_phi_for_data)
> >      > +         m_phi_for_data = as_a<gphi *> (*stmt_it);
> >      > +       else
> >      > +         {
> >      > +           if (dump_file && (dump_flags & TDF_DETAILS))
> >      > +             fprintf (dump_file, "Xor-ed variable depends on
> >     more than 2 "
> >      > +                                 "phis.\n");
> >      > +           return false;
> >      > +         }
> >      > +     }
> >      > +    }
> >      > +  return m_phi_for_crc;
> >     Hmm.  For a given PHI, how do we know if it's for the data item or
> the
> >     crc item, or something else (like a loop counter) entirely?
> >
> >
> >
> > I trace the def-use chain upwards from the XOR statement to determine
> > which PHI node corresponds to CRC and data.
> > Since we assume the loop calculates CRC, I expect only variables
> > representing data and CRC to participate in these operations.
> > In the implementations I support, the loop counter is used only for the
> > iteration.
> > Any misidentification of CRC and data would occur only if the loop
> > doesn't calculate CRC, in which case next checks would fail, leading the
> > algorithm to identify it as not CRC.
> >
> > Here, the PHI nodes for CRC and data might be mixed in places.
> > I just assume that the first found PHI is CRC, second data.
> > I correctly determine them later with the |
> > *swap_crc_and_data_if_needed*| function.
> Ah, OK.  That probably deserves a comment in this code.
>
>
Ok. I'll add a comment.


Thanks,
Mariam


>
> jeff
>

Reply via email to