1. 24 Oct, 2018 5 commits
    • Remove reduntant dumps and make tp_first_run dump more compact. · 19b55958
      2018-10-24  Martin Liska  <mliska@suse.cz>
      
      	* cgraph.c (cgraph_node::dump):
      	Remove reduntant dumps and make tp_first_run dump more compact.
      2018-10-24  Martin Liska  <mliska@suse.cz>
      
      	* libgcov-profiler.c: Start from 1 in order to distinguish
      	functions which were seen and these that were not.
      
      From-SVN: r265454
      Martin Liska committed
    • re PR tree-optimization/87665 (gcc HEAD (svn: 265340) breaks elements on resize) · bf329927
      2018-10-24  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/87665
      	* tree-vect-data-refs.c (vect_preserves_scalar_order_p): Adjust
      	to reflect reality.
      
      	* gcc.dg/torture/pr87665.c: New testcase.
      
      From-SVN: r265452
      Richard Biener committed
    • 2018-10-24 François Dumont <fdumont@gcc.gnu.org> · 4b763dee
      	* include/debug/safe_unordered_container.h
      	(_Safe_unordered_container<>::_M_invalidate_locals): Take lambda
      	parameter type from local end variable.
      	(_Safe_unordered_container<>::_M_invalidate_all): Likewise.
      	* include/debug/unordered_map
      	(unordered_map<>::begin()): Use C++11 direct initialization.
      	(unordered_map<>::end()): Likewise.
      	(unordered_map<>::cbegin()): Likewise.
      	(unordered_map<>::cend()): Likewise.
      	(unordered_map<>::begin(size_type)): Likewise.
      	(unordered_map<>::end(size_type)): Likewise.
      	(unordered_map<>::cbegin(size_type)): Likewise.
      	(unordered_map<>::cend(size_type)): Likewise.
      	(unordered_map<>::emplace<>(_Args&&...)): Likewise.
      	(unordered_map<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
      	(unordered_map<>::insert(const value_type&)): Likewise.
      	(unordered_map<>::insert(value_type&&)): Likewise.
      	(unordered_map<>::insert<>(_Pair&&)): Likewise.
      	(unordered_map<>::insert(const_iterator, const value_type&)): Likewise.
      	(unordered_map<>::insert(const_iterator, value_type&&)): Likewise.
      	(unordered_map<>::insert<>(const_iterator, _Pair&&)): Likewise.
      	(unordered_map<>::try_emplace<>(const key_type&, _Args&&...)): Likewise.
      	(unordered_map<>::try_emplace<>(key_type&&, _Args&&...)): Likewise.
      	(unordered_map<>::try_emplace<>(const_iterator, const key_type&,
      	_Args&&...)): Likewise.
      	(unordered_map<>::try_emplace<>(const_iterator, key_type&&,
      	_Args&&...)): Likewise.
      	(unordered_map<>::insert_or_assign<>(const key_type&, _Obj&&)): Likewise.
      	(unordered_map<>::insert_or_assign<>(key_type&&, _Obj&&)): Likewise.
      	(unordered_map<>::insert_or_assign<>(const_iterator, const key_type&,
      	_Obj&&)): Likewise.
      	(unordered_map<>::insert_or_assign<>(const_iterator, key_type&&,
      	_Obj&&)): Likewise.
      	(unordered_map<>::insert(note_type&&)): Likewise.
      	(unordered_map<>::find(const key_type&)): Likewise.
      	(unordered_map<>::equal_range(const key_type&)): Likewise.
      	(unordered_map<>::_M_extract): New.
      	(unordered_map<>::extract(const_iterator)): Use latter.
      	(unordered_map<>::extract(const key_type&)): Likewise.
      	(unordered_map<>::_M_erase): New.
      	(unordered_map<>::erase(const key_type&)): Use latter.
      	(unordered_map<>::erase(const_iterator)): Likewise.
      	(unordered_map<>::erase(iterator)): Likewise.
      	(unordered_map<>::_M_invalidate): New.
      	(unordered_map<>::erase(const_iterator, const_iterator)): Use latter.
      	(unordered_multimap<>::begin()): Use C++11 direct initialization.
      	(unordered_multimap<>::end()): Likewise.
      	(unordered_multimap<>::cbegin()): Likewise.
      	(unordered_multimap<>::cend()): Likewise.
      	(unordered_multimap<>::begin(size_type)): Likewise.
      	(unordered_multimap<>::end(size_type)): Likewise.
      	(unordered_multimap<>::cbegin(size_type)): Likewise.
      	(unordered_multimap<>::cend(size_type)): Likewise.
      	(unordered_multimap<>::emplace<>(_Args&&...)): Likewise.
      	(unordered_multimap<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
      	(unordered_multimap<>::insert(const value_type&)): Likewise.
      	(unordered_multimap<>::insert(const_iterator, const value_type&)): Likewise.
      	(unordered_multimap<>::insert(const_iterator, value_type&&)): Likewise.
      	(unordered_multimap<>::insert<>(_Pair&&)): Likewise.
      	(unordered_multimap<>::insert<>(const_iterator, _Pair&&)): Likewise.
      	(unordered_multimap<>::insert(note_type&&)): Likewise.
      	(unordered_multimap<>::insert(const_iterator, note_type&&)): Likewise.
      	(unordered_multimap<>::find(const key_type&)): Likewise.
      	(unordered_multimap<>::equal_range(const key_type&)): Likewise.
      	(unordered_multimap<>::_M_extract): New.
      	(unordered_multimap<>::extract(const_iterator)): Use latter.
      	(unordered_multimap<>::extract(const key_type&)): Likewise.
      	(unordered_multimap<>::_M_erase): New.
      	(unordered_multimap<>::erase(const_iterator)): Likewise.
      	(unordered_multimap<>::erase(iterator)): Likewise.
      	(unordered_multimap<>::_M_invalidate): New.
      	(unordered_multimap<>::erase(const key_type&)): Use latter.
      	(unordered_multimap<>::erase(const_iterator, const_iterator)): Likewise.
      	* include/debug/unordered_set
      	(unordered_set<>::begin()): Use C++11 direct initialization.
      	(unordered_set<>::end()): Likewise.
      	(unordered_set<>::cbegin()): Likewise.
      	(unordered_set<>::cend()): Likewise.
      	(unordered_set<>::begin(size_type)): Likewise.
      	(unordered_set<>::end(size_type)): Likewise.
      	(unordered_set<>::cbegin(size_type)): Likewise.
      	(unordered_set<>::cend(size_type)): Likewise.
      	(unordered_set<>::emplace<>(_Args&&...)): Likewise.
      	(unordered_set<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
      	(unordered_set<>::insert(const value_type&)): Likewise.
      	(unordered_set<>::insert(value_type&&)): Likewise.
      	(unordered_set<>::insert(const_iterator, const value_type&)): Likewise.
      	(unordered_set<>::insert(const_iterator, value_type&&)): Likewise.
      	(unordered_set<>::insert(note_type&&)): Likewise.
      	(unordered_set<>::insert(const_iterator, note_type&&)): Likewise.
      	(unordered_set<>::find(const key_type&)): Likewise.
      	(unordered_set<>::equal_range(const key_type&)): Likewise.
      	(unordered_set<>::_M_extract): New.
      	(unordered_set<>::extract(const_iterator)): Use latter.
      	(unordered_set<>::extract(const key_type&)): Likewise.
      	(unordered_set<>::_M_erase): New.
      	(unordered_set<>::erase(const key_type&)): Use latter.
      	(unordered_set<>::erase(const_iterator)): Likewise.
      	(unordered_set<>::erase(iterator)): Likewise.
      	(unordered_set<>::_M_invalidate): New.
      	(unordered_set<>::erase(const_iterator, const_iterator)): Use latter.
      	(unordered_multiset<>::begin()): Use C++11 direct initialization.
      	(unordered_multiset<>::end()): Likewise.
      	(unordered_multiset<>::cbegin()): Likewise.
      	(unordered_multiset<>::cend()): Likewise.
      	(unordered_multiset<>::begin(size_type)): Likewise.
      	(unordered_multiset<>::end(size_type)): Likewise.
      	(unordered_multiset<>::cbegin(size_type)): Likewise.
      	(unordered_multiset<>::cend(size_type)): Likewise.
      	(unordered_multiset<>::emplace<>(_Args&&...)): Likewise.
      	(unordered_multiset<>::emplace_hint<>(const_iterator, _Args&&...)): Likewise.
      	(unordered_multiset<>::insert(const value_type&)): Likewise.
      	(unordered_multiset<>::insert(const_iterator, const value_type&)): Likewise.
      	(unordered_multiset<>::insert(value_type&&)): Likewise.
      	(unordered_multiset<>::insert(const_iterator, value_type&&)): Likewise.
      	(unordered_multiset<>::insert(node_type&&)): Likewise.
      	(unordered_multiset<>::insert(const_iterator, node_type&&)): Likewise.
      	(unordered_multiset<>::find(const key_type&)): Likewise.
      	(unordered_multiset<>::equal_range(const key_type&)): Likewise.
      	(unordered_multiset<>::_M_extract): New.
      	(unordered_multiset<>::extract(const_iterator)): Use latter.
      	(unordered_multiset<>::extract(const key_type&)): Likewise.
      	(unordered_multiset<>::_M_erase): New.
      	(unordered_multiset<>::erase(const_iterator)): Likewise.
      	(unordered_multiset<>::erase(iterator)): Likewise.
      	(unordered_multiset<>::_M_invalidate): New.
      	(unordered_multiset<>::erase(const key_type&)): Use latter.
      	(unordered_multiset<>::erase(const_iterator, const_iterator)): Likewise.
      
      From-SVN: r265451
      François Dumont committed
    • cstddef: Add versioned namespace. · a01fc83f
      2018-10-24  François Dumont  <fdumont@gcc.gnu.org>
      
      	* include/c_global/cstddef: Add versioned namespace.
      
      From-SVN: r265450
      François Dumont committed
    • Daily bump. · d21dad98
      From-SVN: r265448
      GCC Administrator committed
  2. 23 Oct, 2018 17 commits
  3. 22 Oct, 2018 18 commits
    • symtab.c (symtab_node::increase_alignment): Correct max alignment check. · 97580980
      	* symtab.c (symtab_node::increase_alignment): Correct max
      	alignment check.
      
      From-SVN: r265404
      Paul Koning committed
    • re PR tree-optimization/87633 (ice in compare_range_wit h_value, at vr-values.c:1702) · f3842847
      2018-10-22  Yury Gribov  <tetra2005@gmail.com>
      
      gcc/
      	PR tree-optimization/87633
      	* match.pd: Do not generate unordered integer comparisons.
      
      gcc/testsuite/
      	PR tree-optimization/87633
      	* g++.dg/pr87633.C: New test.
      
      From-SVN: r265399
      Yury Gribov committed
    • combine: Do not combine moves from hard registers · 8d2d3958
      On most targets every function starts with moves from the parameter
      passing (hard) registers into pseudos.  Similarly, after every call
      there is a move from the return register into a pseudo.  These moves
      usually combine with later instructions (leaving pretty much the same
      instruction, just with a hard reg instead of a pseudo).
      
      This isn't a good idea.  Register allocation can get rid of unnecessary
      moves just fine, and moving the parameter passing registers into many
      later instructions tends to prevent good register allocation.  This
      patch disallows combining moves from a hard (non-fixed) register.
      
      This also avoid the problem mentioned in PR87600 #c3 (combining hard
      registers into inline assembler is problematic).
      
      Because the register move can often be combined with other instructions
      *itself*, for example for setting some condition code, this patch adds
      extra copies via new pseudos after every copy-from-hard-reg.
      
      On some targets this reduces average code size.  On others it increases
      it a bit, 0.1% or 0.2% or so.  (I tested this on all *-linux targets).
      
      
      	PR rtl-optimization/87600
      	* combine.c: Add include of expr.h.
      	(cant_combine_insn_p): Do not combine moves from any hard non-fixed
      	register to a pseudo.
      	(make_more_copies): New function, add a copy to a new pseudo after
      	the moves from hard registers into pseudos.
      	(rest_of_handle_combine): Declare rebuild_jump_labels_after_combine
      	later.  Call make_more_copies.
      
      From-SVN: r265398
      Segher Boessenkool committed
    • re PR testsuite/87694 (problem in g++.dg/concepts/memfun-err.C starting with r263343) · f3b13f46
      	PR testsuite/87694
      	* g++.dg/concepts/memfun-err.C: Make it a compile test.
      
      From-SVN: r265397
      Marek Polacek committed
    • Don't double-count early-clobber matches. · dbe7895c
      Given a pattern with a number of operands:
      
      (match_operand 0 "" "=&v")
      (match_operand 1 "" " v0")
      (match_operand 2 "" " v0")
      (match_operand 3 "" " v0")
      
      GCC will currently increment "reject" once, for operand 0, and then decrement
      it once for each of the other operands, ending with reject == -2 and an
      assertion failure.  If there's a conflict then it might try to decrement reject
      yet again.
      
      Incidentally, what these patterns are trying to achieve is an allocation in
      which operand 0 may match one of the other operands, but may not partially
      overlap any of them.  Ideally there'd be a better way to do this.
      
      In any case, it will affect any pattern in which multiple operands may (or
      must) match an early-clobber operand.
      
      The patch only allows a reject-- when one has not already occurred, for that
      operand.
      
      2018-10-22  Andrew Stubbs  <ams@codesourcery.com>
      
      	gcc/
      	* lra-constraints.c (process_alt_operands): New local array,
      	matching_early_clobber.  Check matching_early_clobber before
      	decrementing reject, and set matching_early_clobber after.
      
      From-SVN: r265393
      Andrew Stubbs committed
    • rs6000: Handle print_operand_address for unexpected RTL (PR87598) · b333d8b6
      As the PR shows, the user can force this to be called on at least some
      RTL that is not a valid address.  Most targets treat this as if the
      user knows best; let's do the same.
      
      
      	PR target/87598
      	* config/rs6000/rs6000.c (print_operand_address): For unexpected RTL
      	call output_addr_const and hope for the best.
      
      From-SVN: r265392
      Segher Boessenkool committed
    • 2018-10-22 Richard Biener <rguenther@suse.de> · e86087ee
      	* gimple-ssa-evrp-analyze.c
      	(evrp_range_analyzer::record_ranges_from_incoming_edge): Be
      	smarter about what ranges to use.
      	* tree-vrp.c (add_assert_info): Dump here.
      	(register_edge_assert_for_2): Instead of here at multiple but
      	not all places.
      
      	* gcc.dg/tree-ssa/evrp12.c: New testcase.
      	* gcc.dg/predict-6.c: Adjust.
      	* gcc.dg/tree-ssa/vrp33.c: Disable EVRP.
      	* gcc.dg/tree-ssa/vrp02.c: Likewise.
      	* gcc.dg/tree-ssa/cunroll-9.c: Likewise.
      
      From-SVN: r265391
      Richard Biener committed
    • re PR middle-end/63155 (memory hog) · d1e14d97
      2018-10-22  Steven Bosscher <steven@gcc.gnu.org>
      	Richard Biener  <rguenther@suse.de>
      
      	* bitmap.h: Update data structure documentation, including a
      	description of bitmap views as either linked-lists or splay trees.
      	(struct bitmap_element_def): Update comments for splay tree bitmaps.
      	(struct bitmap_head_def): Likewise.
      	(bitmap_list_view, bitmap_tree_view): New prototypes.
      	(bitmap_initialize_stat): Initialize a bitmap_head's indx and
      	tree_form fields.
      	(bmp_iter_set_init): Assert the iterated bitmaps are in list form.
      	(bmp_iter_and_init, bmp_iter_and_compl_init): Likewise.
      	* bitmap.c (bitmap_elem_to_freelist): Unregister overhead of a
      	released bitmap element here.
      	(bitmap_element_free): Remove.
      	(bitmap_elt_clear_from): Work on splay tree bitmaps.
      	(bitmap_list_link_element): Renamed from bitmap_element_link.  Move
      	this function similar ones such that linked-list bitmap implementation
      	functions are grouped.
      	(bitmap_list_unlink_element): Renamed from bitmap_element_unlink,
      	and moved for grouping.
      	(bitmap_list_insert_element_after): Renamed from
      	bitmap_elt_insert_after, and moved for grouping.
      	(bitmap_list_find_element): New function spliced from bitmap_find_bit.
      	(bitmap_tree_link_left, bitmap_tree_link_right,
      	bitmap_tree_rotate_left, bitmap_tree_rotate_right, bitmap_tree_splay,
      	bitmap_tree_link_element, bitmap_tree_unlink_element,
      	bitmap_tree_find_element): New functions for splay-tree bitmap
      	implementation.
      	(bitmap_element_link, bitmap_element_unlink, bitmap_elt_insert_after):
      	Renamed and moved, see above entries.
      	(bitmap_tree_listify_from): New function to convert part of a splay
      	tree bitmap to a linked-list bitmap.
      	(bitmap_list_view): Convert a splay tree bitmap to linked-list form.
      	(bitmap_tree_view): Convert a linked-list bitmap to splay tree form.
      	(bitmap_find_bit): Remove.
      	(bitmap_clear, bitmap_clear_bit, bitmap_set_bit,
      	bitmap_single_bit_set_p, bitmap_first_set_bit, bitmap_last_set_bit):
      	Handle splay tree bitmaps.
      	(bitmap_copy, bitmap_count_bits, bitmap_and, bitmap_and_into,
      	bitmap_elt_copy, bitmap_and_compl, bitmap_and_compl_into,
      	bitmap_compl_and_into, bitmap_elt_ior, bitmap_ior, bitmap_ior_into,
      	bitmap_xor, bitmap_xor_into, bitmap_equal_p, bitmap_intersect_p,
      	bitmap_intersect_compl_p, bitmap_ior_and_compl,
      	bitmap_ior_and_compl_into, bitmap_set_range, bitmap_clear_range,
      	bitmap_hash): Reject trying to act on splay tree bitmaps.  Make
      	corresponding changes to use linked-list specific bitmap_element
      	manipulation functions as applicable for efficiency.
      	(bitmap_tree_to_vec): New function.
      	(debug_bitmap_elt_file): New function split out from ...
      	(debug_bitmap_file): ... here.  Handle splay tree bitmaps.
      	(bitmap_print): Likewise.
      
      	PR tree-optimization/63155
      	* tree-ssa-propagate.c (ssa_prop_init): Use tree-view for the
      	SSA edge worklists.
      	* tree-ssa-coalesce.c (coalesce_ssa_name): Populate used_in_copies
      	in tree-view.
      
      From-SVN: r265390
      Steven Bosscher committed
    • Index... · ddec5aea
      Index: gcc/config/rs6000/emmintrin.h
      ===================================================================
      --- gcc/config/rs6000/emmintrin.h	(revision 265318)
      +++ gcc/config/rs6000/emmintrin.h	(working copy)
      @@ -85,7 +85,7 @@ typedef double __m128d __attribute__ ((__vector_si
       typedef long long __m128i_u __attribute__ ((__vector_size__ (16), __may_alias__, __aligned__ (1)));
       typedef double __m128d_u __attribute__ ((__vector_size__ (16), __may_alias__, __aligned__ (1)));
       
      -/* Define two value permute mask */
      +/* Define two value permute mask.  */
       #define _MM_SHUFFLE2(x,y) (((x) << 1) | (y))
       
       /* Create a vector with element 0 as F and the rest zero.  */
      @@ -201,7 +201,7 @@ _mm_store_pd (double *__P, __m128d __A)
       extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
       _mm_storeu_pd (double *__P, __m128d __A)
       {
      -  *(__m128d *)__P = __A;
      +  *(__m128d_u *)__P = __A;
       }
       
       /* Stores the lower DPFP value.  */
      @@ -2175,7 +2175,7 @@ _mm_maskmoveu_si128 (__m128i __A, __m128i __B, cha
       {
         __v2du hibit = { 0x7f7f7f7f7f7f7f7fUL, 0x7f7f7f7f7f7f7f7fUL};
         __v16qu mask, tmp;
      -  __m128i *p = (__m128i*)__C;
      +  __m128i_u *p = (__m128i_u*)__C;
       
         tmp = (__v16qu)_mm_loadu_si128(p);
         mask = (__v16qu)vec_cmpgt ((__v16qu)__B, (__v16qu)hibit);
      Index: gcc/config/rs6000/xmmintrin.h
      ===================================================================
      --- gcc/config/rs6000/xmmintrin.h	(revision 265318)
      +++ gcc/config/rs6000/xmmintrin.h	(working copy)
      @@ -85,6 +85,10 @@
          vector types, and their scalar components.  */
       typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
       
      +/* Unaligned version of the same type.  */
      +typedef float __m128_u __attribute__ ((__vector_size__ (16), __may_alias__,
      +				       __aligned__ (1)));
      +
       /* Internal data types for implementing the intrinsics.  */
       typedef float __v4sf __attribute__ ((__vector_size__ (16)));
       
      @@ -172,7 +176,7 @@ _mm_store_ps (float *__P, __m128 __A)
       extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
       _mm_storeu_ps (float *__P, __m128 __A)
       {
      -  *(__m128 *)__P = __A;
      +  *(__m128_u *)__P = __A;
       }
       
       /* Store four SPFP values in reverse order.  The address must be aligned.  */
      
      From-SVN: r265389
      William Schmidt committed
    • Revert r263947. · d78bcb13
      2018-10-22  Martin Liska  <mliska@suse.cz>
      
        PR tree-optimization/87686
      	Revert
      	2018-08-29  Martin Liska  <mliska@suse.cz>
      
      	* tree-switch-conversion.c (switch_conversion::expand):
      	Strenghten assumption about gswitch statements.
      2018-10-22  Martin Liska  <mliska@suse.cz>
      
        PR tree-optimization/87686
      	* g++.dg/tree-ssa/pr87686.C: New test.
      
      From-SVN: r265388
      Martin Liska committed
    • Iterate -std=c++-* in i386.exp. · c7acc296
      2018-10-22  Jakub Jelinek  <jakub@redhat.com>
      
      	* g++.target/i386/i386.exp: Use g++-dg-runtest to iterate
      	properly -std= options.
      
      From-SVN: r265387
      Jakub Jelinek committed
    • Simplify comparison of attrs in IPA ICF. · 14762cd0
      2018-10-22  Martin Liska  <mliska@suse.cz>
      
      	* ipa-icf.c (sem_item::compare_attributes): Remove.
      	(sem_item::compare_referenced_symbol_properties): Use
      	attribute_list_equal instead.
      	(sem_function::equals_wpa): Likewise.
      	* ipa-icf.h: Remove compare_attributes.
      
      From-SVN: r265386
      Martin Liska committed
    • scop-4.c: Avoid out-of-bound access. · f79de13a
      2018-10-22  Richard Biener  <rguenther@suse.de>
      
      	* gcc.dg/graphite/scop-4.c: Avoid out-of-bound access.
      
      From-SVN: r265385
      Richard Biener committed
    • utils.c (unchecked_convert): Use local variables for the biased and reverse SSO… · 39c61276
      utils.c (unchecked_convert): Use local variables for the biased and reverse SSO attributes of both types.
      
      	* gcc-interface/utils.c (unchecked_convert): Use local variables for
      	the biased and reverse SSO attributes of both types.
      	Further extend the processing of integral types in the presence of
      	reverse SSO to all scalar types.
      
      From-SVN: r265381
      Eric Botcazou committed
    • trans.c (Pragma_to_gnu): Use a simple memory constraint in all cases. · 9e4cacfa
      	* gcc-interface/trans.c (Pragma_to_gnu) <Pragma_Inspection_Point>: Use
      	a simple memory constraint in all cases.
      
      	* gcc-interface/lang-specs.h: Bump copyright year.
      
      From-SVN: r265378
      Eric Botcazou committed
    • warn19.ad[sb]: New test. · bbc96027
      	* gnat.dg/warn19.ad[sb]: New test.
      	* gnat.dg/warn19_pkg.ads: New helper.
      
      From-SVN: r265377
      Eric Botcazou committed
    • re PR c/87682 (gcc/mem-stats.h:172: possible broken comparison operator ?) · 2c2f8674
      2018-10-22  Richard Biener  <rguenther@suse.de>
      
      	PR middle-end/87682
      	* mem-stats.h (mem_usage::operator==): Fix pasto.
      
      From-SVN: r265376
      Richard Biener committed
    • re PR bootstrap/87640 (internal compiler error: in check, at tree-vrp.c:155) · 893ade8b
      2018-10-22  Richard Biener  <rguenther@suse.de>
      
      	PR tree-optimization/87640
      	* tree-vrp.c (set_value_range_with_overflow): Decompose
      	incomplete result.
      	(extract_range_from_binary_expr_1): Adjust.
      
      	* gcc.dg/torture/pr87640.c: New testcase.
      
      From-SVN: r265375
      Richard Biener committed