https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107411
--- Comment #6 from qinzhao at gcc dot gnu.org --- (In reply to Richard Biener from comment #2) > > The gimplifier instead of > > _1 = t (); > D.2389 = _1; > e = &D.2389; > _2 = *e; > f (_2); > > produces > > _1 = .DEFERRED_INIT (4, 2, &"D.2389"[0]); > D.2389 = _1; > e = .DEFERRED_INIT (8, 2, &"e"[0]); > _2 = t (); > D.2389 = _2; > e = &D.2389; > _3 = *e; > f (_3); > > which is odd and sub-optimal at least. Doing such things makes us rely > on DSE to elide the uninit "inits". actually, this is because, The simplifier sees the following IR from FE (.original) const int D.2768; const int & e; <<cleanup_point <<< Unknown tree: expr_stmt (void) (e = D.2768 = t ();, (const int &) &D.2768;) >>>>>; <<cleanup_point <<< Unknown tree: expr_stmt f ((int) *e) >>>>>; } i.e, it sees two DECL_EXPR "D.2768" and "e" without any initialization first, and then see the "CLEANUP_POINT_EXPR" which include the initializations to "e" and "D.2768". since it doesn't see any connections between these two DECL_EXPRs and the initializations inside "CLEANUP_POINT_EXPR", it just treats the two DECL_EXPRs as not initialized, therefore add the .DEFERED_INIT to them. the best approach to resolve this issue is: if there is any connection between DECL_EXPR "D.2768","e" and their initializations inside "CLEANUP_POINT_EXPR" that can be checked from IR, then during "gimplify_decl_expr", we can avoid generating .DEFERRED_INIT to them; my question is: in the current IR from C++ FE, is there any bit I can check to make sure that the DECL_EXPR "D.2768" and "e" already have initialization inside "CLEANUP_POINT_EXPR"?