mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			re PR tree-optimization/60505 (Warning caused by GCC vectorizer.)
2014-04-03  Cong Hou  <congh@google.com>
PR tree-optimization/60505
    * tree-vectorizer.h (struct _stmt_vec_info): Add th field as the
    threshold of number of iterations below which no vectorization will be
    done.
    * tree-vect-loop.c (new_loop_vec_info):
    Initialize LOOP_VINFO_COST_MODEL_THRESHOLD.
    * tree-vect-loop.c (vect_analyze_loop_operations):
    Set LOOP_VINFO_COST_MODEL_THRESHOLD.
    * tree-vect-loop.c (vect_transform_loop):
    Use LOOP_VINFO_COST_MODEL_THRESHOLD.
    * tree-vect-loop.c (vect_analyze_loop_2): Check the maximum number
    of iterations of the loop and see if we should build the epilogue.
2014-04-03  Cong Hou  <congh@google.com>
    PR tree-optimization/60505
    * gcc.dg/vect/pr60505.c: New test.
From-SVN: r209065
			
			
This commit is contained in:
		
							parent
							
								
									bdc67fd6a4
								
							
						
					
					
						commit
						090cd8dc70
					
				|  | @ -1,3 +1,18 @@ | ||||||
|  | 2014-04-03  Cong Hou  <congh@google.com> | ||||||
|  | 
 | ||||||
|  | 	PR tree-optimization/60505 | ||||||
|  | 	* tree-vectorizer.h (struct _stmt_vec_info): Add th field as the | ||||||
|  | 	threshold of number of iterations below which no vectorization will be | ||||||
|  | 	done. | ||||||
|  | 	* tree-vect-loop.c (new_loop_vec_info): | ||||||
|  | 	Initialize LOOP_VINFO_COST_MODEL_THRESHOLD. | ||||||
|  | 	* tree-vect-loop.c (vect_analyze_loop_operations): | ||||||
|  | 	Set LOOP_VINFO_COST_MODEL_THRESHOLD. | ||||||
|  | 	* tree-vect-loop.c (vect_transform_loop): | ||||||
|  | 	Use LOOP_VINFO_COST_MODEL_THRESHOLD. | ||||||
|  | 	* tree-vect-loop.c (vect_analyze_loop_2): Check the maximum number | ||||||
|  | 	of iterations of the loop and see if we should build the epilogue. | ||||||
|  | 
 | ||||||
| 2014-04-03  Richard Biener  <rguenther@suse.de> | 2014-04-03  Richard Biener  <rguenther@suse.de> | ||||||
| 
 | 
 | ||||||
| 	* tree-streamer.h (struct streamer_tree_cache_d): Add next_idx | 	* tree-streamer.h (struct streamer_tree_cache_d): Add next_idx | ||||||
|  |  | ||||||
|  | @ -1,3 +1,8 @@ | ||||||
|  | 2014-04-03  Cong Hou  <congh@google.com> | ||||||
|  | 
 | ||||||
|  | 	PR tree-optimization/60505 | ||||||
|  | 	* gcc.dg/vect/pr60505.c: New test. | ||||||
|  | 
 | ||||||
| 2014-04-03  Richard Biener  <rguenther@suse.de> | 2014-04-03  Richard Biener  <rguenther@suse.de> | ||||||
| 
 | 
 | ||||||
| 	PR tree-optimization/60740 | 	PR tree-optimization/60740 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | /* { dg-do compile } */ | ||||||
|  | /* { dg-additional-options "-Wall -Werror" } */ | ||||||
|  | 
 | ||||||
|  | void foo(char *in, char *out, int num) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |   char ovec[16] = {0}; | ||||||
|  | 
 | ||||||
