On Mon, Apr 25, 2016 at 9:13 AM, Ilya Enkovich <enkovich....@gmail.com> wrote: > 2016-04-25 18:27 GMT+03:00 H.J. Lu <hjl.to...@gmail.com>: >> >> Ilya, can you take a look? >> >> Thanks. >> >> -- >> H.J. > > Hi, > > Algorithmic part of the patch looks OK to me except the following piece of > code. > > +/* Check REF's chain to add new insns into a queue > + and find registers requiring conversion. */ > > Comment is wrong because you don't have any conversions required for > your candidates.
I will fix it. > + > +void > +scalar_chain_64::analyze_register_chain (bitmap candidates, df_ref ref) > +{ > + df_link *chain; > + > + gcc_assert (bitmap_bit_p (insns, DF_REF_INSN_UID (ref)) > + || bitmap_bit_p (candidates, DF_REF_INSN_UID (ref))); > + add_to_queue (DF_REF_INSN_UID (ref)); > + > + for (chain = DF_REF_CHAIN (ref); chain; chain = chain->next) > + { > + unsigned uid = DF_REF_INSN_UID (chain->ref); > + > + if (!NONDEBUG_INSN_P (DF_REF_INSN (chain->ref))) > + continue; > + > + if (!DF_REF_REG_MEM_P (chain->ref)) > + continue; > > I believe here you wrongly jump to the next ref intead of actually adding it > to a queue. You may just use > > gcc_assert (!DF_REF_REG_MEM_P (chain->ref)); > > because you should'n have a candidate used in address operand. I will update. > + > + if (bitmap_bit_p (insns, uid)) > + continue; > + > + if (bitmap_bit_p (candidates, uid)) > + add_to_queue (uid); > > Probably gcc_assert (bitmap_bit_p (candidates, uid)) since no uses and defs > out of candidates list are allowed? That would be wrong since there are while (!bitmap_empty_p (queue)) { insn_uid = bitmap_first_set_bit (queue); bitmap_clear_bit (queue, insn_uid); bitmap_clear_bit (candidates, insn_uid); add_insn (candidates, insn_uid); } An instruction is a candidate and the bit is cleared when analyze_register_chain is called. -- H.J.