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.
This commit is contained in:
David Malcolm 2020-08-19 17:36:53 -04:00
parent 04e23a4051
commit 2f5951bd95
2 changed files with 20 additions and 13 deletions

View 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;

View File

@ -0,0 +1,8 @@
typedef int __attribute__ ((vector_size (8))) V;
void
foo (V d, V e)
{
d <= e;
foo ((V){}, (V){});
}