From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2209) id 322623857365; Thu, 28 Apr 2022 21:43:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 322623857365 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: David Malcolm To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-9950] analyzer: fix ICEs on complex constants [PR105365, 105366] X-Act-Checkin: gcc X-Git-Author: David Malcolm X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 03e7ac9021361cfee6cb55ca08638bbb0dab12a9 X-Git-Newrev: 7f6033735bf5174f19ef0ab8efd92b075bcb277d Message-Id: <20220428214338.322623857365@sourceware.org> Date: Thu, 28 Apr 2022 21:43:38 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Apr 2022 21:43:38 -0000 https://gcc.gnu.org/g:7f6033735bf5174f19ef0ab8efd92b075bcb277d commit r11-9950-g7f6033735bf5174f19ef0ab8efd92b075bcb277d Author: David Malcolm Date: Thu Apr 28 17:42:44 2022 -0400 analyzer: fix ICEs on complex constants [PR105365,105366] gcc/analyzer/ChangeLog: PR analyzer/105365 PR analyzer/105366 * svalue.cc (cmp_cst): Rename to... (cmp_csts_same_type): ...this. Convert all recursive calls to calls to... (cmp_csts_and_types): ....this new function. (svalue::cmp_ptr): Update for renaming of cmp_cst gcc/testsuite/ChangeLog: PR analyzer/105365 PR analyzer/105366 * gcc.dg/analyzer/pr105365.c: New test. * gcc.dg/analyzer/pr105366.c: New test. Signed-off-by: David Malcolm Diff: --- gcc/analyzer/svalue.cc | 30 +++++++++++++++++++++--------- gcc/testsuite/gcc.dg/analyzer/pr105365.c | 17 +++++++++++++++++ gcc/testsuite/gcc.dg/analyzer/pr105366.c | 19 +++++++++++++++++++ 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/gcc/analyzer/svalue.cc b/gcc/analyzer/svalue.cc index 79e92cfdda4..fa33e956d41 100644 --- a/gcc/analyzer/svalue.cc +++ b/gcc/analyzer/svalue.cc @@ -59,6 +59,8 @@ along with GCC; see the file COPYING3. If not see namespace ana { +static int cmp_csts_and_types (const_tree cst1, const_tree cst2); + /* class svalue and its various subclasses. */ /* class svalue. */ @@ -276,7 +278,7 @@ svalue::implicitly_live_p (const svalue_set *, const region_model *) const of the same type. */ static int -cmp_cst (const_tree cst1, const_tree cst2) +cmp_csts_same_type (const_tree cst1, const_tree cst2) { gcc_assert (TREE_TYPE (cst1) == TREE_TYPE (cst2)); gcc_assert (TREE_CODE (cst1) == TREE_CODE (cst2)); @@ -295,9 +297,10 @@ cmp_cst (const_tree cst1, const_tree cst2) TREE_REAL_CST_PTR (cst2), sizeof (real_value)); case COMPLEX_CST: - if (int cmp_real = cmp_cst (TREE_REALPART (cst1), TREE_REALPART (cst2))) + if (int cmp_real = cmp_csts_and_types (TREE_REALPART (cst1), + TREE_REALPART (cst2))) return cmp_real; - return cmp_cst (TREE_IMAGPART (cst1), TREE_IMAGPART (cst2)); + return cmp_csts_and_types (TREE_IMAGPART (cst1), TREE_IMAGPART (cst2)); case VECTOR_CST: if (int cmp_log2_npatterns = ((int)VECTOR_CST_LOG2_NPATTERNS (cst1) @@ -312,17 +315,26 @@ cmp_cst (const_tree cst1, const_tree cst2) { const_tree elt1 = VECTOR_CST_ENCODED_ELT (cst1, i); const_tree elt2 = VECTOR_CST_ENCODED_ELT (cst2, i); - int t1 = TYPE_UID (TREE_TYPE (elt1)); - int t2 = TYPE_UID (TREE_TYPE (elt2)); - if (int cmp_type = t1 - t2) - return cmp_type; - if (int el_cmp = cmp_cst (elt1, elt2)) + if (int el_cmp = cmp_csts_and_types (elt1, elt2)) return el_cmp; } return 0; } } +/* Comparator for imposing a deterministic order on constants that might + not be of the same type. */ + +static int +cmp_csts_and_types (const_tree cst1, const_tree cst2) +{ + int t1 = TYPE_UID (TREE_TYPE (cst1)); + int t2 = TYPE_UID (TREE_TYPE (cst2)); + if (int cmp_type = t1 - t2) + return cmp_type; + return cmp_csts_same_type (cst1, cst2); +} + /* Comparator for imposing a deterministic order on svalues. */ int @@ -354,7 +366,7 @@ svalue::cmp_ptr (const svalue *sval1, const svalue *sval2) const constant_svalue *constant_sval2 = (const constant_svalue *)sval2; const_tree cst1 = constant_sval1->get_constant (); const_tree cst2 = constant_sval2->get_constant (); - return cmp_cst (cst1, cst2); + return cmp_csts_same_type (cst1, cst2); } break; case SK_UNKNOWN: diff --git a/gcc/testsuite/gcc.dg/analyzer/pr105365.c b/gcc/testsuite/gcc.dg/analyzer/pr105365.c new file mode 100644 index 00000000000..aa576d08632 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr105365.c @@ -0,0 +1,17 @@ +/* { dg-require-effective-target int128 } */ + +typedef _Float32 f32; +typedef _Complex _Float32 cf32; +_Float32 g; +__int128 i; + +extern void bar(int); + +void +foo(_Float32 k) { + f32 f = 0; + f /= (_Complex char)__builtin_llround(g); + k /= (cf32)__builtin_copysignf(0, i); + bar(f + k); + foo(0); +} diff --git a/gcc/testsuite/gcc.dg/analyzer/pr105366.c b/gcc/testsuite/gcc.dg/analyzer/pr105366.c new file mode 100644 index 00000000000..3dba870e4e9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr105366.c @@ -0,0 +1,19 @@ +/* { dg-require-effective-target int128 } */ +/* { dg-additional-options "-O" } */ + +extern void bar(int); +extern void baz(void); + +typedef unsigned u32; + +void +foo(u32 u, __int128 i) { + baz(); + _Complex int c = i; + c /= (u32)(__UINTPTR_TYPE__)foo; + short s = (short)(__UINTPTR_TYPE__)foo; + u /= (_Complex short)s; + u32 r = u + c; + bar(r); + foo(0, 0); +}