From patchwork Mon Jul 11 09:08:25 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joern Rennecke X-Patchwork-Id: 104189 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id DA715B6F84 for ; Mon, 11 Jul 2011 19:08:47 +1000 (EST) Received: (qmail 10057 invoked by alias); 11 Jul 2011 09:08:43 -0000 Received: (qmail 10048 invoked by uid 22791); 11 Jul 2011 09:08:42 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from c60.cesmail.net (HELO c60.cesmail.net) (216.154.195.49) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Jul 2011 09:08:26 +0000 Received: from unknown (HELO epsilon2) ([192.168.1.60]) by c60.cesmail.net with ESMTP; 11 Jul 2011 05:08:25 -0400 Received: from e178024218.adsl.alicedsl.de (e178024218.adsl.alicedsl.de [85.178.24.218]) by webmail.spamcop.net (Horde MIME library) with HTTP; Mon, 11 Jul 2011 05:08:25 -0400 Message-ID: <20110711050825.zohqma67z4kso844-nzlynne@webmail.spamcop.net> Date: Mon, 11 Jul 2011 05:08:25 -0400 From: Joern Rennecke To: gcc-patches@gcc.gnu.org Subject: RFA: Fix bug in optimize_mode_switching MIME-Version: 1.0 User-Agent: Internet Messaging Program (IMP) H3 (4.1.4) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org I work on target with complex mode switching needs, so it can happen that in some block, for an entity a mode is provided without the need for a set. This causes the current optimize_mode_switching to crash when it later dereferences a NULL seginfo pointer. Fixed by using an actual flag to keep track if we have allocated any seginfo. Bootstrappded on x86_64-unknown-linux-gnu. 2011-07-08 Joern Rennecke * mode-switching.c (optimize_mode_switching): Fix bug in MODE_AFTER handling. Index: mode-switching.c =================================================================== --- mode-switching.c (revision 1670) +++ mode-switching.c (revision 1671) @@ -499,6 +499,7 @@ optimize_mode_switching (void) { struct seginfo *ptr; int last_mode = no_mode; + bool any_set_required = false; HARD_REG_SET live_now; REG_SET_TO_HARD_REG_SET (live_now, df_get_live_in (bb)); @@ -527,6 +528,7 @@ optimize_mode_switching (void) if (mode != no_mode && mode != last_mode) { + any_set_required = true; last_mode = mode; ptr = new_seginfo (mode, insn, bb->index, live_now); add_seginfo (info + bb->index, ptr); @@ -548,8 +550,10 @@ optimize_mode_switching (void) } info[bb->index].computing = last_mode; - /* Check for blocks without ANY mode requirements. */ - if (last_mode == no_mode) + /* Check for blocks without ANY mode requirements. + N.B. because of MODE_AFTER, last_mode might still be different + from no_mode. */ + if (!any_set_required) { ptr = new_seginfo (no_mode, BB_END (bb), bb->index, live_now); add_seginfo (info + bb->index, ptr);