aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-08-19 17:36:53 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-08-19 21:18:30 -0400
commit2f5951bd95e334d611f4be7bbe1a136c580f9c20 (patch)
treed8b4686beed979d3f49d0f6bc2ae610d53198b16
parent04e23a4051fb3c049f85b9e6e2fc58f937337aff (diff)
downloadgcc-2f5951bd95e334d611f4be7bbe1a136c580f9c20.zip
gcc-2f5951bd95e334d611f4be7bbe1a136c580f9c20.tar.gz
gcc-2f5951bd95e334d611f4be7bbe1a136c580f9c20.tar.bz2
analyzer: fix ICE on vector comparisons [PR96713]
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.
-rw-r--r--gcc/analyzer/region-model.cc25
-rw-r--r--gcc/testsuite/gcc.dg/analyzer/pr96713.c8
2 files changed, 20 insertions, 13 deletions
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index 8a5e74e..b8a0f9f 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -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
index 0000000..fe9cafd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/pr96713.c
@@ -0,0 +1,8 @@
+typedef int __attribute__ ((vector_size (8))) V;
+
+void
+foo (V d, V e)
+{
+ d <= e;
+ foo ((V){}, (V){});
+}