diff options
author | Bin Cheng <bin.cheng@arm.com> | 2013-12-13 11:36:22 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2013-12-13 11:36:22 +0000 |
commit | b83b550780a6ee31c6e8b9da922c2a087f7bd44c (patch) | |
tree | 8a279853c02062aa9b7a75a2527c0964cd7b3e93 /gcc/testsuite | |
parent | a005b5befd6bb3166b1d7c5269a2c791e4a4ee7c (diff) | |
download | gcc-b83b550780a6ee31c6e8b9da922c2a087f7bd44c.zip gcc-b83b550780a6ee31c6e8b9da922c2a087f7bd44c.tar.gz gcc-b83b550780a6ee31c6e8b9da922c2a087f7bd44c.tar.bz2 |
re PR tree-optimization/58296 (ivopts is unable to handle some loops altered by the loop header copying pass)
PR tree-optimization/58296
PR tree-optimization/41488
* tree-scalar-evolution.c: Include necessary header files.
(simplify_peeled_chrec): New function.
(analyze_evolution_in_loop): New static variable.
Call simplify_peeled_chrec.
* tree-ssa-loop-ivopts.c (mark_bivs): Don't mark peeled IV as biv.
(add_old_iv_candidates): Don't add candidate for peeled IV.
* tree-affine.h (aff_combination_zero_p): New function.
PR tree-optimization/58296
PR tree-optimization/41488
* gcc.dg/tree-ssa/scev-7.c: New test.
* gcc.dg/pr41488.c: New test.
* g++.dg/pr59445.C: New test.
From-SVN: r205959
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr59445.C | 81 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr41488.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/scev-7.c | 18 |
4 files changed, 125 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e011b5e..94e703b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-12-13 Bin Cheng <bin.cheng@arm.com> + + PR tree-optimization/58296 + PR tree-optimization/41488 + * gcc.dg/tree-ssa/scev-7.c: New test. + * gcc.dg/pr41488.c: New test. + * g++.dg/pr59445.C: New test. + 2013-12-12 Tobias Burnus <burnus@net-b.de> PR fortran/59440 diff --git a/gcc/testsuite/g++.dg/pr59445.C b/gcc/testsuite/g++.dg/pr59445.C new file mode 100644 index 0000000..99d6df2 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr59445.C @@ -0,0 +1,81 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +template <typename _Iterator> struct A; +template <typename _Tp> struct A<_Tp *> { + typedef _Tp value_type; + typedef int difference_type; +}; +template <typename _Compare> struct B {}; +template <typename _Compare> struct C { + _Compare _M_comp; + template <typename _Value, typename _Iterator> + int operator()(_Value &p1, _Iterator p2) { + return _M_comp(p1, *p2); + } +}; +template <typename _Compare> C<_Compare> __val_comp_iter(B<_Compare>); +template <typename _RandomAccessIterator, typename _Compare> +void __unguarded_linear_insert(_RandomAccessIterator p1, _Compare p2) { + typename A<_RandomAccessIterator>::value_type a; + _RandomAccessIterator b = p1; + --b; + while (p2(a, b)) { + *p1 = 0; + p1 = b; + --b; + } +} +template <typename _RandomAccessIterator, typename _Compare> +void __insertion_sort(_RandomAccessIterator, _Compare p2) { + for (_RandomAccessIterator c;; ++c) + __unguarded_linear_insert(c, __val_comp_iter(p2)); +} +template <typename _RandomAccessIterator, typename _Distance, typename _Compare> +void __chunk_insertion_sort(_RandomAccessIterator, _Distance, _Compare p3) { + _RandomAccessIterator d; + __insertion_sort(d, p3); +} +template <typename _RandomAccessIterator, typename _Pointer, typename _Compare> +void __merge_sort_with_buffer(_RandomAccessIterator p1, _Pointer, _Compare p3) { + __chunk_insertion_sort(p1, 0, p3); +} +template <typename _RandomAccessIterator, typename _Pointer, typename _Distance, + typename _Compare> +void __stable_sort_adaptive(_RandomAccessIterator, _Pointer, _Distance, + _Compare p4) { + _RandomAccessIterator e; + __merge_sort_with_buffer(e, 0, p4); +} +template <typename _RandomAccessIterator, typename _Compare> +void __stable_sort(_RandomAccessIterator p1, _Compare p2) { + __stable_sort_adaptive( + p1, 0, typename A<_RandomAccessIterator>::difference_type(), p2); +} +template <typename _RandomAccessIterator, typename _Compare> +void stable_sort(_RandomAccessIterator, _RandomAccessIterator p2, _Compare) { + B<_Compare> f; + __stable_sort(p2, f); +} +class D { +public: + void m_fn1(); +}; +class F { + struct G { + D MFI; + int operator()(int p1, int p2) { + if (p1) + return 0; + if (p2) + return 1; + MFI.m_fn1(); + } + }; + void m_fn1(int &p1) const; +}; +void F::m_fn1(int &p1) const { + int *g, *h; + stable_sort(h, g, G()); +} + diff --git a/gcc/testsuite/gcc.dg/pr41488.c b/gcc/testsuite/gcc.dg/pr41488.c new file mode 100644 index 0000000..c4bc428 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr41488.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-sccp-scev" } */ + +struct struct_t +{ + int* data; +}; + +void foo (struct struct_t* sp, int start, int end) +{ + int i; + + for (i = 0; i+start < end; i++) + sp->data[i+start] = 0; +} + +/* { dg-final { scan-tree-dump-times "Simplify PEELED_CHREC into POLYNOMIAL_CHREC" 1 "sccp" } } */ +/* { dg-final { cleanup-tree-dump "sccp" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/scev-7.c b/gcc/testsuite/gcc.dg/tree-ssa/scev-7.c new file mode 100644 index 0000000..d6ceb20 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/scev-7.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-sccp-scev" } */ + +struct struct_t +{ + int* data; +}; + +void foo (struct struct_t* sp, int start, int end) +{ + int i; + + for (i = 1000; i+start > end; i--) + sp->data[i+start] = 0; +} + +/* { dg-final { scan-tree-dump-times "Simplify PEELED_CHREC into POLYNOMIAL_CHREC" 1 "sccp" } } */ +/* { dg-final { cleanup-tree-dump "sccp" } } */ |