From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1059) id 9187E3948450; Fri, 28 Aug 2020 15:57:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9187E3948450 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1598630249; bh=JEvmKejCRQ4y84Rnef5BpgVayV2LkTXzVDbBMwMFWzo=; h=From:To:Subject:Date:From; b=Xfjm9OqPa/ZxXLLxXt5MB8GFpG4lBi2N9pVbToP1Mu24FRXFBzWX9KQW+rRIrsl00 DubPtubtJPXVJRx6EWC54+TjoF3Oo9vtiOOT8bum7HuaD7GA4SFkwEUw+gIOmCKSHb s0MG887w2plCmqx6T9Rf0uq/BPooDwfz6abOX1bs= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Nathan Sidwell To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/c++-modules] analyzer: fix ICE on vector comparisons [PR96713] X-Act-Checkin: gcc X-Git-Author: David Malcolm X-Git-Refname: refs/heads/devel/c++-modules X-Git-Oldrev: 04e23a4051fb3c049f85b9e6e2fc58f937337aff X-Git-Newrev: 2f5951bd95e334d611f4be7bbe1a136c580f9c20 Message-Id: <20200828155729.9187E3948450@sourceware.org> Date: Fri, 28 Aug 2020 15:57:29 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Aug 2020 15:57:29 -0000 https://gcc.gnu.org/g:2f5951bd95e334d611f4be7bbe1a136c580f9c20 commit 2f5951bd95e334d611f4be7bbe1a136c580f9c20 Author: David Malcolm Date: Wed Aug 19 17:36:53 2020 -0400 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. Diff: --- gcc/analyzer/region-model.cc | 25 ++++++++++++------------- 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 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){}); +}