http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54781



Jakub Jelinek <jakub at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

             Status|UNCONFIRMED                 |NEW

   Last reconfirmed|                            |2012-11-20

                 CC|                            |jakub at gcc dot gnu.org,

                   |                            |ramana at gcc dot gnu.org

          Component|middle-end                  |target

   Target Milestone|---                         |4.8.0

     Ever Confirmed|0                           |1



--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-11-20 
13:50:08 UTC ---

Looks like a target bug to me, neon_dereference_pointer creates an invalid

MEM_REF (the first operand on it doesn't satisfy the required

is_gimple_mem_ref_addr predicate) and this invalid MEM_REF is then added by

expand_normal into the MEM_EXPR of the MEM, and the aliasing code is then upset

about it.



In particular, the MEM_REF operand is &z[x_5(D)].  The reason why &z[x_5(D)] is

in the CALL_EXPR_ARG of the builtin is expand_call_stmt optimization:

      /* TER addresses into arguments of builtin functions so we have a

         chance to infer more correct alignment information.  See PR39954.  */

Best would be if in this case the backend could find out the original argument,

which was a SSA_NAME, and use that as the MEM_REF operand instead, but I'm

afraid we don't have such a way right now.  So perhaps the backend could clear

MEM_EXPR

if it is invalid:

    case NEON_ARG_MEMORY:

...

      if (MEM_EXPR (op[argc]) && TREE_CODE (MEM_EXPR (op[argc])) == MEM_REF

          && !is_gimple_mem_ref_addr (TREE_OPERAND (MEM_EXPR (op[argc]), 0)))

        /* Make sure MEM_EXPR created by neon_dereference_pointer isn't

invalid.  */

        set_mem_expr (op[argc], NULL_RTX);

Reply via email to