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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org
          Component|c                           |tree-optimization

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-01-31 
09:30:30 UTC ---
Ugh.  The problem seems to be that the middle-end considers sizetype and size_t
to be compatible types, thus we have x = y + 1; and similar stmts where x and 1
has sizetype type, but y has size_t.  tree-ssa-ccp.c (but similarly other
places e.g. in tree.c) ignore TYPE_UNSIGNED on sizetype, assuming it is 0, so
my fix in tree-ssa-ccp.c results in different value of uns on such stmts.

--- gcc/tree-ssa.c.jj   2011-01-15 11:26:42.000000000 +0100
+++ gcc/tree-ssa.c      2011-01-31 10:16:30.319433380 +0100
@@ -1276,6 +1276,12 @@ useless_type_conversion_p (tree outer_ty
          || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
        return false;

+      if ((TREE_CODE (inner_type) == INTEGER_TYPE
+          && TYPE_IS_SIZETYPE (inner_type))
+         != (TREE_CODE (outer_type) == INTEGER_TYPE
+             && TYPE_IS_SIZETYPE (outer_type)))
+       return false;
+
       /* We don't need to preserve changes in the types minimum or
         maximum value in general as these do not generate code
         unless the types precisions are different.  */

seems to fix the miscompilation, but I'm afraid could have pretty substantial
result on IL size.  Why do we need something so ill-designed as sizetype?  Just
for Ada?

Reply via email to