On Fri, Jun 23, 2017 at 12:22 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Tue, Jun 20, 2017 at 12:32 PM, Richard Biener > <richard.guent...@gmail.com> wrote: >> On Tue, Jun 20, 2017 at 11:15 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: >>> On Fri, Jun 16, 2017 at 11:03 AM, Richard Biener >>> <richard.guent...@gmail.com> wrote: >>>> On Mon, Jun 12, 2017 at 7:03 PM, Bin Cheng <bin.ch...@arm.com> wrote: >>>>> Hi, >>>>> This patch computes and caches data dependence relation in a hash table >>>>> so that it can be queried multiple times later for partition dependence >>>>> check. >>>>> Bootstrap and test on x86_64 and AArch64. Is it OK? >>>> >>>> +/* Vector of data dependence relations. */ >>>> +static vec<ddr_p> *ddrs_vec; >>>> + >>>> +/* Hash table for data dependence relation in the loop to be distributed. >>>> */ >>>> +static hash_table<ddr_entry_hasher> *ddrs_table; >>>> >>>> avoid the extra indirection. >>>> >>>> +/* Hashtable entry for data reference relation. */ >>>> +struct ddr_entry >>>> +{ >>>> + data_reference_p a; >>>> + data_reference_p b; >>>> + ddr_p ddr; >>>> + hashval_t hash; >>>> +}; >>>> ... >>>> +/* Hash table equality function for data reference relation. */ >>>> + >>>> +inline bool >>>> +ddr_entry_hasher::equal (const ddr_entry *entry1, const ddr_entry *entry2) >>>> +{ >>>> + return (entry1->hash == entry2->hash >>>> + && DR_STMT (entry1->a) == DR_STMT (entry2->a) >>>> + && DR_STMT (entry1->b) == DR_STMT (entry2->b) >>>> + && operand_equal_p (DR_REF (entry1->a), DR_REF (entry2->a), 0) >>>> + && operand_equal_p (DR_REF (entry1->b), DR_REF (entry2->b), 0)); >>>> +} >>>> >>>> what's the issue with using hash_table <ddr_p> with a custom hasher? >>>> That is, simply key on the dataref pointers (hash them, compare those >>>> for equality)? >>>> >>>> Your scheme looks too complicated / expensive to me ... >>>> >>>> You can drop ddrs_vec needed only for memory removal if you traverse >>>> the hashtable. >>> Thanks for reviewing. Patch simplified as suggested. Is it OK? >> >> +inline hashval_t >> +ddr_hasher::hash (const data_dependence_relation *ddr) >> +{ >> + return iterative_hash_object (DDR_A (ddr), >> + iterative_hash_object (DDR_B (ddr), 0)); >> +} >> + >> >> please use >> >> inchash::hash h; >> h.add_ptr (DDR_A (ddr)); >> h.add_ptr (DDR_B (ddr)); >> return h.end (); >> >> Ok with that change. > Done, patch updated.
Ok. > Thanks, > bin >> >> Richard. >> >>> Thanks, >>> bin >>> 2017-06-17 Bin Cheng <bin.ch...@arm.com> >>> >>> * tree-loop-distribution.c (struct ddr_hasher): New. >>> (ddr_hasher::hash, ::equal, get_data_dependence): New function. >>> (ddrs_table): New. >>> (classify_partition): Call get_data_dependence. >>> (pg_add_dependence_edges): Ditto. >>> (distribute_loop): Release data dependence hash table.