diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-08-19 17:36:53 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-08-19 21:18:30 -0400 |
commit | 2f5951bd95e334d611f4be7bbe1a136c580f9c20 (patch) | |
tree | d8b4686beed979d3f49d0f6bc2ae610d53198b16 | |
parent | 04e23a4051fb3c049f85b9e6e2fc58f937337aff (diff) | |
download | gcc-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.cc | 25 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr96713.c | 8 |
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){}); +} |