Commit 1e6d3b10 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/84272 (AddressSanitizer: heap-use-after-free…

re PR target/84272 (AddressSanitizer: heap-use-after-free ../../gcc/config/aarch64/cortex-a57-fma-steering.c:519 in fma_node::get_parity())

	PR target/84272
	* config/aarch64/cortex-a57-fma-steering.c (fma_forest::merge_forest):
	Use ++iter rather than iter++ for std::list iterators.
	(func_fma_steering::dfs): Likewise.  Don't delete nodes right away,
	defer deleting them until all nodes in the forest are processed.  Do
	free even leaf nodes.  Change to_process into auto_vec.

	* g++.dg/opt/pr84272.C: New test.

From-SVN: r257727
parent ab67039c
2018-02-16 Jakub Jelinek <jakub@redhat.com>
PR target/84272
* config/aarch64/cortex-a57-fma-steering.c (fma_forest::merge_forest):
Use ++iter rather than iter++ for std::list iterators.
(func_fma_steering::dfs): Likewise. Don't delete nodes right away,
defer deleting them until all nodes in the forest are processed. Do
free even leaf nodes. Change to_process into auto_vec.
PR bootstrap/84405
* system.h (BROKEN_VALUE_INITIALIZATION): Define for GCC < 4.3.
* vec.h (vec_default_construct): Use memset instead of placement new
......
......@@ -406,7 +406,7 @@ fma_forest::merge_forest (fma_forest *other_forest)
/* 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
......@@ -847,14 +847,13 @@ func_fma_steering::dfs (void (*process_forest) (fma_forest *),
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;
......@@ -863,7 +862,7 @@ func_fma_steering::dfs (void (*process_forest) (fma_forest *),
/* 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);
......@@ -881,28 +880,30 @@ func_fma_steering::dfs (void (*process_forest) (fma_forest *),
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++)
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. */
......
2018-02-16 Jakub Jelinek <jakub@redhat.com>
PR target/84272
* g++.dg/opt/pr84272.C: New test.
PR rtl-optimization/83723
* gcc.dg/pr83723.c: New test.
......
// PR target/84272
// { dg-do compile }
// { dg-options "-O2" }
// { dg-additional-options "-march=armv8-a -mtune=cortex-a57" { target aarch64-*-* } }
struct A
{
float b, c;
A ();
A (float, float, float);
float operator * (A)
{
float d = b * b + c * c;
return d;
}
};
void
foo ()
{
A g[1];
A h (0, 0, h * g[2]);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment