https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86637

--- Comment #13 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Author: dmalcolm
Date: Thu Feb  7 23:00:18 2019
New Revision: 268659

URL: https://gcc.gnu.org/viewcvs?rev=268659&root=gcc&view=rev
Log:
Fix more ICEs in -fsave-optimization-record (PR tree-optimization/89235)

PR tree-optimization/89235 reports an ICE inside -fsave-optimization-record
whilst reporting the inlining chain of of the location_t in the
vect_location global.

This is very similar to PR tree-optimization/86637, fixed in r266821.

The issue is that the inlining chains are read from the location_t's
ad-hoc data, referencing GC-managed tree blocks, but the former are
not GC roots; it's simply assumed that old locations referencing dead
blocks never get used again.

The fix is to reset the "vect_location" global in more places.  Given
that is a somewhat subtle detail, the patch adds a sentinel class to
reset vect_location at the end of a scope.  Doing it as a class
simplifies the task of ensuring that the global is reset on every
exit path from a function, and also gives a good place to signpost
the above subtlety (in the documentation for the class).

The patch also adds test cases for both of the PRs mentioned above.

gcc/testsuite/ChangeLog:
        PR tree-optimization/86637
        PR tree-optimization/89235
        * gcc.c-torture/compile/pr86637-1.c: New test.
        * gcc.c-torture/compile/pr86637-2.c: New test.
        * gcc.c-torture/compile/pr86637-3.c: New test.
        * gcc.c-torture/compile/pr89235.c: New test.

gcc/ChangeLog:
        PR tree-optimization/86637
        PR tree-optimization/89235
        * tree-vect-loop.c (optimize_mask_stores): Add an
        auto_purge_vect_location sentinel to ensure that vect_location is
        purged on exit.
        * tree-vectorizer.c
        (auto_purge_vect_location::~auto_purge_vect_location): New dtor.
        (try_vectorize_loop_1): Add an auto_purge_vect_location sentinel
        to ensure that vect_location is purged on exit.
        (pass_slp_vectorize::execute): Likewise, replacing the manual
        reset.
        * tree-vectorizer.h (class auto_purge_vect_location): New class.


Added:
    trunk/gcc/testsuite/gcc.c-torture/compile/pr86637-1.c
    trunk/gcc/testsuite/gcc.c-torture/compile/pr86637-2.c
    trunk/gcc/testsuite/gcc.c-torture/compile/pr86637-3.c
    trunk/gcc/testsuite/gcc.c-torture/compile/pr89235.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-vect-loop.c
    trunk/gcc/tree-vectorizer.c
    trunk/gcc/tree-vectorizer.h

Reply via email to