analyzer: fix ICE on unhandled tree codes in gassign [PR96640]
authorDavid Malcolm <dmalcolm@redhat.com>
Mon, 17 Aug 2020 15:53:45 +0000 (11:53 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Tue, 18 Aug 2020 00:45:53 +0000 (20:45 -0400)
PR analyzer/96640 reports a ICE within region_model::on_assignment when
failing to handle a WIDEN_MULT_EVEN_EXPR, and various other tree codes.

The old implementation of region_model::on_assignment gracefully handled
tree codes it didn't understand, returning "UNKNOWN", whereas the new
implementation (r11-2694-g808f4dfeb3a95f50f15e71148e5c1067f90a126d) had
a "sorry_at" and an assertion left over from development, leading to ICEs.

This patch restores the old behavior for these cases, and marks various
vector operations as leading to unknown results.

gcc/analyzer/ChangeLog:
PR analyzer/96640
* region-model.cc (region_model::get_gassign_result): Handle various
VEC_* tree codes by returning UNKNOWN.
(region_model::on_assignment): Handle unrecognized tree codes by
setting lhs to an unknown value, rather than issuing a "sorry" and
asserting.

gcc/analyzer/region-model.cc

index 3c7ea40..cd74c0f 100644 (file)
@@ -526,6 +526,22 @@ region_model::get_gassign_result (const gassign *assign,
     case VEC_SERIES_EXPR:
     case VEC_COND_EXPR:
     case VEC_PERM_EXPR:
+    case VEC_WIDEN_MULT_HI_EXPR:
+    case VEC_WIDEN_MULT_LO_EXPR:
+    case VEC_WIDEN_MULT_EVEN_EXPR:
+    case VEC_WIDEN_MULT_ODD_EXPR:
+    case VEC_UNPACK_HI_EXPR:
+    case VEC_UNPACK_LO_EXPR:
+    case VEC_UNPACK_FLOAT_HI_EXPR:
+    case VEC_UNPACK_FLOAT_LO_EXPR:
+    case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
+    case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
+    case VEC_PACK_TRUNC_EXPR:
+    case VEC_PACK_SAT_EXPR:
+    case VEC_PACK_FIX_TRUNC_EXPR:
+    case VEC_PACK_FLOAT_EXPR:
+    case VEC_WIDEN_LSHIFT_HI_EXPR:
+    case VEC_WIDEN_LSHIFT_LO_EXPR:
       return m_mgr->get_or_create_unknown_svalue (TREE_TYPE (lhs));
     }
 }
@@ -555,10 +571,12 @@ region_model::on_assignment (const gassign *assign, region_model_context *ctxt)
     {
     default:
       {
-       if (1)
+       if (0)
          sorry_at (assign->location, "unhandled assignment op: %qs",
                    get_tree_code_name (op));
-       gcc_unreachable ();
+       const svalue *unknown_sval
+         = m_mgr->get_or_create_unknown_svalue (TREE_TYPE (lhs));
+       set_value (lhs_reg, unknown_sval, ctxt);
       }
       break;