User account creation filtered due to spam.

Bug 47679

Summary: [5 Regression] Strange uninitialized warning after SRA
Product: gcc Reporter: Jakub Jelinek <jakub>
Component: tree-optimizationAssignee: Not yet assigned to anyone <unassigned>
Status: NEW ---    
Severity: normal CC: andysem, caolanm, dimhen, dtardon, gafnium, Laurent.Rineau__gcc, law, mika.fischer, rmansfield, rutsky.vladimir, Woebbeking
Priority: P2 Keywords: diagnostic
Version: 4.6.0   
Target Milestone: 5.5   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2011-03-03 11:26:57
Attachments: 676361.C
rh676361.C
Another warning appearance example

Description Jakub Jelinek 2011-02-10 14:44:42 UTC
On the attached testcase (simplified from #include <boost/optional> and then just getitem prototype and following lines) g++ starting with
http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=164136
issues a weird warning with -O2 -m64 -Wall:
warning: ‘*((void*)& aNewItem +8)’ may be used uninitialized in this function [-Wuninitialized]
(well, for some time it was an error about unhandled mem_ref in diagnostics). Before that commit no warnings were reported.

For more details see http://bugzilla.redhat.com/676361
Comment 1 Jakub Jelinek 2011-02-10 14:48:38 UTC
Created attachment 23294 [details]
676361.C
Comment 2 Jakub Jelinek 2011-02-10 15:43:53 UTC
Created attachment 23296 [details]
rh676361.C

Actually, that was delta reduced perhaps too much, by having operator! return false always it is certainly correct that it warns, as when the original is not initialized dummy_ will be used uninitialized.
Comment 3 Richard Biener 2011-02-10 16:19:05 UTC
As for the message for diagnostics (if we know that ...) we can generalize
it to warning: 'aNewItem' may be used uninitialized.  That's less precise
but does not contain funny pointer arith.  It would of course be bad to
do that for the generic tree dumpers.

But anyway, what's so strange about ‘*((void*)& aNewItem +8)’?  It was
invented exactly to avoid 'MEM[&aNewItem+8]'.
Comment 4 Jakub Jelinek 2011-02-10 16:20:13 UTC
So, before esra we have:
<bb 2>:
  aOldItem = getitem (); [return slot optimization]
  MEM[(struct optional_base *)&aNewItem].m_initialized = 0;
  D.3621_11 = MEM[(const struct optional_base *)this_2(D)];
  if (D.3621_11 != 0)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 3>:
  D.3623_13 = MEM[(const long unsigned int &)this_2(D) + 8];
  MEM[(internal_type *)&aNewItem + 8B] = D.3623_13;
  MEM[(struct optional_base *)&aNewItem].m_initialized = 1;

<bb 4>:
  D.3628_14 = MEM[(const struct optional_base *)&aOldItem];
  D.3629_15 = !D.3628_14;
  D.3630_16 = MEM[(const struct optional_base *)&aNewItem];
  D.3631_17 = !D.3630_16;
  if (D.3629_15 == D.3631_17)
    goto <bb 5>;
  else
    goto <bb 7>;

<bb 5>:
  D.3632_18 = MEM[(const struct optional_base *)&aOldItem];
  if (D.3632_18 == 0)
    goto <bb 7>;
  else
    goto <bb 6>;

<bb 6>:
  D.3634_19 = MEM[(const long unsigned int &)&aOldItem + 8];
  D.3633_20 = MEM[(const long unsigned int &)&aNewItem + 8];
  D.3635_21 = D.3634_19 == D.3633_20;

<bb 7>:
  # D.3635_22 = PHI <0(4), 1(5), D.3635_21(6)>

which has aNewItem+8 uninitialized if aNewItem.m_initialized is false, but then
aNewItem+8 isn't used either, just the condition is not very simple.
Then eSRA comes in and puts in an uninitialized SSA_NAME on one side of the PHI, but as the condition is too complicated we don't figure it out and warn anyway.

Not sure what can be done about it though,
return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
is simply too complicated even for the current predicate aware uninitialized variable analysis (http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00706.html), particularly figuring out that (*x) == (*y) is only invoked if !!x.

Another thing is why the MEM_REF in the diagnostic isn't printed as aNewItem.m_storage.dummy_ or aNewItem.m_storage.dummy_.data or aNewItem.m_storage.
Comment 5 Jakub Jelinek 2011-02-10 16:29:18 UTC
Changing boost slightly:
    template<class OptionalPointee> inline bool equal_pointees2 (OptionalPointee const& x, OptionalPointee const& y ) {
-    return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
+    if (!x && !y) return true;
+    if (!x || !y) return false;
+    return (*x) == (*y);
   }
makes the warning go away, then the predicate aware uninit analysis figures things out.  But the generated code for this testcase is then 3 bytes longer (though, same number of insns).
Comment 6 Richard Biener 2011-03-03 11:26:57 UTC
> Another thing is why the MEM_REF in the diagnostic isn't printed as
> aNewItem.m_storage.dummy_ or aNewItem.m_storage.dummy_.data or
> aNewItem.m_storage.

this is because it doesn't usually match the source and in some cases
is ambiguous.  It's by design.
Comment 7 Jakub Jelinek 2011-03-25 19:53:00 UTC
GCC 4.6.0 is being released, adjusting target milestone.
Comment 8 Jakub Jelinek 2011-06-27 12:33:07 UTC
GCC 4.6.1 is being released.
Comment 9 Jakub Jelinek 2011-10-26 17:13:51 UTC
GCC 4.6.2 is being released.
Comment 10 Jakub Jelinek 2012-03-01 14:39:05 UTC
GCC 4.6.3 is being released.
Comment 11 Jakub Jelinek 2013-04-12 15:16:20 UTC
GCC 4.6.4 has been released and the branch has been closed.
Comment 12 André Wöbbeking 2013-08-30 13:04:10 UTC
Does anyone look into this? The warnings are really annoying. 

FYI, Clang 3.3 doesn't warn about this.
Comment 13 Jackie Rosen 2014-02-16 13:12:47 UTC Comment hidden (spam)
Comment 14 Richard Biener 2014-06-12 13:43:31 UTC
The 4.7 branch is being closed, moving target milestone to 4.8.4.
Comment 15 Jakub Jelinek 2014-12-19 13:26:36 UTC
GCC 4.8.4 has been released.
Comment 16 Sergey Eliseev 2015-01-12 17:10:59 UTC
Created attachment 34425 [details]
Another warning appearance example

Found similar warning in optional value comparison. 
GCC 4.8.3, boost::optional 1.40 and 1.53 

Compile with -O2 -Wall -Werror
Comment 17 Jeffrey A. Law 2015-02-16 23:39:46 UTC
Couldn't this be seen as a failure to thread jumps?  In the rs676361 testcase we have the following relevant blocks after DOM2:

;;   basic block 2, loop depth 0
;;    pred:       ENTRY
  aOldItem = getitem (); [return slot optimization]
  aNewItem_19 = 0;
  _9 = MEM[(bool *)this_4(D)];
  if (_9 != 0)
    goto <bb 3>;
  else
    goto <bb 4>;
;;    succ:       3
;;                4

;;   basic block 3, loop depth 0
;;    pred:       2
  aNewItem$8_22 = MEM[(const long unsigned int &)this_4(D) + 8];
  aNewItem$8_20 = aNewItem$8_22;
  aNewItem_21 = 1;
;;    succ:       4

;;   basic block 4, loop depth 0
;;    pred:       3
;;                2
  # aNewItem_24 = PHI <1(3), 0(2)>
  # aNewItem$8_23 = PHI <aNewItem$8_22(3), aNewItem$8_6(D)(2)>
  _5 = MEM[(bool *)&aOldItem];
  _10 = ~_5;
  _11 = VIEW_CONVERT_EXPR<const bool>(aNewItem_24);
  _12 = ~_11;
  if (_10 == _12)
    goto <bb 5>;
  else
    goto <bb 7>;
;;    succ:       5
;;                7

;;   basic block 5, loop depth 0
;;    pred:       4
  if (_10 != 0)
    goto <bb 7>;
  else
    goto <bb 6>;
;;    succ:       7
;;                6

;;   basic block 6, loop depth 0
;;    pred:       5
  _13 = MEM[(const long unsigned int &)&aOldItem + 8];
  aNewItem$8_14 = aNewItem$8_23;
  iftmp.4_15 = _13 == aNewItem$8_23;
  _16 = ~iftmp.4_15;
  _17 = (int) _16;
;;    succ:       7


The key here is that we know the value of _12 depending on how we reach block #4.  If BB4 then transfers control to block #5 we'll also know the value of _10 which would allow us to thread jumps and I believe simplifies things enough to avoid the false positive, at least on the reduced case.  I haven't tried case from Sergey yet.

This appears to be caused by a few deficiencies in jump threading.  None appear to be major issues though.
Comment 18 Jeffrey A. Law 2015-04-15 18:52:21 UTC
Author: law
Date: Wed Apr 15 18:51:49 2015
New Revision: 222130

URL: https://gcc.gnu.org/viewcvs?rev=222130&root=gcc&view=rev
Log:
	PR tree-optimization/47679
	* tree-ssa-dom.c (build_and_record_new_cond): Moved to avoid
	need for forward declaration in upcoming changes.
	(record_conditions, record_edge_info): Likewise.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
Comment 19 Jeffrey A. Law 2015-04-17 19:24:49 UTC
Author: law
Date: Fri Apr 17 19:24:17 2015
New Revision: 222195

URL: https://gcc.gnu.org/viewcvs?rev=222195&root=gcc&view=rev
Log:
	PR tree-optimization/47679
	* Makefile.in (OBJS); Add tree-ssa-scopedtables.o.
	* tree-ssa-scopedtables.c: New file.
	* tree-ssa-scopedtables.h: New file.
	* tree-ssa-dom.c: Include tree-ssa-scopedtables.h.
	(const_and_copies): Change name/type.
	(record_const_or_copy): Move into tree-ssa-scopedtables.c
	(record_const_or_copy_1): Similarly.
	(restore_vars_to_original_value): Similarly.
	(pass_dominator::execute): Create and destroy const_and_copies table.
	(thread_across_edge): Update passing of const_and_copies.
	(record_temporary_equivalence): Use method calls rather than
	manipulating const_and_copies directly.
	(record_equality, cprop_into_successor_phis): Similarly.
	(dom_opt_dom_walker::before_dom_children): Similarly.
	(dom_opt_dom_walker::after_dom_children): Similarly.
	(eliminate_redundant_computations): Similarly.
	* tree-ssa-threadedge.c (remove_temporary_equivalences): Delete.
	(record_temporary_equivalence): Likewise.
	(invalidate_equivalences): Likewise.
	(record_temporary_equivalences_from_phis): Update due to type
	change of const_and_copies.  Use method calls rather than
	manipulating the stack directly.
	(record_temporary_equivalences_from_stmts_at_dest): Likewise.
	(thread_through_normal_block, thread_across_edge): Likewise.
	(thread_across_edge): Likewise.
	* tree-ssa-threadedge.h (thread_across_edge): Update prototype.
	* tree-vrp.c: Include tree-ssa-scopedtables.h.  Change type
	of equiv_stack.
	(identify_jump_threads): Update due to type change of equiv_stack.
	(finalize_jump_threads): Delete the equiv_stack when complete.

Added:
    trunk/gcc/tree-ssa-scopedtables.c
    trunk/gcc/tree-ssa-scopedtables.h
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/Makefile.in
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-loop-ch.c
    trunk/gcc/tree-ssa-threadedge.c
    trunk/gcc/tree-ssa-threadedge.h
    trunk/gcc/tree-vrp.c
Comment 20 Richard Biener 2015-06-23 08:15:50 UTC
The gcc-4_8-branch is being closed, re-targeting regressions to 4.9.3.
Comment 21 Jakub Jelinek 2015-06-26 19:53:06 UTC
GCC 4.9.3 has been released.
Comment 22 Jeffrey A. Law 2015-09-11 21:33:09 UTC
Author: law
Date: Fri Sep 11 21:32:38 2015
New Revision: 227697

URL: https://gcc.gnu.org/viewcvs?rev=227697&root=gcc&view=rev
Log:
[PATCH] Another small cleanup to the const_and_copies stack

2015-09-11  Jeff Law  <law@redhat.com>

	PR tree-optimization/47679
	* tree-ssa-dom.c (struct cond_equivalence): Update comment.
	* tree-ssa-scopedtables.h (class const_and_copies): Prefix data
	member with m_.  Update inline member functions as necessary.  Add
	toplevel comment.
	* tree-ssa-scopedtables.c: Update const_and_copies's member
	functions to use m_ prefix to access the stack.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-scopedtables.c
    trunk/gcc/tree-ssa-scopedtables.h
Comment 23 Jeffrey A. Law 2015-09-14 20:11:01 UTC
Author: law
Date: Mon Sep 14 20:10:30 2015
New Revision: 227762

URL: https://gcc.gnu.org/viewcvs?rev=227762&root=gcc&view=rev
Log:
[PATCH] Minor DOM cleanup

        PR tree-optimization/47679
	* tree-ssa-dom.c (avail_expr_hash): Pass a pointer to a real
	type rather than void *.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
Comment 24 Jeffrey A. Law 2015-09-15 17:04:20 UTC
Author: law
Date: Tue Sep 15 17:03:49 2015
New Revision: 227801

URL: https://gcc.gnu.org/viewcvs?rev=227801&root=gcc&view=rev
Log:
[PATCH] More class-ification of DOM

        PR tree-optimization/47679
	* tree-ssa-dom.c (expr_hash_elt): Now a class with ctors/dtors,
	methods and private members.
	(avail_exprs_stack): Similarly.  Change type of global
	from a pair of expr_hash_elt_t to the new class.
	(expr_elt_hasher::hash): Corresponding changes.
	(expr_elt_hasher::equal): Similarly.
	(avail_expr_hash): Similarly.
	(pass_dominator::execute): Similarly.
	(dom_opt_dom_walker::thread_across_edge): Similarly.
	(record_cond): Similarly.
	(dom_opt_dom_walker::before_dom_children): Similarly.
	(dom_opt_dom_walker::after_dom_children): Similarly.
	(lookup_avail_expr): Likewise.
	(initialize_hash_element): Now a expr_hash_elt constructor.
	(initialize_hash_element_from_expr): Similarly.
	(free_expr_hash_elt_contents): Now a dtor for class expr_hash_elt.
	(free_expr_hash_elt): Call dtor for the element.
	(remove_local_expressions_from_table): Now the "pop_to_marker"
	method in the available_exprs_stack class.
	(avail_expr_stack::record_expr): Method factored out.
	(print_expr_hash_elt): Now a method in the expr_hash_elt class.
	Fix formatting.
	(hashable_expr_equal_p): Fix formatting.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
Comment 25 Jeffrey A. Law 2015-09-16 17:26:24 UTC
Author: law
Date: Wed Sep 16 17:25:51 2015
New Revision: 227831

URL: https://gcc.gnu.org/viewcvs?rev=227831&root=gcc&view=rev
Log:
[PATCH] Move code out of tree-ssa-dom into tree-ssa-scopedtables

	PR tree-optimization/47679
	* tree-ssa-dom.c (enum expr_kind): Moved from here to
	tree-ssa-scopedtables.h.
	(struct hashable_expr, class expr_hash_elt): Likewise.
	(struct expr_elt_hasher, class avail_exprs_stack): Likewise.
	Move associated methods into tree-ssa-scopedtables.c.
	(avail_expr_hash, initialize_expr_from_cond): Similarly.
	(hashable_expr_equal_p, add_expr_commutative): Likewise.
	(add_hashable_expr): Likewise.
	(record_cond): Delete element directly.
	* tree-ssa-scopedtables.h (avail_expr_stack, const_and_copies): Add
	private copy ctor and assignment operator methods.
	(expr_elt_hasher): Inline trivial methods.
	(initialize_expr_from_cond): Prototype.
	* tree-ssa-scopedtables.c: Add necessary includes, functions and
	methods that were previously in tree-ssa-dom.c.  Improve various
	comments.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-scopedtables.c
    trunk/gcc/tree-ssa-scopedtables.h
Comment 26 Jeffrey A. Law 2015-09-17 03:01:35 UTC
Author: law
Date: Thu Sep 17 03:01:03 2015
New Revision: 227842

URL: https://gcc.gnu.org/viewcvs?rev=227842&root=gcc&view=rev
Log:
[PATCH] Pass in avail_expr_stack and setup edge_infos earlier

	PR tree-optimization/47679
	* tree-ssa-dom.c (free_edge_info): Factored out of free_all_edge_infos.
	(free_all_edge_infos): Use it.
	(allocate_edge_info): Free preexisting edge info data.
	(pass_dominator::execute): Set up initial edge info structures.
	(dom_opt_dom_walker::thread_across_edge): Pass avail_expr_stack to
	thread_across_edge.
	* tree-ssa-threadedge.c (thread_across_edge): Accept new argument.  If
	non-null, then push/pop markers appropriately.
	* tree-ssa-threadedge.h (thread_across_edge): Update prototype.
	* tree-vrp.c (identify_jump_threads): Pass NULL for new argument to
	thread-across_edge.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-threadedge.c
    trunk/gcc/tree-ssa-threadedge.h
    trunk/gcc/tree-vrp.c
Comment 27 Jeffrey A. Law 2015-09-18 15:29:33 UTC
Author: law
Date: Fri Sep 18 15:29:01 2015
New Revision: 227908

URL: https://gcc.gnu.org/viewcvs?rev=227908&root=gcc&view=rev
Log:
[PATCH] Break out phi-only cprop into its own file

	PR tree-optimization/47679
	* Makefile.in (OBJS): Add tree-ssa-phionlycprop.o
	* tree-ssa-dom.c: Remove unnecessary header includes.
	(remove_stmt_or_phi): Moved from here into tree-ssa-phionlycprop.c
	(get_rhs_or_phi_arg, get_lhs_or_phi_result): Likewise.
	(propagate_rhs_into_lhs, eliminate_const_or_copy): Likewise.
	(eliminate_degenerate_phis_1, pass_phi_only_cprop): Likewise.
	(pass_phi_only_cprop::execute): Likewise.
	(make_pass_phi_only_cprop): Likewise.
	* tree-ssa-phionlycprop.c: New file with moved code.  Eliminate
	uses of file scoped statics by passing the required objects
	as parameters wherever needed.

Added:
    trunk/gcc/tree-ssa-phionlycprop.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/Makefile.in
    trunk/gcc/tree-ssa-dom.c
Comment 28 Jeffrey A. Law 2015-09-18 19:34:20 UTC
Author: law
Date: Fri Sep 18 19:33:48 2015
New Revision: 227922

URL: https://gcc.gnu.org/viewcvs?rev=227922&root=gcc&view=rev
Log:
[PATCH] const_and_copies is no longer file scoped

        PR tree-optimization/47679
	* tree-ssa-dom.c (const_and_copies): No longer file scoped.  Move
	it here ...
	(dom_opt_dom_walker): New private member holding the const_and_copies
	object.  Update constructor.
	(pass_dominator::execute): Corresponding changes to declaration
	and initialization of const_and_copies.  Update constructor call
	for the dom_opt_dom_walker object.
	(record_temporary_equivalences): Accept const_and_copies argument
	pass it down to children as needed.
	(record_equality): Likewise.
	(record_equivalences_from_incoming_edge): Likewise.
	(cprop_into_successor_phis, optimize_stmt): Likewise.
	(eliminate_redundant_computations): Likewise.
	(dom_opt_dom_walker::thread_across_edge): Update access to
	const_and_copies object and pass it to children as needed.
	(dom_opt_dom_walker::before_dom_children): Similarly.
	(dom_opt_dom_walker::after_dom_children): Similarly.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
Comment 29 Jeffrey A. Law 2015-09-19 02:56:49 UTC
Author: law
Date: Sat Sep 19 02:56:15 2015
New Revision: 227931

URL: https://gcc.gnu.org/viewcvs?rev=227931&root=gcc&view=rev
Log:
[PATCH] avail_expr_stack is no longer file scoped

       PR tree-optimization/47679
        * tree-ssa-dom.c (avail_exprs_stack): No longer file scoped.  Move
        it here ...
        (dom_opt_dom_walker): New private member holding the avail_exprs_stack
        object.  Update constructor.
        (pass_dominator::execute):  Corresponding chagnes to declaration
        and initialization of avail_exprs_stack.  Update constructor call
        for dom_opt_dom_walker object.
        (lookup_avail_expr, record_cond): Accept additional argument.  Pass
        it down to children as needed.
        (record_equivalences_from_incoming_edge): Likewise.
        (eliminate_redundant_computations): Likewise.
        (record_equivalences_from_stmt): Likewise.
        (simplify_stmt_for_jump_threading): Likewise.
        (record_temporary_equivalences): Likewise.
        (optimize_stmt): Likewise.
        (dom_opt_dom_walker::thread_across_edge): Update access to
        avail_exprs_stack object and pass it to children as needed.
        (dom_opt_dom_walker::before_dom_children): Similarly.
        (dom_opt_dom_walker::after_dom_children): Similarly.
        * tree-ssa-threadedge.c (pfn_simplify): New typedef.
        (record_temporary_equivalences_from_stmts_at_dest): Use new typedef.
        Add avail_expr_stack argument.  Pass it to children as needed.
        (dummy_simplify): Likewise.
        (simplify_control_stmt_condition): Likewise.
        (thread_around_empty_blocks): Likewise.
        (thread_through_normal_block): Likewise.
        (thread_across_edge): Likewise.
        * tree-ssa-threadedge.h (thread_across_edge): Update prototype.
        * tree-vrp.c (simplify_stmt_for_jump_threading): Update.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-threadedge.c
    trunk/gcc/tree-ssa-threadedge.h
    trunk/gcc/tree-vrp.c
Comment 30 Jeffrey A. Law 2015-09-20 06:15:20 UTC
AFACT the testcase in c#16 is bogus.  If i is never equal to k, then opt is never assigned any value.  It's then used in the conditional outside the loop.  That's how it looks at the source level and that's also what it looks like in the dom2 dump.
Comment 31 Jeffrey A. Law 2015-09-20 06:38:17 UTC
Author: law
Date: Sun Sep 20 06:37:39 2015
New Revision: 227942

URL: https://gcc.gnu.org/viewcvs?rev=227942&root=gcc&view=rev
Log:
[PATCH] Fix 47679 by improving jump threading

	PR tree-optimization/47679
	* tree-ssa-dom.c (record_temporary_equivalences): No longer static.
	* tree-ssa-dom.h (record_temporary_equivalences): Add prototype.
	* tree-ssa-threadedge.c: Include tree-ssa-dom.h.
	(thread_through_normal_block): Use record_temporary_equivalences.

        PR tree-optimization/47679
	* g++.dg/warn/Wuninitialized-6.C: New test.

Added:
    trunk/gcc/testsuite/g++.dg/warn/Wuninitialized-6.C
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-dom.h
    trunk/gcc/tree-ssa-threadedge.c
Comment 32 Jeffrey A. Law 2015-09-20 06:39:19 UTC
Fixed on the trunk.  Not planning to backport the patch series to any of the release branches.
Comment 33 Richard Biener 2016-08-03 10:50:25 UTC
GCC 4.9 branch is being closed