backport: [multiple changes]

2010-01-02  Richard Guenther  <rguenther@suse.de>

	Backport from mainline
	2009-12-10  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42337
	* tree-ssa-pre.c (seen_during_translate): Remove.
	(phi_translate_1): Collapse into ...
	(phi_translate): ... this.  Remove seen parameter and
	adjust recursive calls.

	Backport from mainline
	2009-12-09  Xinliang David Li  <davidxl@google.com>

	PR tree-optimization/42337
	* g++.dg/tree-ssa/pr42337.C: New test.

From-SVN: r155573
This commit is contained in:
Richard Guenther 2010-01-02 17:12:15 +00:00 committed by Richard Biener
parent 3e0c794aea
commit eae23e2eb9
4 changed files with 202 additions and 43 deletions

View File

@ -1,3 +1,14 @@
2010-01-02 Richard Guenther <rguenther@suse.de>
Backport from mainline
2009-12-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/42337
* tree-ssa-pre.c (seen_during_translate): Remove.
(phi_translate_1): Collapse into ...
(phi_translate): ... this. Remove seen parameter and
adjust recursive calls.
2010-01-02 Uros Bizjak <ubizjak@gmail.com>
PR target/42448

View File

@ -1,3 +1,11 @@
2010-01-02 Richard Guenther <rguenther@suse.de>
Backport from mainline
2009-12-09 Xinliang David Li <davidxl@google.com>
PR tree-optimization/42337
* g++.dg/tree-ssa/pr42337.C: New test.
2010-01-02 Uros Bizjak <ubizjak@gmail.com>
PR target/42448

View File

@ -0,0 +1,173 @@
// PR tree-optimize/42337
// { dg-do compile }
// { dg-options "-O2" }
template<class _T1, class _T2> struct pair {
_T2 second;
};
template<typename _Tp>
inline const _Tp& max(const _Tp& __a, const _Tp& __b) { }
template<typename _ForwardIterator, typename _Tp, typename _Compare> _ForwardIterator
lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp) { }
template<class _CharT> struct char_traits {};
template<typename _Iterator, typename _Container> class __normal_iterator {
public: typedef _Iterator iterator_type;
__normal_iterator& operator++() {
}
};
template<typename _IteratorL, typename _IteratorR, typename _Container>
inline bool operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) { }
template<typename _Tp> class new_allocator {
public:
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
};
template<typename _Tp>
class allocator: public new_allocator<_Tp> {
public:
template<typename _Tp1> struct rebind {
typedef allocator<_Tp1> other;
};
};
template<typename _Arg, typename _Result> struct unary_function { };
template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function { };
template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { };
template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { };
template<typename _Tp> struct _Rb_tree_iterator {
typedef _Tp* pointer;
pointer operator->() const {
}
};
template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> >
class _Rb_tree {
typedef _Val value_type;
public: typedef _Rb_tree_iterator<value_type> iterator;
};
template <typename _Key, typename _Tp, typename _Compare = less<_Key>, typename _Alloc = allocator<pair<const _Key, _Tp> > >
class map {
public: typedef _Key key_type;
typedef pair<const _Key, _Tp> value_type;
typedef _Compare key_compare;
private: typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type;
typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type;
public: typedef typename _Pair_alloc_type::pointer pointer;
typedef typename _Rep_type::iterator iterator;
iterator find(const key_type& __x) { }
};
template<typename _Tp, typename _Alloc> struct _Vector_base {
typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
};
template<typename _Tp, typename _Alloc = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc> {
typedef _Vector_base<_Tp, _Alloc> _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
public:
typedef typename _Tp_alloc_type::pointer pointer;
typedef typename _Tp_alloc_type::const_pointer const_pointer;
typedef __normal_iterator<pointer, vector> iterator;
typedef __normal_iterator<const_pointer, vector> const_iterator;
iterator begin() { }
const_iterator begin() const { }
const_iterator end() const { }
unsigned long size() const { }
};
class SSC {
public:
SSC () {}
SSC (const int& cs);
};
extern int flag;
struct TP {
const int cl_;
const vector<int> &its_;
int max_s_;
};
double foo(TP *p);
map<int, int> cs_;
template <typename T> class vector32 {
public:
typedef T& reference;
typedef T* iterator;
typedef const T* const_iterator;
iterator begin() { return data_; }
iterator end() { return data_ + size_; }
long unsigned int size() const { return size_; }
T* data_;
unsigned size_;
};
struct SF : public pair<unsigned long long, double> { };
template<typename KEY, typename VALUE> class SFVT {
private: typedef vector32<SF> Container;
typedef typename Container::const_iterator CI;
mutable Container v_;
mutable bool sorted_;
struct Cmp : public binary_function<SF, SF, bool> {
};
__attribute__((always_inline)) VALUE IS(const SFVT &sfv) const {
if (sfv.v_.size() < v_.size()) {
return sfv.IS(*this);
}
else {
VALUE sum = 0.0;
CI beg = sfv.v_.begin();
CI end = sfv.v_.end();
for (CI i = v_.begin();
i != v_.end();
++i) { beg = lower_bound(beg, end, *i, Cmp()); if (beg == end) { return sum; } }
}
}
public: explicit SFVT(const int capacity = 0) : sorted_(true) { }
long unsigned int size() const { }
__attribute__((always_inline)) VALUE DP(const SFVT &sfv) const {
return IS(sfv);
}
};
class SFV : public SFVT<unsigned long long, double> { };
class Edge;
extern int flag2;
double foo(TP *p) {
int nbests_requested = max(p->max_s_, flag);
map<int, int>::iterator it = cs_.find(p->cl_);
int* c = &it->second;
for (vector<int>::const_iterator iter = p->its_.begin();
iter != p->its_.end();
++iter) {
}
vector<int*> fb;
vector<double> w;
int *hg = 0;
if (flag2 == 10) {
hg = &flag2;
}
int nr = 0;
for (vector<int*>::iterator iter = fb.begin();
(iter != fb.end() && nr < nbests_requested);
++iter) {
}
if (hg) {
SFV s_weights;
for (int i = 0;
i < w.size();
++i) {
}
SFV uw;
for (int i = 0, j = 0;
i < uw.size() && j < s_weights.size();
) {
}
const double tc = uw.DP(s_weights);
}
}

View File

@ -453,9 +453,6 @@ static tree prephitemp;
cleaned up. */
static bitmap need_eh_cleanup;
/* Which expressions have been seen during a given phi translation. */
static bitmap seen_during_translate;
/* The phi_translate_table caches phi translations for a given
expression and predecessor. */
@ -1400,14 +1397,12 @@ get_representative_for (const pre_expr e)
/* Translate EXPR using phis in PHIBLOCK, so that it has the values of
the phis in PRED. SEEN is a bitmap saying which expression we have
translated since we started translation of the toplevel expression.
Return NULL if we can't find a leader for each part of the
translated expression. */
the phis in PRED. Return NULL if we can't find a leader for each part
of the translated expression. */
static pre_expr
phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
basic_block pred, basic_block phiblock, bitmap seen)
phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
basic_block pred, basic_block phiblock)
{
pre_expr oldexpr = expr;
pre_expr phitrans;
@ -1422,16 +1417,6 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
if (phitrans)
return phitrans;
/* Prevent cycles when we have recursively dependent leaders. This
can only happen when phi translating the maximal set. */
if (seen)
{
unsigned int expr_id = get_expression_id (expr);
if (bitmap_bit_p (seen, expr_id))
return NULL;
bitmap_set_bit (seen, expr_id);
}
switch (expr->kind)
{
/* Constants contain no values that need translation. */
@ -1455,10 +1440,10 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
continue;
else
{
pre_expr leader, result;
unsigned int op_val_id = VN_INFO (newnary.op[i])->value_id;
pre_expr leader = find_leader_in_sets (op_val_id, set1, set2);
pre_expr result = phi_translate_1 (leader, set1, set2,
pred, phiblock, seen);
leader = find_leader_in_sets (op_val_id, set1, set2);
result = phi_translate (leader, set1, set2, pred, phiblock);
if (result && result != leader)
{
tree name = get_representative_for (result);
@ -1559,8 +1544,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
{
unsigned int op_val_id = VN_INFO (op0)->value_id;
leader = find_leader_in_sets (op_val_id, set1, set2);
opresult = phi_translate_1 (leader, set1, set2,
pred, phiblock, seen);
opresult = phi_translate (leader, set1, set2, pred, phiblock);
if (opresult && opresult != leader)
{
tree name = get_representative_for (opresult);
@ -1577,8 +1561,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
{
unsigned int op_val_id = VN_INFO (op1)->value_id;
leader = find_leader_in_sets (op_val_id, set1, set2);
opresult = phi_translate_1 (leader, set1, set2,
pred, phiblock, seen);
opresult = phi_translate (leader, set1, set2, pred, phiblock);
if (opresult && opresult != leader)
{
tree name = get_representative_for (opresult);
@ -1594,8 +1577,7 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
{
unsigned int op_val_id = VN_INFO (op2)->value_id;
leader = find_leader_in_sets (op_val_id, set1, set2);
opresult = phi_translate_1 (leader, set1, set2,
pred, phiblock, seen);
opresult = phi_translate (leader, set1, set2, pred, phiblock);
if (opresult && opresult != leader)
{
tree name = get_representative_for (opresult);
@ -1724,20 +1706,6 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
}
}
/* Translate EXPR using phis in PHIBLOCK, so that it has the values of
the phis in PRED.
Return NULL if we can't find a leader for each part of the
translated expression. */
static pre_expr
phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
basic_block pred, basic_block phiblock)
{
bitmap_clear (seen_during_translate);
return phi_translate_1 (expr, set1, set2, pred, phiblock,
seen_during_translate);
}
/* For each expression in SET, translate the values through phi nodes
in PHIBLOCK using edge PHIBLOCK->PRED, and store the resulting
expressions in DEST. */
@ -4146,7 +4114,6 @@ init_pre (bool do_fre)
expression_to_id = htab_create (num_ssa_names * 3,
pre_expr_hash,
pre_expr_eq, NULL);
seen_during_translate = BITMAP_ALLOC (&grand_bitmap_obstack);
bitmap_set_pool = create_alloc_pool ("Bitmap sets",
sizeof (struct bitmap_set), 30);
pre_expr_pool = create_alloc_pool ("pre_expr nodes",