Commit 2e1dd137 by Richard Biener Committed by Richard Biener

re PR tree-optimization/71351 (ICE: Segmentation fault (graphite))

2017-09-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71351
	* graphite-isl-ast-to-gimple.c (translate_isl_ast_to_gimple::
	graphite_create_new_loop_guard): Remove, fold remaining parts
	into caller ...
	(translate_isl_ast_node_for): ... here and simplify.

	* gfortran.dg/graphite/pr71351.f90: New testcase.
	* gfortran.dg/graphite/interchange-3.f90: Adjust.

From-SVN: r253052
parent f3f08c3f
2017-09-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/71351
* graphite-isl-ast-to-gimple.c (translate_isl_ast_to_gimple::
graphite_create_new_loop_guard): Remove, fold remaining parts
into caller ...
(translate_isl_ast_node_for): ... here and simplify.
2017-09-21 Jakub Jelinek <jakub@redhat.com> 2017-09-21 Jakub Jelinek <jakub@redhat.com>
PR target/82260 PR target/82260
...@@ -193,10 +193,6 @@ class translate_isl_ast_to_gimple ...@@ -193,10 +193,6 @@ class translate_isl_ast_to_gimple
__isl_keep isl_ast_node *node_for, __isl_keep isl_ast_node *node_for,
loop_p outer, tree type, loop_p outer, tree type,
tree lb, tree ub, ivs_params &ip); tree lb, tree ub, ivs_params &ip);
edge graphite_create_new_loop_guard (edge entry_edge,
__isl_keep isl_ast_node *node_for,
tree *type,
tree *lb, tree *ub, ivs_params &ip);
edge graphite_create_new_guard (edge entry_edge, edge graphite_create_new_guard (edge entry_edge,
__isl_take isl_ast_expr *if_cond, __isl_take isl_ast_expr *if_cond,
ivs_params &ip); ivs_params &ip);
...@@ -731,99 +727,32 @@ get_upper_bound (__isl_keep isl_ast_node *node_for) ...@@ -731,99 +727,32 @@ get_upper_bound (__isl_keep isl_ast_node *node_for)
return res; return res;
} }
/* All loops generated by create_empty_loop_on_edge have the form of /* Translates an isl_ast_node_for to Gimple. */
a post-test loop:
do
{
body of the loop;
} while (lower bound < upper bound);
We create a new if region protecting the loop to be executed, if
the execution count is zero (lower bound > upper bound). */
edge translate_isl_ast_to_gimple:: edge translate_isl_ast_to_gimple::
graphite_create_new_loop_guard (edge entry_edge, translate_isl_ast_node_for (loop_p context_loop, __isl_keep isl_ast_node *node,
__isl_keep isl_ast_node *node_for, tree *type, edge next_e, ivs_params &ip)
tree *lb, tree *ub, ivs_params &ip)
{ {
gcc_assert (isl_ast_node_get_type (node_for) == isl_ast_node_for); gcc_assert (isl_ast_node_get_type (node) == isl_ast_node_for);
tree cond_expr; tree type
edge exit_edge; = build_nonstandard_integer_type (graphite_expression_type_precision, 0);
*type =
build_nonstandard_integer_type (graphite_expression_type_precision, 0);
isl_ast_expr *for_init = isl_ast_node_for_get_init (node_for);
*lb = gcc_expression_from_isl_expression (*type, for_init, ip);
isl_ast_expr *for_init = isl_ast_node_for_get_init (node);
tree lb = gcc_expression_from_isl_expression (type, for_init, ip);
/* To fail code generation, we generate wrong code until we discard it. */ /* To fail code generation, we generate wrong code until we discard it. */
if (codegen_error_p ()) if (codegen_error_p ())
*lb = integer_zero_node; lb = integer_zero_node;
isl_ast_expr *upper_bound = get_upper_bound (node_for);
*ub = gcc_expression_from_isl_expression (*type, upper_bound, ip);
isl_ast_expr *upper_bound = get_upper_bound (node);
tree ub = gcc_expression_from_isl_expression (type, upper_bound, ip);
/* To fail code generation, we generate wrong code until we discard it. */ /* To fail code generation, we generate wrong code until we discard it. */
if (codegen_error_p ()) if (codegen_error_p ())
*ub = integer_zero_node; ub = integer_zero_node;
/* When ub is simply a constant or a parameter, use lb <= ub. */
if (TREE_CODE (*ub) == INTEGER_CST || TREE_CODE (*ub) == SSA_NAME)
cond_expr = fold_build2 (LE_EXPR, boolean_type_node, *lb, *ub);
else
{
tree one = (POINTER_TYPE_P (*type)
? convert_to_ptrofftype (integer_one_node)
: fold_convert (*type, integer_one_node));
/* Adding +1 and using LT_EXPR helps with loop latches that have a
loop iteration count of "PARAMETER - 1". For PARAMETER == 0 this
becomes 2^k-1 due to integer overflow, and the condition lb <= ub
is true, even if we do not want this. However lb < ub + 1 is false,
as expected. */
tree ub_one = fold_build2 (POINTER_TYPE_P (*type) ? POINTER_PLUS_EXPR
: PLUS_EXPR, *type, *ub, one);
cond_expr = fold_build2 (LT_EXPR, boolean_type_node, *lb, ub_one);
}
if (integer_onep (cond_expr))
exit_edge = entry_edge;
else
exit_edge = create_empty_if_region_on_edge (entry_edge,
unshare_expr (cond_expr));
return exit_edge;
}
/* Translates an isl_ast_node_for to Gimple. */
edge translate_isl_ast_to_gimple::
translate_isl_ast_node_for (loop_p context_loop, __isl_keep isl_ast_node *node,
edge next_e, ivs_params &ip)
{
gcc_assert (isl_ast_node_get_type (node) == isl_ast_node_for);
tree type, lb, ub;
edge last_e = graphite_create_new_loop_guard (next_e, node, &type,
&lb, &ub, ip);
if (last_e == next_e)
{
/* There was no guard generated. */
last_e = single_succ_edge (split_edge (last_e));
edge last_e = single_succ_edge (split_edge (next_e));
translate_isl_ast_for_loop (context_loop, node, next_e, translate_isl_ast_for_loop (context_loop, node, next_e,
type, lb, ub, ip); type, lb, ub, ip);
return last_e; return last_e;
}
edge true_e = get_true_edge_from_guard_bb (next_e->dest);
merge_points.safe_push (last_e);
last_e = single_succ_edge (split_edge (last_e));
translate_isl_ast_for_loop (context_loop, node, true_e, type, lb, ub, ip);
return last_e;
} }
/* Inserts in iv_map a tuple (OLD_LOOP->num, NEW_NAME) for the induction /* Inserts in iv_map a tuple (OLD_LOOP->num, NEW_NAME) for the induction
......
2017-09-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/71351
* gfortran.dg/graphite/pr71351.f90: New testcase.
* gfortran.dg/graphite/interchange-3.f90: Adjust.
2017-09-21 Jakub Jelinek <jakub@redhat.com> 2017-09-21 Jakub Jelinek <jakub@redhat.com>
PR target/82260 PR target/82260
......
...@@ -24,4 +24,4 @@ Program FOO ...@@ -24,4 +24,4 @@ Program FOO
end Program FOO end Program FOO
! { dg-final { scan-tree-dump-times "codegen error: reverting back to the original code." "1" "graphite" } } ! { dg-final { scan-tree-dump "tiled" "graphite" } }
! { dg-do compile }
! { dg-options "-O2 -floop-nest-optimize" }
SUBROUTINE print_crys_symmetry(nc,v)
INTEGER :: nc
REAL(KIND=8), DIMENSION(3,48) :: v
INTEGER :: n,i
vs = 0.0_8
DO n = 1, nc
DO i = 1, 3
vs = vs + ABS(v(i,n))
END DO
END DO
CALL foo(vs)
END SUBROUTINE print_crys_symmetry
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment