[Bug tree-optimization/97360] [11 Regression] ICE in range_on_exit

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Fri Oct 16 16:55:40 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97360

--- Comment #20 from rguenther at suse dot de <rguenther at suse dot de> ---
On October 16, 2020 5:46:28 PM GMT+02:00, amacleod at redhat dot com
<gcc-bugzilla@gcc.gnu.org> wrote:
>https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97360
>
>--- Comment #19 from Andrew Macleod <amacleod at redhat dot com> ---
>(In reply to rguenther@suse.de from comment #18)
>> On October 16, 2020 4:17:43 PM GMT+02:00, amacleod at redhat dot com
>> 
>> >
>> >Yeah, I haven't tripped over it in ADA. This was a 512 byte quad on
>the
>> >powerpc
>> >target.. so far the only place I have seen this issue.
>> >
>> >      tree xi_uns_type = make_unsigned_type (512);
>> >      vector_quad_type_node = build_distinct_type_copy
>(xi_uns_type);
>> >      SET_TYPE_MODE (vector_quad_type_node, PXImode);
>         ^^^^^^^^^^^^^^
>
>This is why types_compatible_p() fails.  before checking sign and
>precision
>matching, it does:
>
>  inner_type = TYPE_MAIN_VARIANT (inner_type);
>  outer_type = TYPE_MAIN_VARIANT (outer_type);
>
>  if (inner_type == outer_type)
>    return true;
>
>/* Changes in machine mode are never useless conversions because the
>RTL
>     middle-end expects explicit conversions between modes.  */
>  if (TYPE_MODE (inner_type) != TYPE_MODE (outer_type))
>    return false;
>
>and since the modes are now different, it never gets to check the sign
>and
>precision.... (which do match).
>
>
>
>> >      layout_type (vector_quad_type_node);
>> 
>> Why not put the fix here instead of in build distinct type copy?? 
>> 
>>  lang_hooks.types.register_builtin_type (vector_quad_type_node,
>> >                                              "__vector_quad")
>> >
>> >The vector_quad ends up with MAX and MIN set to the uint512_t type,
>> >which is
>> >not types_compatible_p...  
>> >Perhaps the type should be created some other way rather than
>> >distinct_type?
>> 
>> Quite sure. 
>
>
>I could fix it right there... but it wont prevent something similar
>from
>happening elsewhere.  Anyone changing the mode of the new distinct type
>will
>continue to allow types_incompatible_p() types for MIN and MAX.
>
>Maybe its not a big deal, but it just seems like a glaring
>inconsistency to me.
>If you ask for  distinct type, you should get one, complete with
>distinct
>elements so you don't need to worry about things like this.
>
>It doesn't seem like powerpc is doing anything wrong, but they are
>getting an
>inconsistent type back due to the way types_compatible_p checks things.
>
>Now, looking further into it, this would appear to be the only 2 places
>in all
>the architectures where build_distinct_type_copy() is called, and then
>the mode
>is changed.   All the other places build a type then set the mode
>rather than
>getting a copy. 
>
>I'd still prefer to fix it at its source, but given the lack of
>prevalence, I
>could just set the MIN MAX properly here where these 2 types are having
>their
>mode changed.   
>
>Is this your preferred solution?

The backen should use more lowlevel functions to build this type rather than
copying from a type that isn't appropriate. Off my head it wants
fixup_unsigned_type after setting the mode and eventually a different function
to build the original type. See tree.c where we build for example
boolean_type_node

>diff --git a/gcc/config/rs6000/rs6000-call.c
>b/gcc/config/rs6000/rs6000-call.c
>index 9fdf97bc803..1fcb438ef95 100644
>--- a/gcc/config/rs6000/rs6000-call.c
>+++ b/gcc/config/rs6000/rs6000-call.c
>@@ -12917,6 +12917,13 @@ rs6000_init_builtins (void)
>       tree oi_uns_type = make_unsigned_type (256);
>       vector_pair_type_node = build_distinct_type_copy (oi_uns_type);
>       SET_TYPE_MODE (vector_pair_type_node, POImode);
>+      // Changing modes makes the types incompatable.
>+      TYPE_MIN_VALUE (vector_pair_type_node)
>+       = wide_int_to_tree (vector_pair_type_node,
>+                           wi::to_wide (TYPE_MIN_VALUE
>(oi_uns_type)));
>+      TYPE_MAX_VALUE (vector_pair_type_node)
>+       = wide_int_to_tree (vector_pair_type_node,
>+                           wi::to_wide (TYPE_MAX_VALUE
>(oi_uns_type)));
>       layout_type (vector_pair_type_node);
>       lang_hooks.types.register_builtin_type (vector_pair_type_node,
>                                              "__vector_pair");
>@@ -12924,6 +12931,13 @@ rs6000_init_builtins (void)
>       tree xi_uns_type = make_unsigned_type (512);
>       vector_quad_type_node = build_distinct_type_copy (xi_uns_type);
>       SET_TYPE_MODE (vector_quad_type_node, PXImode);
>+      // Changing modes makes the types incompatable.
>+      TYPE_MIN_VALUE (vector_quad_type_node)
>+       = wide_int_to_tree (vector_quad_type_node,
>+                           wi::to_wide (TYPE_MIN_VALUE
>(xi_uns_type)));
>+      TYPE_MAX_VALUE (vector_quad_type_node)
>+       = wide_int_to_tree (vector_quad_type_node,
>+                           wi::to_wide (TYPE_MAX_VALUE
>(xi_uns_type)));
>       layout_type (vector_quad_type_node);
>       lang_hooks.types.register_builtin_type (vector_quad_type_node,
>                                              "__vector_quad");
>
>.
>
>
>> 
>> >
>> >Im starting to wonder if I should stop trying to assert type
>> >correctness when
>> >processing ranges since our type "system" has too many tweaky
>> >inconsistencies
>> >that we continue to trip over.  
>> >
>> >Instead, just make sure precision and sign are the same and "trust"
>> >gimple to
>> >be right otherwise.
>> 
>> If precision and sign are the same then types_compatible_p will
>return true.
>
>except in cases like this :-P


More information about the Gcc-bugs mailing list