+This option is disabled by default for most languages, enabled by
+default for languages that use garbage collection.
This is not true as of this patch.
Index: tree-ssa-loop-ivopts.c
===================================================================
--- tree-ssa-loop-ivopts.c (revision 232580)
+++ tree-ssa-loop-ivopts.c (working copy)
@@ -2815,6 +2815,16 @@
struct iv_cand *cand = NULL;
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;
Is there a reason to exclude a candidate if the base is just a pointer
to an object? Or does it just not make a difference?
I feel somewhat uneasy that this probably isn't a full solution either.
But it seems like a reasonable starting point. I'm still not sure we
want to advertise the option to users, as it might overpromise at the
moment. Do we have precedent for internal-only options?
Or maybe we do need some other form to represent the need to keep a
pointer alive in the IL. I suspect that for gcc-6 your patch is probably
reasonable, but we should mark the option as internal and likely to go
away in the future.
Bernd