From 4fb48737f36b9cb431fd31d50a89458ee9369e0c Mon Sep 17 00:00:00 2001 From: amker Date: Wed, 20 Apr 2016 11:42:36 +0000 Subject: [PATCH] * tree-scalar-evolution.c (interpret_rhs_expr): Handle BIT_AND_EXPR. * gcc.dg/tree-ssa/scev-11.c: New test. * gcc.dg/tree-ssa/scev-12.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235269 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/scev-11.c | 28 ++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/scev-12.c | 30 ++++++++++++++++++++++++++++++ gcc/tree-scalar-evolution.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/scev-11.c create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/scev-12.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 576560a817a..2cca3a216da 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-04-20 Bin Cheng + + * tree-scalar-evolution.c (interpret_rhs_expr): Handle BIT_AND_EXPR. + 2016-04-20 Marek Polacek PR tree-optimization/70725 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b73790e1832..f869541b4eb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-20 Bin Cheng + + * gcc.dg/tree-ssa/scev-11.c: New test. + * gcc.dg/tree-ssa/scev-12.c: New test. + 2016-04-20 Marek Polacek PR tree-optimization/70725 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/scev-11.c b/gcc/testsuite/gcc.dg/tree-ssa/scev-11.c new file mode 100644 index 00000000000..a7181b2208b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/scev-11.c @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int a[128]; +extern int b[]; + +int bar (int *); + +int +foo (int n) +{ + int i; + + for (i = 0; i < n; i++) + { + unsigned char uc = (unsigned char)i; + a[i] = i; + b[uc] = 0; + } + + bar (a); + return 0; +} + +/* Address of array reference to b is scev. */ +/* { dg-final { scan-tree-dump-times "use \[0-9\]\n address" 2 "ivopts" } } */ + + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/scev-12.c b/gcc/testsuite/gcc.dg/tree-ssa/scev-12.c new file mode 100644 index 00000000000..6915ba8b31d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/scev-12.c @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +int a[128]; +extern int b[]; + +int bar (int *); + +int +foo (int x, int n) +{ + int i; + + for (i = 0; i < n; i++) + { + unsigned char uc = (unsigned char)i; + if (x) + a[i] = i; + b[uc] = 0; + } + + bar (a); + return 0; +} + +/* Address of array reference to b is not scev. */ +/* { dg-final { scan-tree-dump-times "use \[0-9\]\n address" 1 "ivopts" } } */ + + + diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 88a0eaaa82d..d6f2a2fba14 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -1937,6 +1937,36 @@ interpret_rhs_expr (struct loop *loop, gimple *at_stmt, res = chrec_convert (type, chrec1, at_stmt); break; + case BIT_AND_EXPR: + /* Given int variable A, handle A&0xffff as (int)(unsigned short)A. + If A is SCEV and its value is in the range of representable set + of type unsigned short, the result expression is a (no-overflow) + SCEV. */ + res = chrec_dont_know; + if (tree_fits_uhwi_p (rhs2)) + { + int precision; + unsigned HOST_WIDE_INT val = tree_to_uhwi (rhs2); + + val ++; + /* Skip if value of rhs2 wraps in unsigned HOST_WIDE_INT or + it's not the maximum value of a smaller type than rhs1. */ + if (val != 0 + && (precision = exact_log2 (val)) > 0 + && (unsigned) precision < TYPE_PRECISION (TREE_TYPE (rhs1))) + { + tree utype = build_nonstandard_integer_type (precision, 1); + + if (TYPE_PRECISION (utype) < TYPE_PRECISION (TREE_TYPE (rhs1))) + { + chrec1 = analyze_scalar_evolution (loop, rhs1); + chrec1 = chrec_convert (utype, chrec1, at_stmt); + res = chrec_convert (TREE_TYPE (rhs1), chrec1, at_stmt); + } + } + } + break; + default: res = chrec_dont_know; break; -- 2.11.4.GIT