From patchwork Sat Aug 18 08:14:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 178435 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 7CFFF2C008D for ; Sat, 18 Aug 2012 18:14:31 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1345882472; h=Comment: DomainKey-Signature:Received:Received:Received:Received: MIME-Version:Received:Received:In-Reply-To:References:Date: Message-ID:Subject:From:To:Cc:Content-Type:Mailing-List: Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:Sender:Delivered-To; bh=99/ljRmJby78T7mDiEz60oaufqg=; b=ELT8b3SKS/lDPhJr/QPcaxJYbk6gtO6gpCsjOe5q6Y9U3dfV832N2B1Tps2VKZ RMLc/D8t7nQBG1SpBhvpjZl5uXmi51DnK6wnTCCDsAW0wn29iHBPHFdYO5/5rwuI /H8iIS8Iree6Yupc+bjrrHuL6m7J9UPPW48nBjzlRqMU4= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:MIME-Version:Received:Received:In-Reply-To:References:Date:Message-ID:Subject:From:To:Cc:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=MZaK8zcZh9sexYnTsN0jLqssQYsw8QAf9U5RrUW924zo1Qnem1GB3SXrSyPlIP ALVmWaIUdaRtY7gaZmAVFZjMCqBWBBUhvTKqwZMHptz4eSxAy3uv6VQyMqWMeh9o NDtkT70jXWph0J/5ABJ88cKM9dCeyE6bwYzEupYfgK/cI=; Received: (qmail 24864 invoked by alias); 18 Aug 2012 08:14:22 -0000 Received: (qmail 24839 invoked by uid 22791); 18 Aug 2012 08:14:17 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, KHOP_RCVD_TRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_ZJ X-Spam-Check-By: sourceware.org Received: from mail-pb0-f47.google.com (HELO mail-pb0-f47.google.com) (209.85.160.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 18 Aug 2012 08:14:04 +0000 Received: by pbcwy7 with SMTP id wy7so4653245pbc.20 for ; Sat, 18 Aug 2012 01:14:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.68.228.98 with SMTP id sh2mr17606908pbc.95.1345277644083; Sat, 18 Aug 2012 01:14:04 -0700 (PDT) Received: by 10.66.251.227 with HTTP; Sat, 18 Aug 2012 01:14:03 -0700 (PDT) In-Reply-To: <1345238769.2144.49.camel@yam-132-YW-E178-FTW> References: <1345233529.2144.24.camel@yam-132-YW-E178-FTW> <1345238769.2144.49.camel@yam-132-YW-E178-FTW> Date: Sat, 18 Aug 2012 10:14:03 +0200 Message-ID: Subject: [PATCH v2, rtl-optimization]: Fix PR46829, ICE in spill_failure with -fschedule-insns [was: Fixing instability of -fschedule-insns for x86] From: Uros Bizjak To: Oleg Endo Cc: gcc-patches@gcc.gnu.org, Jakub Jelinek , Richard Guenther , Yuri Rumyantsev , Igor Zamyatin 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 Hello! After discussion with Oleg, it looks that it is enough to prevent wrong registers in the output of the (multi-output) insn pattern. As far as inputs are concerned, combine already handles limited reload classes in the right way. The problem with x86 is, that reload tried to fix output operand of the multi-output ins, where scheduler already moved load of ax register before this insn. Version 2 of the patch now handles only output operands. Also, handling of empty constraints was fixed. 2012-08-18 Uros Bizjak PR rtl-optimization/46829 * combine.c (recog_for_combine): Check operand constraints to reject instructions where wrong hard registers were propagated into output operands. testsuite/ChangeLog: 2012-08-18 Uros Bizjak PR rtl-optimization/46829 * gcc.target/i386/pr46829.c: New test. Patch was bootstrapped and regression tested on x86_64-unknown-linux-gnu {,-m32}. Uros. Index: combine.c =================================================================== --- combine.c (revision 190500) +++ combine.c (working copy) @@ -10507,6 +10507,7 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn int i; rtx notes = 0; rtx old_notes, old_pat; + int old_icode; /* If PAT is a PARALLEL, check to see if it contains the CLOBBER we use to indicate that something didn't match. If we find such a @@ -10566,6 +10567,7 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn print_rtl_single (dump_file, pat); } } + PATTERN (insn) = old_pat; REG_NOTES (insn) = old_notes; @@ -10607,6 +10609,93 @@ recog_for_combine (rtx *pnewpat, rtx insn, rtx *pn pat = newpat; } + old_pat = PATTERN (insn); + old_notes = REG_NOTES (insn); + old_icode = INSN_CODE (insn); + PATTERN (insn) = pat; + REG_NOTES (insn) = notes; + + /* Check operand constraints in case wrong hard registers were + propagated into output operands of insn pattern. These invalid + insns can eventually confuse reload to error out with a + spill failure. See also PR 46829. */ + if (insn_code_number >= 0 + && insn_code_number != NOOP_MOVE_INSN_CODE + && (INSN_CODE (insn) = recog (PATTERN (insn), insn, 0)) >= 0) + { + extract_insn (insn); + preprocess_constraints (); + + for (i = 0; i < recog_data.n_operands; i++) + { + rtx op; + enum machine_mode mode; + struct operand_alternative *op_alt; + int offset = 0; + bool win; + int j; + + if (recog_data.operand_type[i] == OP_IN) + continue; + + op = recog_data.operand[i]; + mode = GET_MODE (op); + + /* A unary operator may be accepted by the predicate, but it + is irrelevant for matching constraints. */ + if (UNARY_P (op)) + op = XEXP (op, 0); + + if (GET_CODE (op) == SUBREG) + { + if (REG_P (SUBREG_REG (op)) + && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER) + offset = subreg_regno_offset (REGNO (SUBREG_REG (op)), + GET_MODE (SUBREG_REG (op)), + SUBREG_BYTE (op), + GET_MODE (op)); + op = SUBREG_REG (op); + } + + if (!(REG_P (op) && HARD_REGISTER_P (op))) + continue; + + op_alt = recog_op_alt[i]; + + /* Operand has no constraints, anything is OK. */ + win = !recog_data.n_alternatives; + + for (j = 0; j < recog_data.n_alternatives; j++) + { + if (op_alt[j].anything_ok + || (op_alt[j].matches != -1 + && reg_fits_class_p (op, recog_op_alt[op_alt[j].matches][j].cl, + offset, mode)) + || reg_fits_class_p (op, op_alt[j].cl, offset, mode)) + { + win = true; + break; + } + } + + if (!win) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fputs ("Operand failed to match constraints:\n", + dump_file); + print_rtl_single (dump_file, recog_data.operand[i]); + } + insn_code_number = -1; + break; + } + } + } + + PATTERN (insn) = old_pat; + REG_NOTES (insn) = old_notes; + INSN_CODE (insn) = old_icode; + *pnewpat = pat; *pnotes = notes;