diff options
author | tomby <tomby@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-12-03 13:35:13 +0000 |
---|---|---|
committer | tomby <tomby@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-12-03 13:35:13 +0000 |
commit | 880734c8866685187a2141807581829f11cc01db (patch) | |
tree | ce8e0b8567348f3139f7c4c74dd94700b18f970f /gcc/tree-loop-distribution.c | |
parent | 2b3e0f149e690f1cd112b3164392ebef8488ce31 (diff) | |
download | gcc-880734c8866685187a2141807581829f11cc01db.tar.gz |
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
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 30 |
1 files changed, 23 insertions, 7 deletions
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); |