aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2022-06-16 12:44:33 -0400
committerAndrew MacLeod <amacleod@redhat.com>2022-06-16 14:16:19 -0400
commit6c849e2fab3f682b715a81cb4ccc792f20c00eeb (patch)
tree380e12d8d882a331c72e8962d1c04732d5247cc8
parent5b1594dc2d053803ae98ae39f76fbd71f35cb657 (diff)
downloadgcc-6c849e2fab3f682b715a81cb4ccc792f20c00eeb.zip
gcc-6c849e2fab3f682b715a81cb4ccc792f20c00eeb.tar.gz
gcc-6c849e2fab3f682b715a81cb4ccc792f20c00eeb.tar.bz2
Clear invariant bit for inferred ranges.
The range of an invariant SSA (no outgoing edge range anywhere) is not tracked. If an inferred range is registered, remove the invariant flag. * gimple-range-cache.cc (ranger_cache::apply_inferred_ranges): If name was invaraint before, clear the invariant bit. * gimple-range-gori.cc (gori_map::set_range_invariant): Add a flag. * gimple-range-gori.h (gori_map::set_range_invariant): Adjust prototype.
-rw-r--r--gcc/gimple-range-cache.cc7
-rw-r--r--gcc/gimple-range-gori.cc10
-rw-r--r--gcc/gimple-range-gori.h2
3 files changed, 14 insertions, 5 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index f349436..5df7441 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -1474,7 +1474,12 @@ ranger_cache::apply_inferred_ranges (gimple *s)
if (!m_on_entry.get_bb_range (r, name, bb))
exit_range (r, name, bb, RFD_READ_ONLY);
if (r.intersect (infer.range (x)))
- m_on_entry.set_bb_range (name, bb, r);
+ {
+ m_on_entry.set_bb_range (name, bb, r);
+ // If this range was invariant before, remove invariance.
+ if (!m_gori.has_edge_range_p (name))
+ m_gori.set_range_invariant (name, false);
+ }
}
}
}
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index 0a3e54e..a43e44c 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -499,12 +499,16 @@ gori_map::is_export_p (tree name, basic_block bb)
return bitmap_bit_p (exports (bb), SSA_NAME_VERSION (name));
}
-// Clear the m_maybe_variant bit so ranges will not be tracked for NAME.
+// Set or clear the m_maybe_variant bit to determine if ranges will be tracked
+// for NAME. A clear bit means they will NOT be tracked.
void
-gori_map::set_range_invariant (tree name)
+gori_map::set_range_invariant (tree name, bool invariant)
{
- bitmap_clear_bit (m_maybe_variant, SSA_NAME_VERSION (name));
+ if (invariant)
+ bitmap_clear_bit (m_maybe_variant, SSA_NAME_VERSION (name));
+ else
+ bitmap_set_bit (m_maybe_variant, SSA_NAME_VERSION (name));
}
// Return true if NAME is an import to block BB.
diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h
index f5f691f..3d57ab9 100644
--- a/gcc/gimple-range-gori.h
+++ b/gcc/gimple-range-gori.h
@@ -94,7 +94,7 @@ public:
bool is_import_p (tree name, basic_block bb);
bitmap exports (basic_block bb);
bitmap imports (basic_block bb);
- void set_range_invariant (tree name);
+ void set_range_invariant (tree name, bool invariant = true);
void dump (FILE *f);
void dump (FILE *f, basic_block bb, bool verbose = true);