common.opt (fkeep-gc-roots-live): New undocumented option.

gcc/:
	* common.opt (fkeep-gc-roots-live): New undocumented option.
	* tree-ssa-loop-ivopts.c (add_candidate_1): If
	-fkeep-gc-roots-live, skip pointers.
	(add_iv_candidate_for_biv): Handle add_candidate_1 returning
	NULL.

gcc/testsuite/:
	* gcc.dg/tree-ssa/ivopt_5.c: New test.

From-SVN: r232888
This commit is contained in:
Ian Lance Taylor 2016-01-27 17:42:47 +00:00 committed by Ian Lance Taylor
parent 5d70666e4c
commit 1a218fc914
5 changed files with 54 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2016-01-27 Ian Lance Taylor <iant@google.com>
* common.opt (fkeep-gc-roots-live): New undocumented option.
* tree-ssa-loop-ivopts.c (add_candidate_1): If
-fkeep-gc-roots-live, skip pointers.
(add_iv_candidate_for_biv): Handle add_candidate_1 returning
NULL.
2016-01-27 Uros Bizjak <ubizjak@gmail.com> 2016-01-27 Uros Bizjak <ubizjak@gmail.com>
PR target/69512 PR target/69512

View File

@ -1380,6 +1380,10 @@ Common Report Var(flag_hoist_adjacent_loads) Optimization
Enable hoisting adjacent loads to encourage generating conditional move Enable hoisting adjacent loads to encourage generating conditional move
instructions. instructions.
fkeep-gc-roots-live
Common Undocumented Report Var(flag_keep_gc_roots_live) Optimization
; Always keep a pointer to a live memory block
floop-parallelize-all floop-parallelize-all
Common Report Var(flag_loop_parallelize_all) Optimization Common Report Var(flag_loop_parallelize_all) Optimization
Mark all loops as parallel. Mark all loops as parallel.

View File

@ -1,3 +1,7 @@
2016-01-27 Ian Lance Taylor <iant@google.com>
* gcc.dg/tree-ssa/ivopt_5.c: New test.
2016-01-27 Ryan Burn <contact@rnburn.com> 2016-01-27 Ryan Burn <contact@rnburn.com>
PR cilkplus/69267 PR cilkplus/69267

View File

@ -0,0 +1,23 @@
/* { dg-options "-O2 -fdump-tree-ivopts -fkeep-gc-roots-live" } */
/* Only integer ivopts here when using -fkeep-gc-roots-live. */
void foo (char *pstart, int n)
{
char *p;
char *pend = pstart + n;
for (p = pstart; p < pend; p++)
*p = 1;
}
void foo1 (char *pstart, int n)
{
char *p;
char *pend = pstart + n;
for (p = pstart; p != pend; p++)
*p = 1;
}
/* { dg-final { scan-tree-dump-times "ivtmp.\[0-9_\]* = PHI <\[^0\]" 0 "ivopts"} } */

View File

@ -2815,6 +2815,16 @@ add_candidate_1 (struct ivopts_data *data,
struct iv_cand *cand = NULL; struct iv_cand *cand = NULL;
tree type, orig_type; tree type, orig_type;
/* -fkeep-gc-roots-live means that we have to keep a real pointer
live, but the ivopts code may replace a real pointer with one
pointing before or after the memory block that is then adjusted
into the memory block during the loop. FIXME: It would likely be
better to actually force the pointer live and still use ivopts;
for example, it would be enough to write the pointer into memory
and keep it there until after the loop. */
if (flag_keep_gc_roots_live && POINTER_TYPE_P (TREE_TYPE (base)))
return NULL;
/* For non-original variables, make sure their values are computed in a type /* For non-original variables, make sure their values are computed in a type
that does not invoke undefined behavior on overflows (since in general, that does not invoke undefined behavior on overflows (since in general,
we cannot prove that these induction variables are non-wrapping). */ we cannot prove that these induction variables are non-wrapping). */
@ -3083,8 +3093,11 @@ add_iv_candidate_for_biv (struct ivopts_data *data, struct iv *iv)
cand = add_candidate_1 (data, cand = add_candidate_1 (data,
iv->base, iv->step, true, IP_ORIGINAL, NULL, iv->base, iv->step, true, IP_ORIGINAL, NULL,
SSA_NAME_DEF_STMT (def)); SSA_NAME_DEF_STMT (def));
cand->var_before = iv->ssa_name; if (cand)
cand->var_after = def; {
cand->var_before = iv->ssa_name;
cand->var_after = def;
}
} }
else else
gcc_assert (gimple_bb (phi) == data->current_loop->header); gcc_assert (gimple_bb (phi) == data->current_loop->header);