Message ID | CAFiYyc25zro3NiKDk=dfDLzjeJaOteFugD4MQ_VYVuo5xJzH8w@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Fri, Dec 6, 2013 at 6:19 PM, Richard Biener <richard.guenther@gmail.com> wrote: > On Mon, Nov 25, 2013 at 7:41 PM, Jeff Law <law@redhat.com> wrote: >> On 11/25/13 02:22, bin.cheng wrote: >> >> Unless there's a PR for this problem, I think this needs to wait. > > I agree. Btw, please split the patch. Yes, I will get back to this after entering stage 1 again :) Hi Richard, I talked with you about clean strip_offset_1 up after this series of base simplification patches, but I realized it's not safe because affine facility has it's limit, like can only support 8 elements. Though the cleanup passes bootstrap and test on x86/x86_64 and most of codes in strip_offset_1 won't be executed usually, I guess we'd better to live with it, so what do you think? Thanks, bin > > Index: gcc/tree-affine.c > =================================================================== > --- gcc/tree-affine.c (revision 205087) > +++ gcc/tree-affine.c (working copy) > @@ -328,7 +328,19 @@ tree_to_aff_combination (tree expr, tree type, aff > double_int::from_uhwi (bitpos / BITS_PER_UNIT)); > core = build_fold_addr_expr (core); > if (TREE_CODE (core) == ADDR_EXPR) > - aff_combination_add_elt (comb, core, double_int_one); > + { > + /* Handle &MEM[ptr + CST] in core part of complex reference. */ > + if (TREE_CODE (TREE_OPERAND (core, 0)) == MEM_REF) > + { > + core = TREE_OPERAND (core, 0); > + tree_to_aff_combination (TREE_OPERAND (core, 0), type, &tmp); > + aff_combination_add (comb, &tmp); > + tree_to_aff_combination (TREE_OPERAND (core, 1), sizetype, &tmp); > + aff_combination_add (comb, &tmp); > + } > + else > + aff_combination_add_elt (comb, core, double_int_one); > + } > else > { > tree_to_aff_combination (core, type, &tmp) > > please handle the offset before taking the address, thus > > if (TREE_CODE (core) == MEM_REF) > { > add constant offset; > core = TREE_OPERAND (core, 0); > } > else > core = build_fold_addr_expr (core); > > that simplifies things and avoids the address building. > > Richard. > >> jeff >> >>
On Fri, Dec 6, 2013 at 11:40 AM, Bin.Cheng <amker.cheng@gmail.com> wrote: > On Fri, Dec 6, 2013 at 6:19 PM, Richard Biener > <richard.guenther@gmail.com> wrote: >> On Mon, Nov 25, 2013 at 7:41 PM, Jeff Law <law@redhat.com> wrote: >>> On 11/25/13 02:22, bin.cheng wrote: >>> >>> Unless there's a PR for this problem, I think this needs to wait. >> >> I agree. Btw, please split the patch. > Yes, I will get back to this after entering stage 1 again :) > > Hi Richard, > I talked with you about clean strip_offset_1 up after this series of > base simplification patches, but I realized it's not safe because > affine facility has it's limit, like can only support 8 elements. > Though the cleanup passes bootstrap and test on x86/x86_64 and most of > codes in strip_offset_1 won't be executed usually, I guess we'd better > to live with it, so what do you think? Not sure - I'm lacking some context here ;) If you have a cleanup patch fine - WRT the affine limit of 8 elements, further elements will just add to the rest tree. This is to limit compile-time. Richard. > Thanks, > bin > >> >> Index: gcc/tree-affine.c >> =================================================================== >> --- gcc/tree-affine.c (revision 205087) >> +++ gcc/tree-affine.c (working copy) >> @@ -328,7 +328,19 @@ tree_to_aff_combination (tree expr, tree type, aff >> double_int::from_uhwi (bitpos / BITS_PER_UNIT)); >> core = build_fold_addr_expr (core); >> if (TREE_CODE (core) == ADDR_EXPR) >> - aff_combination_add_elt (comb, core, double_int_one); >> + { >> + /* Handle &MEM[ptr + CST] in core part of complex reference. */ >> + if (TREE_CODE (TREE_OPERAND (core, 0)) == MEM_REF) >> + { >> + core = TREE_OPERAND (core, 0); >> + tree_to_aff_combination (TREE_OPERAND (core, 0), type, &tmp); >> + aff_combination_add (comb, &tmp); >> + tree_to_aff_combination (TREE_OPERAND (core, 1), sizetype, &tmp); >> + aff_combination_add (comb, &tmp); >> + } >> + else >> + aff_combination_add_elt (comb, core, double_int_one); >> + } >> else >> { >> tree_to_aff_combination (core, type, &tmp) >> >> please handle the offset before taking the address, thus >> >> if (TREE_CODE (core) == MEM_REF) >> { >> add constant offset; >> core = TREE_OPERAND (core, 0); >> } >> else >> core = build_fold_addr_expr (core); >> >> that simplifies things and avoids the address building. >> >> Richard. >> >>> jeff >>> >>> > > > > -- > Best Regards.
On Fri, Dec 6, 2013 at 7:20 PM, Richard Biener <richard.guenther@gmail.com> wrote: > On Fri, Dec 6, 2013 at 11:40 AM, Bin.Cheng <amker.cheng@gmail.com> wrote: >> On Fri, Dec 6, 2013 at 6:19 PM, Richard Biener >> <richard.guenther@gmail.com> wrote: >>> On Mon, Nov 25, 2013 at 7:41 PM, Jeff Law <law@redhat.com> wrote: >>>> On 11/25/13 02:22, bin.cheng wrote: >>>> >>>> Unless there's a PR for this problem, I think this needs to wait. >>> >>> I agree. Btw, please split the patch. >> Yes, I will get back to this after entering stage 1 again :) >> >> Hi Richard, >> I talked with you about clean strip_offset_1 up after this series of >> base simplification patches, but I realized it's not safe because >> affine facility has it's limit, like can only support 8 elements. >> Though the cleanup passes bootstrap and test on x86/x86_64 and most of >> codes in strip_offset_1 won't be executed usually, I guess we'd better >> to live with it, so what do you think? > > Not sure - I'm lacking some context here ;) If you have a cleanup patch > fine - WRT the affine limit of 8 elements, further elements will just > add to the rest tree. This is to limit compile-time. Yes, so it's possible to have COMPONENT_REF stored in rest tree if we reach the 8 elements limit. In this case the COMPONENT_REF will be visited by the code in strip_offset_1, although it sounds unlikely to happen. Thanks, bin > > Richard.
Index: gcc/tree-affine.c =================================================================== --- gcc/tree-affine.c (revision 205087) +++ gcc/tree-affine.c (working copy) @@ -328,7 +328,19 @@ tree_to_aff_combination (tree expr, tree type, aff double_int::from_uhwi (bitpos / BITS_PER_UNIT)); core = build_fold_addr_expr (core); if (TREE_CODE (core) == ADDR_EXPR) - aff_combination_add_elt (comb, core, double_int_one); + { + /* Handle &MEM[ptr + CST] in core part of complex reference. */ + if (TREE_CODE (TREE_OPERAND (core, 0)) == MEM_REF) + { + core = TREE_OPERAND (core, 0); + tree_to_aff_combination (TREE_OPERAND (core, 0), type, &tmp); + aff_combination_add (comb, &tmp); + tree_to_aff_combination (TREE_OPERAND (core, 1), sizetype, &tmp); + aff_combination_add (comb, &tmp); + } + else + aff_combination_add_elt (comb, core, double_int_one); + } else { tree_to_aff_combination (core, type, &tmp)