2016-04-26 17:55 GMT+03:00 H.J. Lu <hjl.to...@gmail.com>: > On Tue, Apr 26, 2016 at 7:15 AM, Ilya Enkovich <enkovich....@gmail.com> wrote: >> 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. >> > > After we started processing candidates, we only use candidates > to check if an instruction is a candidate, not to check if an > instruction is NOT a candidate.
I don't see how it's related to what I said. My point is that when you analyze added insn you shouldn't reach insns which are both not in candidates and not in current scalar_chain_64. That's why I think you miss an assert in scalar_chain_64::analyze_register_chain. Thanks, Ilya > > -- > H.J.