aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2023-05-03 17:29:24 +0200
committerAldy Hernandez <aldyh@redhat.com>2023-05-03 19:15:51 +0200
commit2b8a27634f5d28e3e7c4a08bf065f2daada7aed2 (patch)
treedb6b1153e7ddd638f5512cda09beccab20abafef /gcc
parentcef0c0bb13e2953b41caca0506ab1d41c56f29de (diff)
downloadgcc-2b8a27634f5d28e3e7c4a08bf065f2daada7aed2.zip
gcc-2b8a27634f5d28e3e7c4a08bf065f2daada7aed2.tar.gz
gcc-2b8a27634f5d28e3e7c4a08bf065f2daada7aed2.tar.bz2
Allow varying ranges of unknown types in irange::verify_range [PR109711]
The old legacy code allowed building ranges of unknown types so passes like IPA could build and propagate VARYING. For now it's easiest to allow the old behavior, it's not like you can do anything with these ranges except build them and copy them. Eventually we should convert all users of set_varying() to use supported types. I will address this in my upcoming IPA work. PR tree-optimization/109711 gcc/ChangeLog: * value-range.cc (irange::verify_range): Allow types of error_mark_node.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr109711-1.c16
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr109711-2.c24
-rw-r--r--gcc/value-range.cc7
3 files changed, 47 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109711-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109711-1.c
new file mode 100644
index 0000000..8177750
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109711-1.c
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+void lspf2lpc();
+
+void interpolate_lpc(int subframe_num) {
+ float weight = 0.25 * subframe_num + 1;
+ if (weight)
+ lspf2lpc();
+}
+
+void qcelp_decode_frame() {
+ int i;
+ for (;; i++)
+ interpolate_lpc(i);
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109711-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109711-2.c
new file mode 100644
index 0000000..f80bb1a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109711-2.c
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+void lspf2lpc();
+
+int interpolate_lpc_q_0;
+
+void
+interpolate_lpc(int subframe_num) {
+ float weight;
+ if (interpolate_lpc_q_0)
+ weight = subframe_num;
+ else
+ weight = 1.0;
+ if (weight != 1.0)
+ lspf2lpc();
+}
+
+void
+qcelp_decode_frame() {
+ int i;
+ for (;; i++)
+ interpolate_lpc(i);
+}
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index 655ffc2..def9299d 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -1057,6 +1057,13 @@ irange::verify_range ()
return;
}
gcc_checking_assert (m_num_ranges <= m_max_ranges);
+
+ // Legacy allowed these to represent VARYING for unknown types.
+ // Leave this in for now, until all users are converted. Eventually
+ // we should abort in set_varying.
+ if (m_kind == VR_VARYING && m_type == error_mark_node)
+ return;
+
unsigned prec = TYPE_PRECISION (m_type);
if (m_kind == VR_VARYING)
{