Mercurial > hg > CbC > CbC_gcc
diff gcc/config/aarch64/cortex-a57-fma-steering.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/config/aarch64/cortex-a57-fma-steering.c Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/config/aarch64/cortex-a57-fma-steering.c Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ /* FMA steering optimization pass for Cortex-A57. - Copyright (C) 2015-2017 Free Software Foundation, Inc. + Copyright (C) 2015-2018 Free Software Foundation, Inc. Contributed by ARM Ltd. This file is part of GCC. @@ -18,6 +18,8 @@ along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>. */ +#define IN_TARGET_CODE 1 + #include "config.h" #define INCLUDE_LIST #include "system.h" @@ -404,7 +406,7 @@ /* Update root nodes' pointer to forest. */ for (other_root_iter = other_roots->begin (); - other_root_iter != other_roots->end (); other_root_iter++) + other_root_iter != other_roots->end (); ++other_root_iter) (*other_root_iter)->set_forest (this); /* Remove other_forest from the list of forests and move its tree roots in @@ -845,14 +847,13 @@ void (*process_node) (fma_forest *, fma_node *), bool free) { - vec<fma_node *> to_process; + auto_vec<fma_node *> to_process; + auto_vec<fma_node *> to_free; std::list<fma_forest *>::iterator forest_iter; - to_process.create (0); - /* For each forest. */ for (forest_iter = this->m_fma_forests.begin (); - forest_iter != this->m_fma_forests.end (); forest_iter++) + forest_iter != this->m_fma_forests.end (); ++forest_iter) { std::list<fma_root_node *>::iterator root_iter; @@ -861,7 +862,7 @@ /* For each tree root in this forest. */ for (root_iter = (*forest_iter)->get_roots ()->begin (); - root_iter != (*forest_iter)->get_roots ()->end (); root_iter++) + root_iter != (*forest_iter)->get_roots ()->end (); ++root_iter) { if (process_root) process_root (*forest_iter, *root_iter); @@ -879,28 +880,30 @@ if (process_node) process_node (*forest_iter, node); - /* Absence of children might indicate an alternate root of a *chain*. - It's ok to skip it here as the chain will be renamed when - processing the canonical root for that chain. */ - if (node->get_children ()->empty ()) - continue; + for (child_iter = node->get_children ()->begin (); + child_iter != node->get_children ()->end (); ++child_iter) + to_process.safe_push (*child_iter); - for (child_iter = node->get_children ()->begin (); - child_iter != node->get_children ()->end (); child_iter++) - to_process.safe_push (*child_iter); + /* Defer freeing so that the process_node callback can access the + parent and children of the node being processed. */ if (free) + to_free.safe_push (node); + } + + if (free) + { + delete *forest_iter; + + while (!to_free.is_empty ()) { + fma_node *node = to_free.pop (); if (node->root_p ()) delete static_cast<fma_root_node *> (node); else delete node; } } - if (free) - delete *forest_iter; } - - to_process.release (); } /* Build the dependency trees of FMUL and FMADD/FMSUB instructions. */