From patchwork Wed Aug 18 08:30:39 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Fix PR 44691 Date: Tue, 17 Aug 2010 22:30:39 -0000 From: Andrey Belevantsev X-Patchwork-Id: 62012 Message-Id: <4C6B9A2F.4090805@ispras.ru> To: GCC Patches Cc: "Vladimir N. Makarov" Hello, As explained in the audit trail, the problem was that in the selective scheduler I assumed that SUBREG_REG will always be a REG, which seems to be not the case. This is not quite in line with what documentation says, if I read it correctly, but it seems to be used in a number of backends, so the below patch just gives up substitution also when SUBREG_REG is not a register. Bootstrapped and tested on ia64, and verified that the test is fixed on x86_64. I think that this qualifies as obvious, so unless Vlad or other people have any comments, I'll commit it tomorrow. Yours, Andrey 2010-08-18 Andrey Belevantsev PR rtl-optimization/44691 * sel-sched.c (count_occurrences_1): Also punt when SUBREG_REG is not a register. Index: gcc/sel-sched.c =================================================================== *** gcc/sel-sched.c (revision 163192) --- gcc/sel-sched.c (working copy) *************** count_occurrences_1 (rtx *cur_rtx, void *** 835,841 **** if (GET_CODE (*cur_rtx) == SUBREG && REG_P (p->x) ! && REGNO (SUBREG_REG (*cur_rtx)) == REGNO (p->x)) { /* ??? Do not support substituting regs inside subregs. In that case, simplify_subreg will be called by validate_replace_rtx, and --- 835,842 ---- if (GET_CODE (*cur_rtx) == SUBREG && REG_P (p->x) ! && (!REG_P (SUBREG_REG (*cur_rtx)) ! || REGNO (SUBREG_REG (*cur_rtx)) == REGNO (p->x))) { /* ??? Do not support substituting regs inside subregs. In that case, simplify_subreg will be called by validate_replace_rtx, and