From 880734c8866685187a2141807581829f11cc01db Mon Sep 17 00:00:00 2001 From: tomby Date: Wed, 3 Dec 2008 13:35:13 +0000 Subject: PR middle-end/38250 * tree-loop-distribution.c (build_size_arg): New function. (generate_memset_zero): Checks if DR_STEP(de) is NULL. Reorganized generating of stmts. * testsuite/gcc.dg/tree-ssa/pr38250.c: New file. * tree-data-ref.c (dr_analyze_innermost): Returns bool. Indicate if analysis succeed. * tree-data-ref.h (dr_analyze_innermost): Returns bool. * tree-predcom.c (valid_initializer_p, find_looparound_phi): Uses new definition of dr_analyze_innermost. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142394 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-loop-distribution.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'gcc/tree-loop-distribution.c') diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index bd6a9322500..062ab48ee7e 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -216,13 +216,30 @@ generate_loops_for_partition (struct loop *loop, bitmap partition, bool copy_p) return true; } +/* Build size argument. */ + +static inline tree +build_size_arg (tree nb_iter, tree op, gimple_seq* stmt_list) +{ + tree nb_bytes; + gimple_seq stmts = NULL; + + nb_bytes = fold_build2 (MULT_EXPR, TREE_TYPE (nb_iter), + nb_iter, TYPE_SIZE_UNIT (TREE_TYPE (op))); + nb_bytes = force_gimple_operand (nb_bytes, &stmts, true, NULL); + gimple_seq_add_seq (stmt_list, stmts); + + return nb_bytes; +} + /* Generate a call to memset. Return true when the operation succeeded. */ static bool generate_memset_zero (gimple stmt, tree op0, tree nb_iter, gimple_stmt_iterator bsi) { - tree t, nb_bytes, addr_base; + tree t, addr_base; + tree nb_bytes = NULL; bool res = false; gimple_seq stmts = NULL, stmt_list = NULL; gimple fn_call; @@ -231,14 +248,10 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, ssa_op_iter iter; struct data_reference *dr = XCNEW (struct data_reference); - nb_bytes = fold_build2 (MULT_EXPR, TREE_TYPE (nb_iter), - nb_iter, TYPE_SIZE_UNIT (TREE_TYPE (op0))); - nb_bytes = force_gimple_operand (nb_bytes, &stmts, true, NULL); - gimple_seq_add_seq (&stmt_list, stmts); - DR_STMT (dr) = stmt; DR_REF (dr) = op0; - dr_analyze_innermost (dr); + if (!dr_analyze_innermost (dr)) + goto end; /* Test for a positive stride, iterating over every element. */ if (integer_zerop (fold_build2 (MINUS_EXPR, integer_type_node, DR_STEP (dr), @@ -253,6 +266,7 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, TYPE_SIZE_UNIT (TREE_TYPE (op0)), DR_STEP (dr)))) { + nb_bytes = build_size_arg (nb_iter, op0, &stmt_list); addr_base = size_binop (PLUS_EXPR, DR_OFFSET (dr), DR_INIT (dr)); addr_base = fold_build2 (MINUS_EXPR, sizetype, addr_base, nb_bytes); addr_base = force_gimple_operand (addr_base, &stmts, true, NULL); @@ -272,6 +286,8 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, fntype = TREE_TYPE (fndecl); fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl); + if (!nb_bytes) + nb_bytes = build_size_arg (nb_iter, op0, &stmt_list); fn_call = gimple_build_call (fn, 3, mem, integer_zero_node, nb_bytes); gimple_seq_add_stmt (&stmt_list, fn_call); -- cgit v1.2.1