From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9757 invoked by alias); 18 Dec 2010 07:34:42 -0000 Received: (qmail 9645 invoked by uid 22791); 18 Dec 2010 07:34:40 -0000 X-SWARE-Spam-Status: No, hits=-5.3 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_TM,T_RP_MATCHES_RCVD,T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 18 Dec 2010 07:34:35 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oBI7YX4t026486 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 18 Dec 2010 02:34:33 -0500 Received: from freie.oliva.athome.lsd.ic.unicamp.br (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBI7YVDi032675 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sat, 18 Dec 2010 02:34:33 -0500 Received: from livre.localdomain (livre-to-gw.oliva.athome.lsd.ic.unicamp.br [172.31.160.19]) by freie.oliva.athome.lsd.ic.unicamp.br (8.14.4/8.14.4) with ESMTP id oBI7YUwi029340 for ; Sat, 18 Dec 2010 05:34:31 -0200 Received: from livre.localdomain (aoliva@localhost [127.0.0.1]) by livre.localdomain (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id oBI7YUB1007379; Sat, 18 Dec 2010 05:34:30 -0200 Received: (from aoliva@localhost) by livre.localdomain (8.14.3/8.14.3/Submit) id oBI7YT3w007378; Sat, 18 Dec 2010 05:34:29 -0200 From: Alexandre Oliva To: gcc-patches@gcc.gnu.org Subject: [PR debug/46931] don't crash propagating removed DEFs into debug stmts Date: Sat, 18 Dec 2010 11:39:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2010-12/txt/msg01449.txt.bz2 --=-=-= Content-length: 700 The tree vectorizer sometimes creates DEFs and removes them before the end of the pass. By the time of the removal, the SSA name is still marked as needing updates, so we skip the code that might introduce a debug temp before the DEF. By the time we actually release the DEF, calling that code again, the DEF is no longer in the stmt seq, so we can't tell where to insert the debug temp. We could just drop the debug info on the floor, but if the value is unchanging, we can still propagate it to debug stmts that use that SSA name. This is what this patch does, also avoiding the ICE we got trying to figure out where to insert the debug temp. Regstrapped on x86_64-linux-gnu. Ok to install? --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=vta-remove-ssa-name-before-update-pr46931.patch Content-length: 2727 for gcc/ChangeLog from Alexandre Oliva PR debug/46931 * tree-ssa.c (insert_debug_temp_for_var_def): Handle removed assignments. Index: gcc/tree-ssa.c =================================================================== --- gcc/tree-ssa.c.orig 2010-12-17 01:07:57.818499387 -0200 +++ gcc/tree-ssa.c 2010-12-17 04:01:43.577493644 -0200 @@ -305,6 +305,8 @@ insert_debug_temp_for_var_def (gimple_st gimple def_stmt = NULL; int usecount = 0; tree value = NULL; + tree value_unshare = NULL; + tree temp_value = NULL; if (!MAY_HAVE_DEBUG_STMTS) return; @@ -421,6 +423,12 @@ insert_debug_temp_for_var_def (gimple_st || is_gimple_min_invariant (value))) || is_gimple_reg (value)) value = unshare_expr (value); + else if (!gsi && !gimple_bb (def_stmt)) + { + if (is_gimple_min_invariant (value)) + value_unshare = value; + value = NULL; + } else { gimple def_temp; @@ -454,13 +462,48 @@ insert_debug_temp_for_var_def (gimple_st if (!gimple_debug_bind_p (stmt)) continue; + /* If we have a value that needs unsharing, unshare it. Then, + if the debug stmt binds to VAR, we can replace it, otherwise + we'll create a debug temp, bind it to the unshared value + right before STMT, and replace uses of VAR with the debug + temp. We reuse the same temp for multiple uses, but we don't + attempt to avoid emitting debug temps that would be dominated + by identical debug bind stmts. */ + if (value_unshare) + { + value = unshare_expr (value_unshare); + if (gimple_debug_bind_get_value (stmt) != var) + { + gimple def_temp; + gimple_stmt_iterator ngsi = gsi_for_stmt (stmt); + + if (!temp_value) + { + temp_value = make_node (DEBUG_EXPR_DECL); + + DECL_ARTIFICIAL (temp_value) = 1; + TREE_TYPE (temp_value) = TREE_TYPE (value); + if (DECL_P (value)) + DECL_MODE (temp_value) = DECL_MODE (value); + else + DECL_MODE (temp_value) = TYPE_MODE (TREE_TYPE (value)); + } + + def_temp = gimple_build_debug_bind (temp_value, value, + def_stmt); + + gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT); + + value = temp_value; + } + } + if (value) FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter) - /* unshare_expr is not needed here. vexpr is either a + /* unshare_expr is not needed here. value is either a SINGLE_RHS, that can be safely shared, some other RHS that was unshared when we found it had a single debug - use, or a DEBUG_EXPR_DECL, that can be safely - shared. */ + use, or a DEBUG_EXPR_DECL, that can be safely shared. */ SET_USE (use_p, value); else gimple_debug_bind_reset_value (stmt); --=-=-= Content-length: 257 -- Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ You must be the change you wish to see in the world. -- Gandhi Be Free! -- http://FSFLA.org/ FSF Latin America board member Free Software Evangelist Red Hat Brazil Compiler Engineer --=-=-=--