|  |   for(i = 0; i < num ; ++i) | ||||||
|  |     out[i] = (ovec[i] = in[i]); | ||||||
|  |   out[num] = ovec[num/2]; | ||||||
|  | } | ||||||
|  | @ -933,6 +933,7 @@ new_loop_vec_info (struct loop *loop) | ||||||
|   LOOP_VINFO_NITERS (res) = NULL; |   LOOP_VINFO_NITERS (res) = NULL; | ||||||
|   LOOP_VINFO_NITERS_UNCHANGED (res) = NULL; |   LOOP_VINFO_NITERS_UNCHANGED (res) = NULL; | ||||||
|   LOOP_VINFO_COST_MODEL_MIN_ITERS (res) = 0; |   LOOP_VINFO_COST_MODEL_MIN_ITERS (res) = 0; | ||||||
|  |   LOOP_VINFO_COST_MODEL_THRESHOLD (res) = 0; | ||||||
|   LOOP_VINFO_VECTORIZABLE_P (res) = 0; |   LOOP_VINFO_VECTORIZABLE_P (res) = 0; | ||||||
|   LOOP_VINFO_PEELING_FOR_ALIGNMENT (res) = 0; |   LOOP_VINFO_PEELING_FOR_ALIGNMENT (res) = 0; | ||||||
|   LOOP_VINFO_VECT_FACTOR (res) = 0; |   LOOP_VINFO_VECT_FACTOR (res) = 0; | ||||||
|  | @ -1579,6 +1580,8 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo, bool slp) | ||||||
|           || min_profitable_iters > min_scalar_loop_bound)) |           || min_profitable_iters > min_scalar_loop_bound)) | ||||||
|     th = (unsigned) min_profitable_iters; |     th = (unsigned) min_profitable_iters; | ||||||
| 
 | 
 | ||||||
|  |   LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) = th; | ||||||
|  | 
 | ||||||
|   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) |   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) | ||||||
|       && LOOP_VINFO_INT_NITERS (loop_vinfo) <= th) |       && LOOP_VINFO_INT_NITERS (loop_vinfo) <= th) | ||||||
|     { |     { | ||||||
|  | @ -1625,6 +1628,7 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo) | ||||||
|   bool ok, slp = false; |   bool ok, slp = false; | ||||||
|   int max_vf = MAX_VECTORIZATION_FACTOR; |   int max_vf = MAX_VECTORIZATION_FACTOR; | ||||||
|   int min_vf = 2; |   int min_vf = 2; | ||||||
|  |   unsigned int th; | ||||||
| 
 | 
 | ||||||
|   /* Find all data references in the loop (which correspond to vdefs/vuses)
 |   /* Find all data references in the loop (which correspond to vdefs/vuses)
 | ||||||
|      and analyze their evolution in the loop.  Also adjust the minimal |      and analyze their evolution in the loop.  Also adjust the minimal | ||||||
|  | @ -1769,6 +1773,10 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo) | ||||||
| 
 | 
 | ||||||
|   /* Decide whether we need to create an epilogue loop to handle
 |   /* Decide whether we need to create an epilogue loop to handle
 | ||||||
|      remaining scalar iterations.  */ |      remaining scalar iterations.  */ | ||||||
|  |   th = ((LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) + 1) | ||||||
|  |         / LOOP_VINFO_VECT_FACTOR (loop_vinfo)) | ||||||
|  |        * LOOP_VINFO_VECT_FACTOR (loop_vinfo); | ||||||
|  | 
 | ||||||
|   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) |   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) | ||||||
|       && LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) > 0) |       && LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) > 0) | ||||||
|     { |     { | ||||||
|  | @ -1779,7 +1787,14 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo) | ||||||
|     } |     } | ||||||
|   else if (LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) |   else if (LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) | ||||||
| 	   || (tree_ctz (LOOP_VINFO_NITERS (loop_vinfo)) | 	   || (tree_ctz (LOOP_VINFO_NITERS (loop_vinfo)) | ||||||
| 	       < (unsigned)exact_log2 (LOOP_VINFO_VECT_FACTOR (loop_vinfo)))) | 	       < (unsigned)exact_log2 (LOOP_VINFO_VECT_FACTOR (loop_vinfo)) | ||||||
|  |                /* In case of versioning, check if the maximum number of
 | ||||||
|  |                   iterations is greater than th.  If they are identical, | ||||||
|  |                   the epilogue is unnecessary.  */ | ||||||
|  | 	       && ((!LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo) | ||||||
|  | 	            && !LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT (loop_vinfo)) | ||||||
|  |                    || (unsigned HOST_WIDE_INT)max_stmt_executions_int | ||||||
|  | 		        (LOOP_VINFO_LOOP (loop_vinfo)) > th))) | ||||||
|     LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo) = true; |     LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo) = true; | ||||||
| 
 | 
 | ||||||
