From patchwork Wed Nov 10 23:16:19 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 70724 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 288D9B7114 for ; Thu, 11 Nov 2010 10:16:29 +1100 (EST) Received: (qmail 11065 invoked by alias); 10 Nov 2010 23:16:28 -0000 Received: (qmail 11055 invoked by uid 22791); 10 Nov 2010 23:16:27 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, TW_HF, T_RP_MATCHES_RCVD 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; Wed, 10 Nov 2010 23:16:22 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oAANGLRl002560 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 10 Nov 2010 18:16:21 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oAANGKAS026850 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 10 Nov 2010 18:16:21 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id oAANGKPo009792 for ; Thu, 11 Nov 2010 00:16:20 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id oAANGJrY009790 for gcc-patches@gcc.gnu.org; Thu, 11 Nov 2010 00:16:19 +0100 Date: Thu, 11 Nov 2010 00:16:19 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix var-tracking ICE (PR debug/46387) Message-ID: <20101110231619.GY29412@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 Hi! On IA-64 the attached testcase ICEs, because a MEM isn't properly invalidated in cselib which causes ICE when handling a COND_EXEC storing to that MEM. The problem is in the {sp,hfp}+off -> {cfa_base_rtx}+off2 replacements done by var-tracking, although the whole IL is transformed that way, on the side stuff computed by init_alias_analysis is not, and as alias analysis normally expects that argp based memory can't alias with sp based memory or hfp based memory (which is certainly true before reload and after reload argp shouldn't be normally used in the IL), find_base_term can be different between the hard reg containing some sp (or hfp) based address and VALUE corresponding to it. Fixed by telling (temporarily) alias.c that argp (resp. fp) can during var-tracking alias with sp (resp. hfp) based addresses. Bootstrapped/regtested on x86_64-linux and i686-linux and tested on the testcase with ia64-linux cross. Ok for trunk? 2010-11-09 Jakub Jelinek PR debug/46387 * rtl.h (equate_reg_base_value): New prototype. * alias.c (equate_reg_base_value): New function. * var-tracking.c (vt_init_cfa_base): Use it. (vt_finalize): Likewise. Clear cfa_base_rtx here... (vt_initialize): ... instead of here. * gcc.dg/pr46387.c: New test. Jakub --- gcc/rtl.h.jj 2010-11-03 16:58:17.000000000 +0100 +++ gcc/rtl.h 2010-11-09 19:49:35.000000000 +0100 @@ -2503,6 +2503,7 @@ extern int may_alias_p (const_rtx, const extern void init_alias_target (void); extern void init_alias_analysis (void); extern void end_alias_analysis (void); +extern void equate_reg_base_value (const_rtx, const_rtx); extern bool memory_modified_in_insn_p (const_rtx, const_rtx); extern rtx find_base_term (rtx); extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int); --- gcc/alias.c.jj 2010-11-01 09:07:23.000000000 +0100 +++ gcc/alias.c 2010-11-09 19:49:24.000000000 +0100 @@ -2906,6 +2906,26 @@ init_alias_analysis (void) timevar_pop (TV_ALIAS_ANALYSIS); } +/* Equate REG_BASE_VALUE (reg1) to REG_BASE_VALUE (reg2), + or reset it back to its original value if reg2 == reg1. */ + +void +equate_reg_base_value (const_rtx reg1, const_rtx reg2) +{ + gcc_assert (REGNO (reg1) < FIRST_PSEUDO_REGISTER + && REGNO (reg2) < FIRST_PSEUDO_REGISTER); + if (reg1 == reg2) + VEC_replace (rtx, reg_base_value, REGNO (reg1), + static_reg_base_value[REGNO (reg1)]); + else + { + gcc_assert (REG_BASE_VALUE (reg1) + == static_reg_base_value[REGNO (reg1)]); + VEC_replace (rtx, reg_base_value, REGNO (reg1), + REG_BASE_VALUE (reg2)); + } +} + void end_alias_analysis (void) { --- gcc/var-tracking.c.jj 2010-11-09 13:58:30.000000000 +0100 +++ gcc/var-tracking.c 2010-11-09 19:53:52.000000000 +0100 @@ -8229,6 +8229,11 @@ vt_init_cfa_base (void) if (!MAY_HAVE_DEBUG_INSNS) return; + /* Tell alias analysis that cfa_base_rtx should temporarily share + find_base_term value with stack pointer or hard frame pointer. */ + equate_reg_base_value (cfa_base_rtx, + frame_pointer_needed + ? hard_frame_pointer_rtx : stack_pointer_rtx); val = cselib_lookup_from_insn (cfa_base_rtx, GET_MODE (cfa_base_rtx), 1, get_insns ()); preserve_value (val); @@ -8460,7 +8465,6 @@ vt_initialize (void) hard_frame_pointer_adjustment = -1; VTI (ENTRY_BLOCK_PTR)->flooded = true; vt_add_function_parameters (); - cfa_base_rtx = NULL_RTX; return true; } @@ -8503,6 +8507,10 @@ vt_finalize (void) { basic_block bb; + if (cfa_base_rtx && MAY_HAVE_DEBUG_INSNS) + equate_reg_base_value (cfa_base_rtx, cfa_base_rtx); + cfa_base_rtx = NULL_RTX; + FOR_EACH_BB (bb) { VEC_free (micro_operation, heap, VTI (bb)->mos); --- gcc/testsuite/gcc.dg/pr46387.c.jj 2010-11-09 20:35:53.000000000 +0100 +++ gcc/testsuite/gcc.dg/pr46387.c 2010-11-09 20:35:44.000000000 +0100 @@ -0,0 +1,32 @@ +/* PR debug/46387 */ +/* { dg-do compile } */ +/* { dg-options "-g -O2" } */ + +struct S { double x; double y; short z; }; +int a = 0, b = 0, c; +void bar (int, int, int); +void baz (int *, int *, int *); + +void +foo (struct S *v) +{ + int x, y, z; + if (!a && b != 0) + return; + if (v->z) + baz (&x, &y, &z); + else + { + x = v->x; + y = v->y; + } + x = x / (5 + 1); + y = y / (5 + 1); + if (x < 0) + x = 0; + if (x > c - 1) + x = c - 1; + if (b == 0) + bar (x, y, 1); + return; +}