+2019-04-01 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/89725
+ * tree-chrec.c (chrec_contains_symbols): New parameter. Handle outer
+ loop's chrec as invariant symbol.
+ * tree-chrec.h (chrec_contains_symbols): New parameter.
+ * tree-data-ref.c (analyze_miv_subscript): Pass new argument.
+ (build_classic_dist_vector_1, add_other_self_distances): Bypass access
+ function of loops not in DDR's loop_nest.
+ * tree-data-ref.h (index_in_loop_nest): Add unreachable check.
+
2019-04-08 Chenghua Xu <paul.hua.gm@gmail.com>
PR target/89623
+2019-04-01 Bin Cheng <bin.cheng@linux.alibaba.com>
+
+ PR tree-optimization/89725
+ * gcc.dg/tree-ssa/pr89725.c: New test.
+
2019-04-08 Martin Liska <mliska@suse.cz>
* gcc.target/riscv/arch-1.c: Fix expected scanned pattern.
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-interchange -fno-tree-dce" } */
+int abs (int);
+int find_sad_16x16(int *intra_mode)
+{
+ int current_intra_sad_2,best_intra_sad2;
+ int M1[16][16],M0[4][4][4][4],M3[4],M4[4][4];
+ int i,j,k;
+ int ii,jj;
+ int up_avail, left_avail, left_up_avail;
+ for (i=0;i<17;i++)
+ if (left_up_avail)
+ {
+ for (jj=0;jj<4;jj++)
+ for (ii=0;ii<4;ii++)
+ for (j=0;j<4;j++)
+ for (i=0;i<4;i++)
+ {
+ M0[i][ii][2][jj]=M3[0]-M3[1];
+ M0[i][ii][1][jj]=M3[2]+M3[3];
+ current_intra_sad_2 += abs(M0[i][ii][j][jj]);
+ }
+
+ if(current_intra_sad_2 < best_intra_sad2)
+ best_intra_sad2=current_intra_sad_2;
+ }
+ return 0;
+}
return false;
}
-/* Determines whether the chrec contains symbolic names or not. */
+/* Determines whether the chrec contains symbolic names or not. If LOOP isn't
+ NULL, we also consider chrec wrto outer loops of LOOP as symbol. */
static bool
-chrec_contains_symbols (const_tree chrec, hash_set<const_tree> &visited)
+chrec_contains_symbols (const_tree chrec, hash_set<const_tree> &visited,
+ struct loop *loop)
{
int i, n;
|| TREE_CODE (chrec) == FIELD_DECL)
return true;
+ if (loop != NULL
+ && TREE_CODE (chrec) == POLYNOMIAL_CHREC
+ && flow_loop_nested_p (get_chrec_loop (chrec), loop))
+ return true;
+
n = TREE_OPERAND_LENGTH (chrec);
for (i = 0; i < n; i++)
- if (chrec_contains_symbols (TREE_OPERAND (chrec, i), visited))
+ if (chrec_contains_symbols (TREE_OPERAND (chrec, i), visited, loop))
return true;
return false;
}
+/* Return true if CHREC contains any symbols. If LOOP is not NULL, check if
+ CHREC contains any chrec which is invariant wrto the loop (nest), in other
+ words, chrec defined by outer loops of loop, so from LOOP's point of view,
+ the chrec is considered as a SYMBOL. */
+
bool
-chrec_contains_symbols (const_tree chrec)
+chrec_contains_symbols (const_tree chrec, struct loop* loop)
{
hash_set<const_tree> visited;
- return chrec_contains_symbols (chrec, visited);
+ return chrec_contains_symbols (chrec, visited, loop);
}
/* Determines whether the chrec contains undetermined coefficients. */
/* Observers. */
extern bool eq_evolutions_p (const_tree, const_tree);
extern bool is_multivariate_chrec (const_tree);
-extern bool chrec_contains_symbols (const_tree);
+extern bool chrec_contains_symbols (const_tree, struct loop * = NULL);
extern bool chrec_contains_symbols_defined_in_loop (const_tree, unsigned);
extern bool chrec_contains_undetermined (const_tree);
extern bool tree_contains_chrecs (const_tree, int *);
}
else if (evolution_function_is_affine_in_loop (chrec_a, loop_nest->num)
- && !chrec_contains_symbols (chrec_a)
+ && !chrec_contains_symbols (chrec_a, loop_nest)
&& evolution_function_is_affine_in_loop (chrec_b, loop_nest->num)
- && !chrec_contains_symbols (chrec_b))
+ && !chrec_contains_symbols (chrec_b, loop_nest))
{
/* testsuite/.../ssa-chrec-35.c
{0, +, 1}_2 vs. {0, +, 1}_3
{
unsigned i;
lambda_vector init_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
+ struct loop *loop = DDR_LOOP_NEST (ddr)[0];
for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
{
return false;
}
+ /* When data references are collected in a loop while data
+ dependences are analyzed in loop nest nested in the loop, we
+ would have more number of access functions than number of
+ loops. Skip access functions of loops not in the loop nest.
+
+ See PR89725 for more information. */
+ if (flow_loop_nested_p (get_loop (cfun, var_a), loop))
+ continue;
+
dist = int_cst_value (SUB_DISTANCE (subscript));
index = index_in_loop_nest (var_a, DDR_LOOP_NEST (ddr));
*index_carry = MIN (index, *index_carry);
unsigned i;
int index_carry = DDR_NB_LOOPS (ddr);
subscript *sub;
+ struct loop *loop = DDR_LOOP_NEST (ddr)[0];
FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
{
return;
}
+ /* When data references are collected in a loop while data
+ dependences are analyzed in loop nest nested in the loop, we
+ would have more number of access functions than number of
+ loops. Skip access functions of loops not in the loop nest.
+
+ See PR89725 for more information. */
+ if (flow_loop_nested_p (get_loop (cfun, CHREC_VARIABLE (access_fun)),
+ loop))
+ continue;
+
index_carry = MIN (index_carry,
index_in_loop_nest (CHREC_VARIABLE (access_fun),
DDR_LOOP_NEST (ddr)));
struct loop *loopi;
int var_index;
- for (var_index = 0; loop_nest.iterate (var_index, &loopi);
- var_index++)
+ for (var_index = 0; loop_nest.iterate (var_index, &loopi); var_index++)
if (loopi->num == var)
- break;
+ return var_index;
- return var_index;
+ gcc_unreachable ();
}
/* Returns true when the data reference DR the form "A[i] = ..."