Patchwork Fix PR ipa/60315 (inliner explosion)

login
register
mail settings
Submitter Jan Hubicka
Date March 28, 2014, 10:21 p.m.
Message ID <20140328222100.GA25824@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/334899/
State New
Headers show

Comments

Jan Hubicka - March 28, 2014, 10:21 p.m.
> > Actually after some additional invetstigation I decided to commit this
> > patch. fixup_noreturn_call already cares about the return value but
> > differently than the new Jakub's code. 
> 
> Thanks for the quick fix, I confirm that the ACATS failures are all gone.
> 
> So we're left with the GIMPLE checking failure on opt33.adb.

Hi,
this is the patch I just comitted.  It simply clears the static chain when needed.

Honza

	* cgraph.c (cgraph_redirect_edge_call_stmt_to_callee): Clear
	static chain if needed.
	* gnat.dg/opt33.adb: New testcase.

Patch

Index: cgraph.c
===================================================================
--- cgraph.c	(revision 208915)
+++ cgraph.c	(working copy)
@@ -1488,6 +1488,14 @@  cgraph_redirect_edge_call_stmt_to_callee
 	  gsi_insert_before (&gsi, set_stmt, GSI_SAME_STMT);
 	}
       gimple_call_set_lhs (new_stmt, NULL_TREE);
+      update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
+    }
+
+  /* If new callee has no static chain, remove it.  */
+  if (gimple_call_chain (new_stmt) && !DECL_STATIC_CHAIN (e->callee->decl))
+    {
+      gimple_call_set_chain (new_stmt, NULL);
+      update_stmt_fn (DECL_STRUCT_FUNCTION (e->caller->decl), new_stmt);
     }
 
   cgraph_set_call_stmt_including_clones (e->caller, e->call_stmt, new_stmt, false);
Index: testsuite/gnat.dg/opt33.adb
===================================================================
--- testsuite/gnat.dg/opt33.adb	(revision 0)
+++ testsuite/gnat.dg/opt33.adb	(revision 0)
@@ -0,0 +1,41 @@ 
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Ada.Containers.Ordered_Sets;
+with Ada.Strings.Unbounded;
+
+procedure Opt33 is
+
+   type Rec is record
+      Name : Ada.Strings.Unbounded.Unbounded_String;
+   end record;
+
+   function "<" (Left : Rec; Right : Rec) return Boolean;
+
+   package My_Ordered_Sets is new Ada.Containers.Ordered_Sets (Rec);
+
+   protected type Data is
+      procedure Do_It;
+   private
+      Set : My_Ordered_Sets.Set;
+   end Data;
+
+   function "<" (Left : Rec; Right : Rec) return Boolean is
+   begin
+      return False;
+   end "<";
+
+   protected body Data is
+      procedure Do_It is
+         procedure Dummy (Position : My_Ordered_Sets.Cursor) is
+         begin
+            null;
+         end;
+      begin
+         Set.Iterate (Dummy'Access);
+      end;
+   end Data;
+
+begin
+   null;
+end;