analyzer: fix ICE on vector comparisons [PR96713]
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 19 Aug 2020 21:36:53 +0000 (17:36 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Thu, 20 Aug 2020 01:18:30 +0000 (21:18 -0400)
gcc/analyzer/ChangeLog:
PR analyzer/96713
* region-model.cc (region_model::get_gassign_result): For
comparisons, only use eval_condition when the lhs has boolean
type, and use get_or_create_constant_svalue on the boolean
constants directly rather than via get_rvalue.

gcc/testsuite/ChangeLog:
PR analyzer/96713
* gcc.dg/analyzer/pr96713.c: New test.

gcc/analyzer/region-model.cc
gcc/testsuite/gcc.dg/analyzer/pr96713.c [new file with mode: 0644]

index 8a5e74e..b8a0f9f 100644 (file)
@@ -462,24 +462,23 @@ region_model::get_gassign_result (const gassign *assign,
       {
        tree rhs2 = gimple_assign_rhs2 (assign);
 
-       // TODO: constraints between svalues
        const svalue *rhs1_sval = get_rvalue (rhs1, ctxt);
        const svalue *rhs2_sval = get_rvalue (rhs2, ctxt);
 
-       tristate t = eval_condition (rhs1_sval, op, rhs2_sval);
-       if (t.is_known ())
-         return get_rvalue (t.is_true ()
-                            ? boolean_true_node
-                            : boolean_false_node,
-                            ctxt);
-       else
+       if (TREE_TYPE (lhs) == boolean_type_node)
          {
-           // TODO: symbolic value for binop
-           const svalue *sval_binop
-             = m_mgr->get_or_create_binop (TREE_TYPE (lhs), op,
-                                           rhs1_sval, rhs2_sval);
-           return sval_binop;
+           /* Consider constraints between svalues.  */
+           tristate t = eval_condition (rhs1_sval, op, rhs2_sval);
+           if (t.is_known ())
+             return m_mgr->get_or_create_constant_svalue
+               (t.is_true () ? boolean_true_node : boolean_false_node);
          }
+
+       /* Otherwise, generate a symbolic binary op.  */
+       const svalue *sval_binop
+         = m_mgr->get_or_create_binop (TREE_TYPE (lhs), op,
+                                       rhs1_sval, rhs2_sval);
+       return sval_binop;
       }
       break;
 
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr96713.c b/gcc/testsuite/gcc.dg/analyzer/pr96713.c
new file mode 100644 (file)
index 0000000..fe9cafd
--- /dev/null
@@ -0,0 +1,8 @@
+typedef int __attribute__ ((vector_size (8))) V;
+
+void
+foo (V d, V e)
+{
+  d <= e;
+  foo ((V){}, (V){});
+}