This fixes PR49938 by instead of asserting return chrec_dont_know. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard. 2011-08-03 Richard Guenther <rguent...@suse.de> PR tree-optimization/49938 * tree-scalar-evolution.c (interpret_loop_phi): Gracefully deal with a POLYNOMIAL_CHREC. * g++.dg/torture/pr49938.C: New testcase. Index: gcc/tree-scalar-evolution.c =================================================================== --- gcc/tree-scalar-evolution.c (revision 177242) +++ gcc/tree-scalar-evolution.c (working copy) @@ -1642,8 +1642,8 @@ interpret_loop_phi (struct loop *loop, g else if (TREE_CODE (res) == POLYNOMIAL_CHREC) new_init = CHREC_LEFT (res); STRIP_USELESS_TYPE_CONVERSION (new_init); - gcc_assert (TREE_CODE (new_init) != POLYNOMIAL_CHREC); - if (!operand_equal_p (init_cond, new_init, 0)) + if (TREE_CODE (new_init) == POLYNOMIAL_CHREC + || !operand_equal_p (init_cond, new_init, 0)) return chrec_dont_know; } Index: gcc/testsuite/g++.dg/torture/pr49938.C =================================================================== --- gcc/testsuite/g++.dg/torture/pr49938.C (revision 0) +++ gcc/testsuite/g++.dg/torture/pr49938.C (revision 0) @@ -0,0 +1,48 @@ +#include <vector> +#include <cstdlib> +typedef unsigned short uint16; + +namespace base { + class StringPiece + { + public: + typedef std::size_t size_type; + size_type size() const { return length_; } + size_type length_; + }; +} + +namespace net { + class DNSSECKeySet + { + bool CheckSignature (const base::StringPiece& name, const + base::StringPiece& zone, const + base::StringPiece& signature, uint16 rrtype, + const std::vector<base::StringPiece>& rrdatas); + }; +} + +template <class C> class scoped_array +{ +public: typedef C element_type; + explicit scoped_array(C* p = __null):array_(p) {} +private: C* array_; +}; + +namespace net { + bool DNSSECKeySet::CheckSignature (const base::StringPiece& name, + const base::StringPiece& zone, const base::StringPiece& signature, + uint16 rrtype, const std::vector<base::StringPiece>& rrdatas) + { + unsigned signed_data_len = 0; + for (std::vector<base::StringPiece>::const_iterator i = + rrdatas.begin(); + i != rrdatas.end(); i++) { + signed_data_len += 2; + signed_data_len += i->size(); + } + scoped_array<unsigned char> signed_data(new unsigned + char[signed_data_len]); + } +} +