[Bug middle-end/83164] [8 regression] internal compiler error: verify_gimple failed

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Nov 27 08:54:00 GMT 2017


Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
                 CC|                            |rguenth at gcc dot gnu.org
   Target Milestone|---                         |8.0

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
comparison verification has

  /* For comparisons we do not have the operations type as the
     effective type the comparison is carried out in.  Instead
     we require that either the first operand is trivially
     convertible into the second, or the other way around.
     Because we special-case pointers to void we allow
     comparisons of pointers with the same mode as well.  */
  if (!useless_type_conversion_p (op0_type, op1_type)
      && !useless_type_conversion_p (op1_type, op0_type)
      && (!POINTER_TYPE_P (op0_type)
          || !POINTER_TYPE_P (op1_type)
          || TYPE_MODE (op0_type) != TYPE_MODE (op1_type)))

which works around a similar issue there (the comment is outdated).

IIRC the following is to not wreck targets with function descriptors
where the conversion generates code(?)  I'd be very happy to get rid
of this special case and/or if this is really the case make it
more explicit somehow.

useless_type_conversion_p (tree outer_type, tree inner_type)
  /* Do the following before stripping toplevel qualifiers.  */
  if (POINTER_TYPE_P (inner_type)
      && POINTER_TYPE_P (outer_type))
      /* Do not lose casts to function pointer types.  */
      if ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
           || TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
          && !(TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE
               || TREE_CODE (TREE_TYPE (inner_type)) == METHOD_TYPE))
        return false;

More information about the Gcc-bugs mailing list