mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			Check that clones of edges exist during IPA-CP
2018-04-20 Martin Jambor <mjambor@suse.cz> ipa/85447 * ipa-cp.c (create_specialized_node): Check that clones of self-recursive edges exist during IPA-CP. testsuite/ * g++.dg/ipa/pr85447.C: New file. * gcc.dg/ipa/ipcp-self-recursion-1.c: Likewise. From-SVN: r259517
This commit is contained in:
		
							parent
							
								
									e00e62761d
								
							
						
					
					
						commit
						5fc1b92025
					
				|  | @ -1,3 +1,9 @@ | ||||||
|  | 2018-04-20  Martin Jambor  <mjambor@suse.cz> | ||||||
|  | 
 | ||||||
|  | 	ipa/85447 | ||||||
|  | 	* ipa-cp.c (create_specialized_node): Check that clones of | ||||||
|  | 	self-recursive edges exist during IPA-CP. | ||||||
|  | 
 | ||||||
| 2018-04-19  Toon Moene  <toon@moene.org> | 2018-04-19  Toon Moene  <toon@moene.org> | ||||||
| 
 | 
 | ||||||
| 	* doc/invoke.texi: Add -floop-unroll-and-jam to options enabled | 	* doc/invoke.texi: Add -floop-unroll-and-jam to options enabled | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								gcc/ipa-cp.c
								
								
								
								
							
							
						
						
									
										14
									
								
								gcc/ipa-cp.c
								
								
								
								
							|  | @ -3867,9 +3867,17 @@ create_specialized_node (struct cgraph_node *node, | ||||||
|   for (unsigned j = 0; j < self_recursive_calls.length (); j++) |   for (unsigned j = 0; j < self_recursive_calls.length (); j++) | ||||||
|     { |     { | ||||||
|       cgraph_edge *cs = next_edge_clone[self_recursive_calls[j]->uid]; |       cgraph_edge *cs = next_edge_clone[self_recursive_calls[j]->uid]; | ||||||
|       gcc_checking_assert (cs); |       /* Cloned edges can disappear during cloning as speculation can be
 | ||||||
|       gcc_assert (cs->caller == new_node); | 	 resolved, check that we have one and that it comes from the last | ||||||
|       cs->redirect_callee_duplicating_thunks (new_node); | 	 cloning.  */ | ||||||
|  |       if (cs && cs->caller == new_node) | ||||||
|  | 	cs->redirect_callee_duplicating_thunks (new_node); | ||||||
|  |       /* Any future code that would make more than one clone of an outgoing
 | ||||||
|  | 	 edge would confuse this mechanism, so let's check that does not | ||||||
|  | 	 happen.  */ | ||||||
|  |       gcc_checking_assert (!cs | ||||||
|  | 			   || !next_edge_clone[cs->uid] | ||||||
|  | 			   || next_edge_clone[cs->uid]->caller != new_node); | ||||||
|     } |     } | ||||||
|   if (have_self_recursive_calls) |   if (have_self_recursive_calls) | ||||||
|     new_node->expand_all_artificial_thunks (); |     new_node->expand_all_artificial_thunks (); | ||||||
|  |  | ||||||
|  | @ -1,3 +1,9 @@ | ||||||
|  | 2018-04-20  Martin Jambor  <mjambor@suse.cz> | ||||||
|  | 
 | ||||||
|  | 	ipa/85447 | ||||||
|  | 	* g++.dg/ipa/pr85447.C: New file. | ||||||
|  | 	* gcc.dg/ipa/ipcp-self-recursion-1.c: Likewise. | ||||||
|  | 
 | ||||||
| 2018-04-20  Jakub Jelinek  <jakub@redhat.com> | 2018-04-20  Jakub Jelinek  <jakub@redhat.com> | ||||||
| 
 | 
 | ||||||
| 	PR c++/85462 | 	PR c++/85462 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | // { dg-do compile }
 | ||||||
|  | // { dg-options "-O3 -std=gnu++11" }
 | ||||||
|  | 
 | ||||||
|  | typedef int a; | ||||||
|  | enum b : a; | ||||||
|  | class c { | ||||||
|  | public: | ||||||
|  |   enum { d }; | ||||||
|  |   virtual b e(int *, int, const int *) = 0; | ||||||
|  | }; | ||||||
|  | class f : c { | ||||||
|  |   b e(int *, int, const int *); | ||||||
|  |   b g(); | ||||||
|  | }; | ||||||
|  | b f::e(int *h, int i, const int *j) { | ||||||
|  |   if (i == d) | ||||||
|  |     return g(); | ||||||
|  |   for (;;) | ||||||
|  |     e(h, i, j); | ||||||
|  | } | ||||||
|  | int k; | ||||||
|  | c *l; | ||||||
|  | void m() { l->e(&k, c::d, nullptr); } | ||||||
|  | @ -0,0 +1,46 @@ | ||||||
|  | /* { dg-do run } */ | ||||||
|  | /* { dg-options "-O3 -fno-early-inlining"  } */ | ||||||
|  | 
 | ||||||
|  | int array[128]; | ||||||
|  | 
 | ||||||
|  | volatile int v = 0; | ||||||
|  | volatile int blah = 0; | ||||||
|  | volatile int counter = 0; | ||||||
|  | 
 | ||||||
|  | int __attribute__((noipa)) | ||||||
|  | obscured_one () | ||||||
|  | { | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | f (int c, int l) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |   for (i = 0; i < c; i++) | ||||||
|  |     array[i] = 455; | ||||||
|  | 
 | ||||||
|  |   counter++; | ||||||
|  |   if (counter > 6) | ||||||
|  |     __builtin_abort (); | ||||||
|  | 
 | ||||||
|  |   v = l; | ||||||
|  |   if (l > 0) | ||||||
|  |     f (c, l - 1); | ||||||
|  |   blah = l; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int | ||||||
|  | main (int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |   for (i = 0; i < 100; i++) | ||||||
|  |     { | ||||||
|  |       counter = 0; | ||||||
|  |       f (0, 5); | ||||||
|  |       if (obscured_one ()) | ||||||
|  | 	break; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 Martin Jambor
						Martin Jambor