When we analyzed a loop as epilogue but later in peeling decide
we're not going to use it then in the DTOR we clear the original
loops ->aux which causes us to leak the main loop vinfo.

Fixed by only clearing aux if it is associated with the vinfo
we're destroying.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

2021-02-10  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/99024
        * tree-vect-loop.c (_loop_vec_info::~_loop_vec_info): Only
        clear loop->aux if it is associated with the destroyed loop_vinfo.
---
 gcc/tree-vect-loop.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index f1f16e3b1b9..27845c01430 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -927,7 +927,11 @@ _loop_vec_info::~_loop_vec_info ()
   delete scan_map;
   epilogue_vinfos.release ();
 
-  loop->aux = NULL;
+  /* When we release an epiloge vinfo that we do not intend to use
+     avoid clearing AUX of the main loop which should continue to
+     point to the main loop vinfo since otherwise we'll leak that.  */
+  if (loop->aux == this)
+    loop->aux = NULL;
 }
 
 /* Return an invariant or register for EXPR and emit necessary
-- 
2.26.2

Reply via email to