diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2010-03-10 15:53:51 +0300 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2010-03-10 15:53:51 +0300 |
commit | 6edd81980fbf769971b1e77bb1d679b329d2255a (patch) | |
tree | e704aea341ddf402a0ef3b846957f3e6e56479ad /gcc | |
parent | 9f698956d92618730bae35fddd33452dcb41a47e (diff) | |
download | gcc-6edd81980fbf769971b1e77bb1d679b329d2255a.zip gcc-6edd81980fbf769971b1e77bb1d679b329d2255a.tar.gz gcc-6edd81980fbf769971b1e77bb1d679b329d2255a.tar.bz2 |
re PR tree-optimization/43236 (-ftree-loop-distribution produces wrong code in reload1.c:delete_output_reload(), bootstrap fails)
PR tree-optimization/43236
* tree-loop-distribution.c (generate_memset_zero): Fix off-by-one
error in calculation of base address in reverse iteration case.
(generate_builtin): Take number of latch executions if the statement
is in the latch.
* gcc.c-torture/execute/pr43236.c: New.
From-SVN: r157339
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr43236.c | 32 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 4 |
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32e2eab..55a998c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-03-10 Alexander Monakov <amonakov@ispras.ru> + + PR tree-optimization/43236 + * tree-loop-distribution.c (generate_memset_zero): Fix off-by-one + error in calculation of base address in reverse iteration case. + (generate_builtin): Take number of latch executions if the statement + is in the latch. + 2010-03-10 Andrey Belevantsev <abel@ispras.ru> PR middle-end/42859 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf4ccf7..edb88dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-03-10 Alexander Monakov <amonakov@ispras.ru> + + PR tree-optimization/43236 + * gcc.c-torture/execute/pr43236.c: New test. + 2010-03-10 Andrey Belevantsev <abel@ispras.ru> PR middle-end/42859 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr43236.c b/gcc/testsuite/gcc.c-torture/execute/pr43236.c new file mode 100644 index 0000000..0401c88 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr43236.c @@ -0,0 +1,32 @@ +/* { dg-options "-ftree-loop-distribution" } */ +extern void abort(void); +extern void *memset(void *s, int c, __SIZE_TYPE__ n); +extern int memcmp(const void *s1, const void *s2, __SIZE_TYPE__ n); +/*extern int printf(const char *format, ...);*/ + +int main() +{ + char A[30], B[30], C[30]; + int i; + + /* prepare arrays */ + memset(A, 1, 30); + memset(B, 1, 30); + + for (i = 20; i-- > 10;) { + A[i] = 0; + B[i] = 0; + } + + /* expected result */ + memset(C, 1, 30); + memset(C + 10, 0, 10); + + /* show result */ +/* for (i = 0; i < 30; i++) + printf("%d %d %d\n", A[i], B[i], C[i]); */ + + /* compare results */ + if (memcmp(A, C, 30) || memcmp(B, C, 30)) abort(); + return 0; +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 920ab8c..74120c6 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -285,6 +285,8 @@ generate_memset_zero (gimple stmt, tree op0, tree nb_iter, addr_base = fold_convert_loc (loc, sizetype, addr_base); addr_base = size_binop_loc (loc, MINUS_EXPR, addr_base, fold_convert_loc (loc, sizetype, nb_bytes)); + addr_base = size_binop_loc (loc, PLUS_EXPR, addr_base, + TYPE_SIZE_UNIT (TREE_TYPE (op0))); addr_base = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (DR_BASE_ADDRESS (dr)), DR_BASE_ADDRESS (dr), addr_base); @@ -389,6 +391,8 @@ generate_builtin (struct loop *loop, bitmap partition, bool copy_p) goto end; write = stmt; + if (bb == loop->latch) + nb_iter = number_of_latch_executions (loop); } } } |