2016-04-26 17:07 GMT+03:00 H.J. Lu <hjl.to...@gmail.com>: > 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.
You clear candidates bit but the first thing you do in add_insn is set insns bit. Thus you should hit: if (bitmap_bit_p (insns, uid)) continue; For handled candidates. Probably it would be more clear if we keep this clear/set pair together? E.g. move bitmap_clear_bit (candidates, insn_uid) to scalar_chain::add_insn. Thanks, Ilya > > -- > H.J.