aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.h
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2019-02-07 23:00:18 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2019-02-07 23:00:18 +0000
commit25b67546a1a5fd49ddcb0a923a8d23d77a91e05f (patch)
tree9669c8a1154a56f24f9d2079c0759f4b6424e0ef /gcc/tree-vectorizer.h
parent8544ed6eea68a80999504c8a4b21b77d29cd86e2 (diff)
downloadgcc-25b67546a1a5fd49ddcb0a923a8d23d77a91e05f.zip
gcc-25b67546a1a5fd49ddcb0a923a8d23d77a91e05f.tar.gz
gcc-25b67546a1a5fd49ddcb0a923a8d23d77a91e05f.tar.bz2
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. From-SVN: r268659
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r--gcc/tree-vectorizer.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index d26b0f8..0e056f3 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -1420,6 +1420,24 @@ extern dump_user_location_t vect_location;
#define DUMP_VECT_SCOPE(MSG) \
AUTO_DUMP_SCOPE (MSG, vect_location)
+/* A sentinel class for ensuring that the "vect_location" global gets
+ reset at the end of a scope.
+
+ The "vect_location" global is used during dumping and contains a
+ location_t, which could contain references to a tree block via the
+ ad-hoc data. This data is used for tracking inlining information,
+ but it's not a GC root; it's simply assumed that such locations never
+ get accessed if the blocks are optimized away.
+
+ Hence we need to ensure that such locations are purged at the end
+ of any operations using them (e.g. via this class). */
+
+class auto_purge_vect_location
+{
+ public:
+ ~auto_purge_vect_location ();
+};
+
/*-----------------------------------------------------------------*/
/* Function prototypes. */
/*-----------------------------------------------------------------*/