re PR middle-end/49210 (verify_gimple fails building ada/einfo.o at -O3)
authorRichard Guenther <rguenther@suse.de>
Mon, 30 May 2011 13:12:23 +0000 (13:12 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 30 May 2011 13:12:23 +0000 (13:12 +0000)
2011-05-30  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/49210
* ipa-split.c (split_function): Care for the case where the
call result is not trivially convertible to the result holding
variable.

* gnat.dg/boolean_subtype2.adb: New testcase.
* gnat.dg/boolean_subtype2.ads: Likewise.
* gnat.dg/boolean_subtype2_pkg.ads: Likewise.

From-SVN: r174435

gcc/ChangeLog
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/boolean_subtype2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/boolean_subtype2.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/boolean_subtype2_pkg.ads [new file with mode: 0644]

index e1d9f65508ddf35fe9fc93348b1db3d69ce9972c..ed73069b2975feee52489f56c135f4060abe9e95 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/49210
+       * ipa-split.c (split_function): Care for the case where the
+       call result is not trivially convertible to the result holding
+       variable.
+
 2011-05-30  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/49218
index 9579d41f18b5541077586cc1afa362f6400b55b1..2e6728740243aa60381d8655c2a9df470d3ea7b1 100644 (file)
@@ -1196,11 +1196,31 @@ split_function (struct split_point *split_point)
                    }
                }
              if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
-               gimple_call_set_lhs (call, build_simple_mem_ref (retval));
+               {
+                 gimple_call_set_lhs (call, build_simple_mem_ref (retval));
+                 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
+               }
              else
-               gimple_call_set_lhs (call, retval);
+               {
+                 tree restype;
+                 restype = TREE_TYPE (DECL_RESULT (current_function_decl));
+                 gsi_insert_after (&gsi, call, GSI_NEW_STMT);
+                 if (!useless_type_conversion_p (TREE_TYPE (retval), restype))
+                   {
+                     gimple cpy;
+                     tree tem = create_tmp_reg (restype, NULL);
+                     tem = make_ssa_name (tem, call);
+                     cpy = gimple_build_assign_with_ops (NOP_EXPR, retval,
+                                                         tem, NULL_TREE);
+                     gsi_insert_after (&gsi, cpy, GSI_NEW_STMT);
+                     retval = tem;
+                   }
+                 gimple_call_set_lhs (call, retval);
+                 update_stmt (call);
+               }
            }
-          gsi_insert_after (&gsi, call, GSI_NEW_STMT);
+         else
+           gsi_insert_after (&gsi, call, GSI_NEW_STMT);
        }
       /* We don't use return block (there is either no return in function or
         multiple of them).  So create new basic block with return statement.
index cca41493dabcac345905bce20686cad207169892..d7df19bda9a11acef003a497480069eefaf3fe9e 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/49210
+       * gnat.dg/boolean_subtype2.adb: New testcase.
+       * gnat.dg/boolean_subtype2.ads: Likewise.
+       * gnat.dg/boolean_subtype2_pkg.ads: Likewise.
+
 2011-05-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/49223
diff --git a/gcc/testsuite/gnat.dg/boolean_subtype2.adb b/gcc/testsuite/gnat.dg/boolean_subtype2.adb
new file mode 100644 (file)
index 0000000..d5c17ce
--- /dev/null
@@ -0,0 +1,40 @@
+-- { dg-do compile }
+-- { dg-options "-O3 -gnata" }
+
+package body Boolean_Subtype2 is
+
+   function Component_Type (Id : Entity_Id) return Entity_Id is
+   begin
+      pragma Assert (Is_String_Type (Id));
+      return Node20 (Id);
+   end;
+
+   function First_Index (Id : Entity_Id) return Node_Id is
+   begin
+      pragma Assert (Is_String_Type (Id));
+      return Node20 (Id);
+   end ;
+
+   function Is_Character_Type (Id : Entity_Id) return B is
+   begin
+      return Flag63 (Id);
+   end;
+
+   function Number_Dimensions (Id : Entity_Id) return Positive is
+      N : Integer := 0;
+      T : Node_Id := First_Index (Id);
+   begin
+      if Present (T) then
+         N := N + 1;
+      end if;
+      return N;
+   end;
+
+   function Is_String_Type (Id : Entity_Id) return B is
+   begin
+      return (Id /= 0
+              and then Number_Dimensions (Id) = 1
+              and then Is_Character_Type (Component_Type (Id)));
+   end;
+
+end Boolean_Subtype2;
diff --git a/gcc/testsuite/gnat.dg/boolean_subtype2.ads b/gcc/testsuite/gnat.dg/boolean_subtype2.ads
new file mode 100644 (file)
index 0000000..82e192b
--- /dev/null
@@ -0,0 +1,9 @@
+with Boolean_Subtype2_Pkg; use Boolean_Subtype2_Pkg;
+
+package Boolean_Subtype2 is
+
+   subtype B is Boolean;
+
+   function Is_String_Type (Id : Entity_Id) return B;
+
+end Boolean_Subtype2;
diff --git a/gcc/testsuite/gnat.dg/boolean_subtype2_pkg.ads b/gcc/testsuite/gnat.dg/boolean_subtype2_pkg.ads
new file mode 100644 (file)
index 0000000..3c2f610
--- /dev/null
@@ -0,0 +1,10 @@
+package Boolean_Subtype2_Pkg is
+
+   type Node_Id is range 0 .. 099_999_999;
+   subtype Entity_Id is Node_Id;
+
+   function Node20 (N : Node_Id) return Node_Id;
+   function Flag63 (N : Node_Id) return Boolean;
+   function Present (N : Node_Id) return Boolean;
+
+end Boolean_Subtype2_Pkg;