diff mbox series

[committed] analyzer: fix ICE on vector comparisons [PR96713]

Message ID 20200820012111.24453-1-dmalcolm@redhat.com
State New
Headers show
Series [committed] analyzer: fix ICE on vector comparisons [PR96713] | expand

Commit Message

David Malcolm Aug. 20, 2020, 1:21 a.m. UTC
Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to master as r11-2776-g2f5951bd95e334d611f4be7bbe1a136c580f9c20.

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            | 25 ++++++++++++-------------
 gcc/testsuite/gcc.dg/analyzer/pr96713.c |  8 ++++++++
 2 files changed, 20 insertions(+), 13 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/analyzer/pr96713.c
diff mbox series

Patch

diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index 8a5e74ebc0e..b8a0f9ffd3d 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 00000000000..fe9cafd73f1
--- /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){});
+}