aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2021-10-14 10:28:39 +0200
committerAldy Hernandez <aldyh@redhat.com>2021-10-14 14:23:00 +0200
commita311163fd81babd6116e2856f4551c3ca13d8914 (patch)
tree3b5719cf518151424f6bf048a8171b3ef9fd7f20 /gcc
parentd67b22e7315ca7ecfcf5e5ec3d401285d7ea25b5 (diff)
downloadgcc-a311163fd81babd6116e2856f4551c3ca13d8914.zip
gcc-a311163fd81babd6116e2856f4551c3ca13d8914.tar.gz
gcc-a311163fd81babd6116e2856f4551c3ca13d8914.tar.bz2
Do not call range_on_path_entry for SSAs defined within the path
In the path solver, when requesting the range of an SSA for which we know nothing, we ask the ranger for the range incoming to the path. We do this by asking for all the incoming ranges to the path entry block and unioning them. The problem here is that we're asking for a range on path entry for an SSA which *is* defined in the path, but for which we know nothing about: some_global.1_2 = some_global; _3 = (char) some_global.1_2; This request is causing us to ask for range_on_edge of _3 on the incoming edges to the path. This is a bit of nonsensical request because _3 isn't live on entry to the path, so ranger correctly returns UNDEFINED. The proper thing is to avoid asking this in the first place. I have added a relevant assert, since it doesn't make sense to call range_on_path_entry for SSAs defined within the path. Tested on x86-64 Linux. PR tree-optimization/102736 gcc/ChangeLog: PR tree-optimization/102736 * gimple-range-path.cc (path_range_query::range_on_path_entry): Assert that the requested range is defined outside the path. (path_range_query::ssa_range_in_phi): Do not call range_on_path_entry for SSA names that are defined within the path. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr102736.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-path.cc6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr102736.c21
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc
index 422abfd..6942713 100644
--- a/gcc/gimple-range-path.cc
+++ b/gcc/gimple-range-path.cc
@@ -134,6 +134,7 @@ path_range_query::defined_outside_path (tree name)
void
path_range_query::range_on_path_entry (irange &r, tree name)
{
+ gcc_checking_assert (defined_outside_path (name));
int_range_max tmp;
basic_block entry = entry_bb ();
bool changed = false;
@@ -258,7 +259,10 @@ path_range_query::ssa_range_in_phi (irange &r, gphi *phi)
// Using both the range on entry to the path, and the
// range on this edge yields significantly better
// results.
- range_on_path_entry (r, arg);
+ if (defined_outside_path (arg))
+ range_on_path_entry (r, arg);
+ else
+ r.set_varying (TREE_TYPE (name));
m_ranger.range_on_edge (tmp, e_in, arg);
r.intersect (tmp);
return;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr102736.c b/gcc/testsuite/gcc.dg/tree-ssa/pr102736.c
new file mode 100644
index 0000000..7e556f0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr102736.c
@@ -0,0 +1,21 @@
+// { dg-do run }
+// { dg-options "-O1 -ftree-vrp" }
+
+int a, b = -1, c;
+int d = 1;
+static inline char e(char f, int g) { return g ? f : 0; }
+static inline char h(char f) { return f < a ? f : f < a; }
+static inline unsigned char i(unsigned char f, int g) { return g ? f : f > g; }
+void j() {
+L:
+ c = e(1, i(h(b), d));
+ if (b)
+ return;
+ goto L;
+}
+int main() {
+ j();
+ if (c != 1)
+ __builtin_abort ();
+ return 0;
+}