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:
parent
5d70666e4c
commit
1a218fc914
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"} } */
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue