On Tue, 29 Oct 2013, Jeff Law wrote:

Marc pointed out that the handling of various BUILT_IN_MEM* and BUILT_IN_STR* functions in tree-ssa-alias.c probably wasn't working as intended because the code wasn't prepared for a common return value from ao_ref_base, particularly returns of MEM_REFs.

Hmm, ao_ref_base is never a pointer, so I'd say the issue is really with trying to use the SSA_NAME directly.

This patch fixes the code to handle the trivial case of returning a MEM_REF and adds a simple testcase. There's probably a lot more that could be done here.

Thanks.

I am not sure we want to keep the variable "base" that is either a decl/ref (from get_addr_base_and_unit_offset) or a pointer (dest). We know which case is which, but then forget it by storing both into base. Maybe something like this would be more "type-safe".

              bool same = false;
              if (TREE_CODE (dest) == ADDR_EXPR)
                same = (ref_base == get_addr_base_and_unit_offset
                                      (TREE_OPERAND (dest, 0), &offset));
              else if (TREE_CODE (dest) == SSA_NAME
                       && TREE_CODE (ref_base) == MEM_REF)
                same = (TREE_OPERAND (ref_base, 0) == dest);
              if (same)
                ...


By the way, I think the patch is fine as is, I am only discussing possible follow-ups.

(see http://gcc.gnu.org/ml/gcc-patches/2013-10/txto0PQEYpiuz.txt for another approach using ao_ref_init_from_ptr_and_size)

--
Marc Glisse

Reply via email to