From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1011) id DA8353858D35; Tue, 14 Nov 2023 15:33:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DA8353858D35 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1699976020; bh=DxAXmCxoCDAfJalbLc/leF+FDLv9OBIThubjndpqCXI=; h=From:To:Subject:Date:From; b=w+bWWf3zAXLMkrdNVWSP6MqaOy9QyZAXAKzoawhcrYJYGNzS5OtCl3UqaClTfVFtG ZZCJkQF0jap+CwdhGPe+UAJE68HTmt11x/khml/kkTncfcHqyW8cn6QD31N0Wx5tk9 dDozlAyidivW96OTsgOz3QCNB0KYdht9t1t9oULk= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andrew Macleod To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-5449] Use case label type to create case range. X-Act-Checkin: gcc X-Git-Author: Andrew MacLeod X-Git-Refname: refs/heads/master X-Git-Oldrev: 2c2fcd6d2a315069f9bef0117f8d7bebe7cb4957 X-Git-Newrev: 8f331be42991aa4d58ac770faf993accfcce882b Message-Id: <20231114153340.DA8353858D35@sourceware.org> Date: Tue, 14 Nov 2023 15:33:40 +0000 (GMT) List-Id: https://gcc.gnu.org/g:8f331be42991aa4d58ac770faf993accfcce882b commit r14-5449-g8f331be42991aa4d58ac770faf993accfcce882b Author: Andrew MacLeod Date: Mon Nov 13 09:58:10 2023 -0500 Use case label type to create case range. Create a range from the label type, and cast it to the required type. PR tree-optimization/112509 gcc/ * tree-vrp.cc (find_case_label_range): Create range from case labels. gcc/testsuite/ * gcc.dg/pr112509.c: New. Diff: --- gcc/testsuite/gcc.dg/pr112509.c | 22 ++++++++++++++++++++++ gcc/tree-vrp.cc | 6 +----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gcc/testsuite/gcc.dg/pr112509.c b/gcc/testsuite/gcc.dg/pr112509.c new file mode 100644 index 00000000000..b733780bdc7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112509.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-tree-vrp -fno-tree-fre -fno-tree-forwprop" } */ + +struct S { + unsigned j : 3; +}; +int k, l, m_1 = {0}; +void f(int l, struct S x) { + unsigned int k_1; + while (m_1 % 8) switch (x.j) { + case 1: + case 3: + case 4: + case 6: + case 2: + case 5: l = m_1; + case 7: + case 0: k_1 = 0; + default: break; + } +} +void foo(struct S x) { f(l, x); } diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc index 19d8f995d70..917fa873714 100644 --- a/gcc/tree-vrp.cc +++ b/gcc/tree-vrp.cc @@ -886,8 +886,6 @@ find_case_label_range (gswitch *switch_stmt, const irange *range_of_op) size_t i, j; tree op = gimple_switch_index (switch_stmt); tree type = TREE_TYPE (op); - unsigned prec = TYPE_PRECISION (type); - signop sign = TYPE_SIGN (type); tree tmin = wide_int_to_tree (type, range_of_op->lower_bound ()); tree tmax = wide_int_to_tree (type, range_of_op->upper_bound ()); find_case_label_range (switch_stmt, tmin, tmax, &i, &j); @@ -900,9 +898,7 @@ find_case_label_range (gswitch *switch_stmt, const irange *range_of_op) = CASE_HIGH (label) ? CASE_HIGH (label) : CASE_LOW (label); wide_int wlow = wi::to_wide (CASE_LOW (label)); wide_int whigh = wi::to_wide (case_high); - int_range_max label_range (type, - wide_int::from (wlow, prec, sign), - wide_int::from (whigh, prec, sign)); + int_range_max label_range (TREE_TYPE (case_high), wlow, whigh); if (!types_compatible_p (label_range.type (), range_of_op->type ())) range_cast (label_range, range_of_op->type ()); label_range.intersect (*range_of_op);