tree-scalar-evolution (interpret_rhs_expr): generate chrec for array reference and component reference.
2012-03-09 Jiangning Liu <jiangning.liu@arm.com> * tree-scalar-evolution (interpret_rhs_expr): generate chrec for array reference and component reference. (analyze_scalar_evolution_for_address_of): New. 2012-03-09 Jiangning Liu <jiangning.liu@arm.com> * gcc.dg/tree-ssa/scev-3.c: New. * gcc.dg/tree-ssa/scev-4.c: New. From-SVN: r185129
This commit is contained in:
parent
68c5d97bad
commit
bef28cedad
|
@ -1,3 +1,9 @@
|
|||
2012-03-09 Jiangning Liu <jiangning.liu@arm.com>
|
||||
|
||||
* tree-scalar-evolution (interpret_rhs_expr): generate chrec for
|
||||
array reference and component reference.
|
||||
(analyze_scalar_evolution_for_address_of): New.
|
||||
|
||||
2012-03-08 Jie Zhang <jzhang918@gmail.com>
|
||||
|
||||
PR target/49862
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-03-09 Jiangning Liu <jiangning.liu@arm.com>
|
||||
|
||||
* gcc.dg/tree-ssa/scev-3.c: New.
|
||||
* gcc.dg/tree-ssa/scev-4.c: New.
|
||||
|
||||
2012-03-08 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR fortran/52469
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
int *a_p;
|
||||
int a[1000];
|
||||
|
||||
f(int k)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=k; i<1000; i+=k) {
|
||||
a_p = &a[i];
|
||||
*a_p = 100;
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "&a" 1 "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
|
@ -0,0 +1,23 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-optimized" } */
|
||||
|
||||
typedef struct {
|
||||
int x;
|
||||
int y;
|
||||
} S;
|
||||
|
||||
int *a_p;
|
||||
S a[1000];
|
||||
|
||||
f(int k)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=k; i<1000; i+=k) {
|
||||
a_p = &a[i].y;
|
||||
*a_p = 100;
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "&a" 1 "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
|
@ -266,6 +266,8 @@ along with GCC; see the file COPYING3. If not see
|
|||
#include "params.h"
|
||||
|
||||
static tree analyze_scalar_evolution_1 (struct loop *, tree, tree);
|
||||
static tree analyze_scalar_evolution_for_address_of (struct loop *loop,
|
||||
tree var);
|
||||
|
||||
/* The cached information about an SSA name VAR, claiming that below
|
||||
basic block INSTANTIATED_BELOW, the value of VAR can be expressed
|
||||
|
@ -1712,16 +1714,59 @@ interpret_rhs_expr (struct loop *loop, gimple at_stmt,
|
|||
switch (code)
|
||||
{
|
||||
case ADDR_EXPR:
|
||||
/* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR. */
|
||||
if (TREE_CODE (TREE_OPERAND (rhs1, 0)) != MEM_REF)
|
||||
{
|
||||
res = chrec_dont_know;
|
||||
break;
|
||||
}
|
||||
if (TREE_CODE (TREE_OPERAND (rhs1, 0)) == MEM_REF
|
||||
|| handled_component_p (TREE_OPERAND (rhs1, 0)))
|
||||
{
|
||||
enum machine_mode mode;
|
||||
HOST_WIDE_INT bitsize, bitpos;
|
||||
int unsignedp;
|
||||
int volatilep = 0;
|
||||
tree base, offset;
|
||||
tree chrec3;
|
||||
tree unitpos;
|
||||
|
||||
rhs2 = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1);
|
||||
rhs1 = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0);
|
||||
/* Fall through. */
|
||||
base = get_inner_reference (TREE_OPERAND (rhs1, 0),
|
||||
&bitsize, &bitpos, &offset,
|
||||
&mode, &unsignedp, &volatilep, false);
|
||||
|
||||
if (TREE_CODE (base) == MEM_REF)
|
||||
{
|
||||
rhs2 = TREE_OPERAND (base, 1);
|
||||
rhs1 = TREE_OPERAND (base, 0);
|
||||
|
||||
chrec1 = analyze_scalar_evolution (loop, rhs1);
|
||||
chrec2 = analyze_scalar_evolution (loop, rhs2);
|
||||
chrec1 = chrec_convert (type, chrec1, at_stmt);
|
||||
chrec2 = chrec_convert (TREE_TYPE (rhs2), chrec2, at_stmt);
|
||||
res = chrec_fold_plus (type, chrec1, chrec2);
|
||||
}
|
||||
else
|
||||
{
|
||||
chrec1 = analyze_scalar_evolution_for_address_of (loop, base);
|
||||
chrec1 = chrec_convert (type, chrec1, at_stmt);
|
||||
res = chrec1;
|
||||
}
|
||||
|
||||
if (offset != NULL_TREE)
|
||||
{
|
||||
chrec2 = analyze_scalar_evolution (loop, offset);
|
||||
chrec2 = chrec_convert (TREE_TYPE (offset), chrec2, at_stmt);
|
||||
res = chrec_fold_plus (type, res, chrec2);
|
||||
}
|
||||
|
||||
if (bitpos != 0)
|
||||
{
|
||||
gcc_assert ((bitpos % BITS_PER_UNIT) == 0);
|
||||
|
||||
unitpos = size_int_kind (bitpos / BITS_PER_UNIT, SIZETYPE);
|
||||
chrec3 = analyze_scalar_evolution (loop, unitpos);
|
||||
chrec3 = chrec_convert (TREE_TYPE (unitpos), chrec3, at_stmt);
|
||||
res = chrec_fold_plus (type, res, chrec3);
|
||||
}
|
||||
}
|
||||
else
|
||||
res = chrec_dont_know;
|
||||
break;
|
||||
|
||||
case POINTER_PLUS_EXPR:
|
||||
chrec1 = analyze_scalar_evolution (loop, rhs1);
|
||||
|
@ -1961,6 +2006,14 @@ analyze_scalar_evolution (struct loop *loop, tree var)
|
|||
return res;
|
||||
}
|
||||
|
||||
/* Analyzes and returns the scalar evolution of VAR address in LOOP. */
|
||||
|
||||
static tree
|
||||
analyze_scalar_evolution_for_address_of (struct loop *loop, tree var)
|
||||
{
|
||||
return analyze_scalar_evolution (loop, build_fold_addr_expr (var));
|
||||
}
|
||||
|
||||
/* Analyze scalar evolution of use of VERSION in USE_LOOP with respect to
|
||||
WRTO_LOOP (which should be a superloop of USE_LOOP)
|
||||
|
||||
|
|
Loading…
Reference in New Issue