diff options
author | Jakub Jelinek <jakub@redhat.com> | 2023-11-13 08:47:41 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2023-11-13 08:47:41 +0100 |
commit | 5a0c302d2d721b9650c1e354695dbba87364c334 (patch) | |
tree | 54a2090d985c3112e9c70020e2479e03cbea8bf5 /gcc/gimple-range-cache.cc | |
parent | 2e0a1f778cafd164f8205ff3204a6076ffef0c77 (diff) | |
download | gcc-5a0c302d2d721b9650c1e354695dbba87364c334.zip gcc-5a0c302d2d721b9650c1e354695dbba87364c334.tar.gz gcc-5a0c302d2d721b9650c1e354695dbba87364c334.tar.bz2 |
gimple-range-cache: Fix ICEs when dumping details [PR111967]
The following testcase ICEs when dumping details.
When m_ssa_ranges vector is created, it is safe_grow_cleared (num_ssa_names),
but when when some new SSA_NAME is added, we strangely grow it to
num_ssa_names + 1 instead and later on the 3 argument dump method
iterates from 1 to m_ssa_ranges.length () - 1 and uses ssa_name (x)
on each; but because set_bb_range grew it one too much, ssa_name
(m_ssa_ranges.length () - 1) might be after the end of the ssanames
vector and ICE.
The fix grows the vector consistently only to num_ssa_names,
doesn't waste time checking m_ssa_ranges[0] because there is no
ssa_names (0), it is always NULL, before using ssa_name (x) checks
if we'll need it at all (we check later if m_ssa_ranges[x] is non-NULL,
so we might check it earlier as well) and also in the last loop
iterates until m_ssa_ranges.length () rather than num_ssa_names, I don't
see a reason for the inconsistency and in theory some SSA_NAME could be
added without set_bb_range called for it and the vector could be shorter
than the ssanames vector.
To actually fix the ICE, either the first hunk or the last 2 hunks
would be enough, but I think it doesn't hurt to change all the spots.
2023-11-13 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/111967
* gimple-range-cache.cc (block_range_cache::set_bb_range): Grow
m_ssa_ranges to num_ssa_names rather than num_ssa_names + 1.
(block_range_cache::dump): Iterate from 1 rather than 0. Don't use
ssa_name (x) unless m_ssa_ranges[x] is non-NULL. Iterate to
m_ssa_ranges.length () rather than num_ssa_names.
* gcc.dg/tree-ssa/pr111967.c: New test.
Diffstat (limited to 'gcc/gimple-range-cache.cc')
-rw-r--r-- | gcc/gimple-range-cache.cc | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index 89c0845..001e12f 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -390,7 +390,7 @@ block_range_cache::set_bb_range (tree name, const_basic_block bb, { unsigned v = SSA_NAME_VERSION (name); if (v >= m_ssa_ranges.length ()) - m_ssa_ranges.safe_grow_cleared (num_ssa_names + 1); + m_ssa_ranges.safe_grow_cleared (num_ssa_names); if (!m_ssa_ranges[v]) { @@ -465,7 +465,7 @@ void block_range_cache::dump (FILE *f) { unsigned x; - for (x = 0; x < m_ssa_ranges.length (); ++x) + for (x = 1; x < m_ssa_ranges.length (); ++x) { if (m_ssa_ranges[x]) { @@ -487,11 +487,14 @@ block_range_cache::dump (FILE *f, basic_block bb, bool print_varying) bool summarize_varying = false; for (x = 1; x < m_ssa_ranges.length (); ++x) { + if (!m_ssa_ranges[x]) + continue; + if (!gimple_range_ssa_p (ssa_name (x))) continue; Value_Range r (TREE_TYPE (ssa_name (x))); - if (m_ssa_ranges[x] && m_ssa_ranges[x]->get_bb_range (r, bb)) + if (m_ssa_ranges[x]->get_bb_range (r, bb)) { if (!print_varying && r.varying_p ()) { @@ -508,13 +511,16 @@ block_range_cache::dump (FILE *f, basic_block bb, bool print_varying) if (summarize_varying) { fprintf (f, "VARYING_P on entry : "); - for (x = 1; x < num_ssa_names; ++x) + for (x = 1; x < m_ssa_ranges.length (); ++x) { + if (!m_ssa_ranges[x]) + continue; + if (!gimple_range_ssa_p (ssa_name (x))) continue; Value_Range r (TREE_TYPE (ssa_name (x))); - if (m_ssa_ranges[x] && m_ssa_ranges[x]->get_bb_range (r, bb)) + if (m_ssa_ranges[x]->get_bb_range (r, bb)) { if (r.varying_p ()) { |