gimple-expr.c (useless_type_conversion_p): Reinstate type canonical check for aggrega...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 3 Nov 2015 17:19:30 +0000 (17:19 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 3 Nov 2015 17:19:30 +0000 (17:19 +0000)
* gimple-expr.c (useless_type_conversion_p): Reinstate type canonical
check for aggregate types and beef up comment for mode check.

From-SVN: r229714

gcc/ChangeLog
gcc/gimple-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/discr45.adb

index d00b074d4aa34589d70f1b0335ff00935815c363..395b11c66a7912270ea9ddfc2f97a2fe49cb3892 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gimple-expr.c (useless_type_conversion_p): Reinstate type canonical
+       check for aggregate types and beef up comment for mode check.
+
 2015-11-03  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-data-refs.c (vect_analyze_data_refs): Do not collect
index f5f9e87d56f6b20f860d0e27443ee79553d92e6f..dd2550a71c33eadb7b5604dbc05640cc9e029cc9 100644 (file)
@@ -86,7 +86,8 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
   if (inner_type == outer_type)
     return true;
 
-  /* Changes in machine mode are never useless conversions unless.  */
+  /* 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;
 
@@ -262,14 +263,13 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
       return true;
     }
 
-  /* For aggregates compare only the size.  Accesses to fields do have
-     a type information by themselves and thus we only care if we can i.e.
-     use the types in move operations.  */
+  /* For aggregates we rely on TYPE_CANONICAL exclusively and require
+     explicit conversions for types involving to be structurally
+     compared types.  */
   else if (AGGREGATE_TYPE_P (inner_type)
           && TREE_CODE (inner_type) == TREE_CODE (outer_type))
-    return (TYPE_MODE (outer_type) != BLKmode
-           || operand_equal_p (TYPE_SIZE (inner_type),
-                               TYPE_SIZE (outer_type), 0));
+    return TYPE_CANONICAL (inner_type)
+          && TYPE_CANONICAL (inner_type) == TYPE_CANONICAL (outer_type);
 
   else if (TREE_CODE (inner_type) == OFFSET_TYPE
           && TREE_CODE (outer_type) == OFFSET_TYPE)
index 8b9bf4c6ef74d829c1993ee13e68dd861e159be8..14253d1d1b345b5248c5166c408f83736dbaa95e 100644 (file)
@@ -1,3 +1,7 @@
+2015-11-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/discr45.adb: Only compile the test.
+
 2015-11-03  Evgeny Stupachenko  <evstupac@gmail.com>
 
        * g++.dg/ext/mvc4.C: Add dg-require-ifunc condition.
index 0d0b4dc6926aabae4f79498899d3654cfcfb894e..5e276c9df6d9325cfec7c7549805144248667fab 100644 (file)
@@ -1,4 +1,4 @@
--- { dg-do run }
+-- { dg-do compile }
 -- { dg-options "-O2 -gnatws" }
 
 procedure Discr45 is