[Bug c/60819] dse1 removing not-dead insn (aliasing issue?)

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Fri Apr 11 12:51:00 GMT 2014


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

--- Comment #9 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 11 Apr 2014, glisse at gcc dot gnu.org wrote:

> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60819
> 
> --- Comment #8 from Marc Glisse <glisse at gcc dot gnu.org> ---
> (In reply to rguenther@suse.de from comment #6)
> > Not exactly - it's again the wrapping that will fail.
> 
> That seems strange to me. From the doc of may_alias:
> 
> "Accesses through pointers to types with this attribute are not subject to
> type-based alias analysis, but are instead assumed to be able to alias any
> other type of objects." "This extension exists to support some vector APIs, in
> which pointers to one vector type are permitted to alias pointers to a
> different vector type."
> 
> and indeed the x86 *intrin.h files cast between __m128i and __v4si (and many
> other combinations) all the time.

But the actual access will be that generated by the frontend via a
pointer to a scalar (that doesn't have the ref-all flag set).

Patch that should make your 2nd testcase work as expected:

Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c     (revision 209298)
+++ gcc/c-family/c-common.c     (working copy)
@@ -11770,8 +11770,9 @@ convert_vector_to_pointer_for_subscript

       c_common_mark_addressable_vec (*vecp);
       type = build_qualified_type (TREE_TYPE (type), TYPE_QUALS (type));
-      type = build_pointer_type (type);
       type1 = build_pointer_type (TREE_TYPE (*vecp));
+      type = build_pointer_type_for_mode (type, ptr_mode,
+                                         TYPE_REF_CAN_ALIAS_ALL (type1));
       *vecp = build1 (ADDR_EXPR, type1, *vecp);
       *vecp = convert (type, *vecp);
     }



More information about the Gcc-bugs mailing list