|   /* If an epilogue loop is required make sure we can create one.  */ |   /* If an epilogue loop is required make sure we can create one.  */ | ||||||
|  | @ -5775,9 +5790,7 @@ vect_transform_loop (loop_vec_info loop_vinfo) | ||||||
|      by our caller.  If the threshold makes all loops profitable that |      by our caller.  If the threshold makes all loops profitable that | ||||||
|      run at least the vectorization factor number of times checking |      run at least the vectorization factor number of times checking | ||||||
|      is pointless, too.  */ |      is pointless, too.  */ | ||||||
|   th = ((PARAM_VALUE (PARAM_MIN_VECT_LOOP_BOUND) |   th = LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo); | ||||||
| 	 * LOOP_VINFO_VECT_FACTOR (loop_vinfo)) - 1); |  | ||||||
|   th = MAX (th, LOOP_VINFO_COST_MODEL_MIN_ITERS (loop_vinfo)); |  | ||||||
|   if (th >= LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1 |   if (th >= LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1 | ||||||
|       && !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)) |       && !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)) | ||||||
|     { |     { | ||||||
|  |  | ||||||
|  | @ -264,6 +264,11 @@ typedef struct _loop_vec_info { | ||||||
| 	     values unknown at compile time.  */ | 	     values unknown at compile time.  */ | ||||||
|   int min_profitable_iters; |   int min_profitable_iters; | ||||||
| 
 | 
 | ||||||
|  |   /* Threshold of number of iterations below which vectorzation will not be
 | ||||||
|  |      performed. It is calculated from MIN_PROFITABLE_ITERS and | ||||||
|  |      PARAM_MIN_VECT_LOOP_BOUND.  */ | ||||||
|  |   unsigned int th; | ||||||
|  | 
 | ||||||
|   /* Is the loop vectorizable? */ |   /* Is the loop vectorizable? */ | ||||||
|   bool vectorizable; |   bool vectorizable; | ||||||
| 
 | 
 | ||||||
|  | @ -382,6 +387,7 @@ typedef struct _loop_vec_info { | ||||||
|    cost model.  */ |    cost model.  */ | ||||||
| #define LOOP_VINFO_NITERS_UNCHANGED(L)     (L)->num_iters_unchanged | #define LOOP_VINFO_NITERS_UNCHANGED(L)     (L)->num_iters_unchanged | ||||||
| #define LOOP_VINFO_COST_MODEL_MIN_ITERS(L) (L)->min_profitable_iters | #define LOOP_VINFO_COST_MODEL_MIN_ITERS(L) (L)->min_profitable_iters | ||||||
|  | #define LOOP_VINFO_COST_MODEL_THRESHOLD(L) (L)->th | ||||||
| #define LOOP_VINFO_VECTORIZABLE_P(L)       (L)->vectorizable | #define LOOP_VINFO_VECTORIZABLE_P(L)       (L)->vectorizable | ||||||
| #define LOOP_VINFO_VECT_FACTOR(L)          (L)->vectorization_factor | #define LOOP_VINFO_VECT_FACTOR(L)          (L)->vectorization_factor | ||||||
| #define LOOP_VINFO_PTR_MASK(L)             (L)->ptr_mask | #define LOOP_VINFO_PTR_MASK(L)             (L)->ptr_mask | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Cong Hou
						Cong Hou