On Thu, Nov 7, 2013 at 6:47 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Wed, Nov 6, 2013 at 6:06 PM, Richard Sandiford > <rdsandif...@googlemail.com> wrote: >> Hi, >> >> "bin.cheng" <bin.ch...@arm.com> writes: >>> Index: gcc/tree-ssa-loop-ivopts.c >>> =================================================================== >>> --- gcc/tree-ssa-loop-ivopts.c (revision 203267) >>> +++ gcc/tree-ssa-loop-ivopts.c (working copy) >>> @@ -2037,12 +2037,12 @@ find_interesting_uses (struct ivopts_data *data) >>> >>> static tree >>> strip_offset_1 (tree expr, bool inside_addr, bool top_compref, >>> - unsigned HOST_WIDE_INT *offset) >>> + HOST_WIDE_INT *offset) >>> { >>> tree op0 = NULL_TREE, op1 = NULL_TREE, tmp, step; >>> enum tree_code code; >>> tree type, orig_type = TREE_TYPE (expr); >>> - unsigned HOST_WIDE_INT off0, off1, st; >>> + HOST_WIDE_INT off0, off1, st; >>> tree orig_expr = expr; >>> >>> STRIP_NOPS (expr); >>> @@ -2133,19 +2133,32 @@ strip_offset_1 (tree expr, bool inside_addr, bool >>> break; >>> >>> case COMPONENT_REF: >>> - if (!inside_addr) >>> - return orig_expr; >>> + { >>> + tree field; >>> >>> - tmp = component_ref_field_offset (expr); >>> - if (top_compref >>> - && cst_and_fits_in_hwi (tmp)) >>> - { >>> - /* Strip the component reference completely. */ >>> - op0 = TREE_OPERAND (expr, 0); >>> - op0 = strip_offset_1 (op0, inside_addr, top_compref, &off0); >>> - *offset = off0 + int_cst_value (tmp); >>> - return op0; >>> - } >>> + if (!inside_addr) >>> + return orig_expr; >>> + >>> + tmp = component_ref_field_offset (expr); >>> + field = TREE_OPERAND (expr, 1); >>> + if (top_compref >>> + && cst_and_fits_in_hwi (tmp) >>> + && cst_and_fits_in_hwi (DECL_FIELD_BIT_OFFSET (field))) >> >> While comparing output for wide-int and mainline, I noticed that >> this condition is now always false on x86_64, since DECL_FIELD_BIT_OFFSET >> is a 128-bit bitsizetype and since cst_and_fits_in_hwi rejects constants >> with precision greater than HWI: >> >> if (TREE_CODE (x) != INTEGER_CST) >> return false; >> >> if (TYPE_PRECISION (TREE_TYPE (x)) > HOST_BITS_PER_WIDE_INT) >> return false; > > I think that's simply overly restrictive on the side of cst_and_fits_in_hwi. > I suppose this function is meant to complement int_cst_value (digging > in history might be nice here). > >> Should this be host_integerp (DECL_FIELD_BIT_OFFSET (field), 0) instead? > > That's not the same as it rejects -1U. The function seems to ask > if the value, if casted to unsigned fits in a HOST_WIDE_INT. > > So just drop the precision check from cst_and_fits_in_hwi. Hi, With check in of patch lowering address expression in ivo, that piece of code won't be executed anymore. So still need to drop precision check in cst_and_fits_in_hwi? The major part of strip_offset_1 can be cleaned now.
Thanks, bin -- Best Regards.