aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2025-05-02 15:48:08 -0400
committerAndrew MacLeod <amacleod@redhat.com>2025-05-05 11:13:18 -0400
commit7f285b7ad7cb89a9b29b52e0d25a7666dc9bd645 (patch)
tree67b9a76ea5b6f9091b10cf96c4172b2f70a49e83
parentfcc74146e3e0bfd30f9ccc12359991d73fe928f9 (diff)
downloadgcc-7f285b7ad7cb89a9b29b52e0d25a7666dc9bd645.zip
gcc-7f285b7ad7cb89a9b29b52e0d25a7666dc9bd645.tar.gz
gcc-7f285b7ad7cb89a9b29b52e0d25a7666dc9bd645.tar.bz2
Allow IPA_CP to handle UNDEFINED as VARYING.
When applying a bitmask to reflect ranges, it is sometimes deferred and this can result in an UNDEFINED result. IPA is not expecting this, and add a check for it, and convert to VARYING if encountered. PR tree-optimization/120048 gcc/ * ipa-cp.cc (ipcp_store_vr_results): Check for UNDEFINED. gcc/testsuite/ * gcc.dg/pr120048.c: New.
-rw-r--r--gcc/ipa-cp.cc10
-rw-r--r--gcc/testsuite/gcc.dg/pr120048.c12
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
index f7e5aa9..b41148c 100644
--- a/gcc/ipa-cp.cc
+++ b/gcc/ipa-cp.cc
@@ -6362,6 +6362,11 @@ ipcp_store_vr_results (void)
TYPE_PRECISION (type),
TYPE_SIGN (type)));
tmp.update_bitmask (bm);
+ // Reflecting the bitmask on the ranges can sometime
+ // produce an UNDEFINED value if the the bitmask update
+ // was previously deferred. See PR 120048.
+ if (tmp.undefined_p ())
+ tmp.set_varying (type);
ipa_vr vr (tmp);
ts->m_vr->quick_push (vr);
}
@@ -6383,6 +6388,11 @@ ipcp_store_vr_results (void)
TYPE_PRECISION (type),
TYPE_SIGN (type)));
tmp.update_bitmask (bm);
+ // Reflecting the bitmask on the ranges can sometime
+ // produce an UNDEFINED value if the the bitmask update
+ // was previously deferred. See PR 120048.
+ if (tmp.undefined_p ())
+ tmp.set_varying (type);
ipa_vr vr (tmp);
ts->m_vr->quick_push (vr);
}
diff --git a/gcc/testsuite/gcc.dg/pr120048.c b/gcc/testsuite/gcc.dg/pr120048.c
new file mode 100644
index 0000000..6bb34b0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr120048.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-vrp -fno-tree-fre" } */
+
+int a, b, c;
+static int d(short e) { return e || (a && e) ? 0 : a; }
+static void f(int e) {
+ if (!e) {
+ d(0);
+ b = d(e);
+ }
+}
+int main() { f(c | 1); }