[Bug tree-optimization/79690] IVOPTs drops gs: prefix
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 23 15:34:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79690
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #3)
> But an extra assert like the following triggers during bootstrap so we can't
> really avoid the casting (in all cases).
>
> Index: gcc/tree-ssa-address.c
> ===================================================================
> --- gcc/tree-ssa-address.c (revision 245681)
> +++ gcc/tree-ssa-address.c (working copy)
> @@ -708,6 +702,9 @@ create_mem_ref (gimple_stmt_iterator *gs
> tree mem_ref, tmp;
> struct mem_address parts;
>
> + if (base_hint)
> + gcc_assert (POINTER_TYPE_P (TREE_TYPE (base_hint)));
> +
> addr_to_parts (type, addr, iv_cand, base_hint, &parts, speed);
> gimplify_mem_ref_parts (gsi, &parts);
> mem_ref = create_mem_ref_raw (type, alias_ptr_type, &parts, true);
>
> OTOH it looks harmless for a few cases I tried (the base_hint won't match
> in the search for it). Testing w/o that assert.
Ok, so we'd move an integer to ->base and then later when building the
TARGET_MEM_REF we'd refuse that base and do
else if (addr->base
&& POINTER_TYPE_P (TREE_TYPE (addr->base)))
{
base = addr->base;
index2 = NULL_TREE;
}
else
{
base = build_int_cst (build_pointer_type (type), 0);
index2 = addr->base;
}
which cost-wide wasn't expected? It's probably also not a good idea
in general to generate a zero-based TARGET_MEM_REF....
It's also against the very first check:
if (verify
&& !valid_mem_ref_p (TYPE_MODE (type), TYPE_ADDR_SPACE (type), addr))
return NULL_TREE;
which btw also uses a bogus type to get the address-space from.
So I think a better fix would be to ensure that TREE_TYPE (mem-ref) has
the same address-space as its pointed-to type in operand 0 ...
More information about the Gcc-bugs
mailing list