Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Successful run of analyzer integration tests on x86_64-pc-linux-gnu.
Pushed to trunk as r16-7364-g87d9a9fd394f3c.

gcc/analyzer/ChangeLog:
        PR analyzer/117491
        * region-model-manager.cc
        (region_model_manager::maybe_fold_repeated_svalue): Don't ICE when
        inner_svalue has null type.

gcc/testsuite/ChangeLog:
        PR analyzer/117491
        * gcc.dg/analyzer/torture/ice-pr117491.c: New test.

Signed-off-by: David Malcolm <[email protected]>
---
 gcc/analyzer/region-model-manager.cc          | 29 ++++++++++---------
 .../gcc.dg/analyzer/torture/ice-pr117491.c    | 10 +++++++
 2 files changed, 25 insertions(+), 14 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/analyzer/torture/ice-pr117491.c

diff --git a/gcc/analyzer/region-model-manager.cc 
b/gcc/analyzer/region-model-manager.cc
index 76ca8348edae..1a2a0c740d09 100644
--- a/gcc/analyzer/region-model-manager.cc
+++ b/gcc/analyzer/region-model-manager.cc
@@ -1065,20 +1065,21 @@ region_model_manager::maybe_fold_repeated_svalue (tree 
type,
 
   /* If INNER_SVALUE is the same size as OUTER_SIZE,
      turn into simply a cast.  */
-  if (tree cst_outer_num_bytes = outer_size->maybe_get_constant ())
-    {
-      HOST_WIDE_INT num_bytes_inner_svalue
-       = int_size_in_bytes (inner_svalue->get_type ());
-      if (num_bytes_inner_svalue != -1)
-       if (num_bytes_inner_svalue
-           == (HOST_WIDE_INT)tree_to_uhwi (cst_outer_num_bytes))
-         {
-           if (type)
-             return get_or_create_cast (type, inner_svalue);
-           else
-             return inner_svalue;
-         }
-    }
+  if (inner_svalue->get_type ())
+    if (tree cst_outer_num_bytes = outer_size->maybe_get_constant ())
+      {
+       HOST_WIDE_INT num_bytes_inner_svalue
+         = int_size_in_bytes (inner_svalue->get_type ());
+       if (num_bytes_inner_svalue != -1)
+         if (num_bytes_inner_svalue
+             == (HOST_WIDE_INT)tree_to_uhwi (cst_outer_num_bytes))
+           {
+             if (type)
+               return get_or_create_cast (type, inner_svalue);
+             else
+               return inner_svalue;
+           }
+      }
 
   /* Handle zero-fill of a specific type.  */
   if (tree cst = inner_svalue->maybe_get_constant ())
diff --git a/gcc/testsuite/gcc.dg/analyzer/torture/ice-pr117491.c 
b/gcc/testsuite/gcc.dg/analyzer/torture/ice-pr117491.c
new file mode 100644
index 000000000000..9ca6c8ebb184
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/torture/ice-pr117491.c
@@ -0,0 +1,10 @@
+short c;
+int x;
+void *d, *s;
+
+void
+foo()
+{
+  __builtin_memset(&c, !x, sizeof c);
+  __builtin_memcpy(d, s, c);
+}
-- 
2.26.3

Reply via email to