On 2016-03-17, at 7:38 PM, John David Anglin wrote:

> The attach patch fixes a problem causing block/blk-merge.c in the linux 
> kernel to be miscompiled.  As a result,
> block segments were not properly split and boot failed since linux 4.3.
> 
> The problem was found by a regression search.  The patch reverts a change in 
> the handling of the Q and T
> constraints.
> 
> Tested on hppa-unknown-linux-gnu, hppa2.0w-hp-hpux11.11and 
> hppa64-hp-hpux11.11.  Committed to
> trunk, 4.9 and 5 branches.


Unfortunately, this change caused a regression in the handling of the Q 
constraint used in the dbra and movb
patterns in pa.md.  Spills with large offsets are now rejected causing the 
following error:

(jump_insn 61 59 62 4 (parallel [
            (set (pc)
                (if_then_else (eq (reg:SI 28 %r28)
                        (const_int 0 [0]))
                    (label_ref:SI 60)
                    (pc)))
            (set (reg/v/f:SI 100 [ fp ])
                (reg:SI 28 %r28))
        ]) Renviron.c:180 225 {*pa.md:9010}
     (expr_list:REG_DEAD (reg:SI 28 %r28)
        (int_list:REG_BR_PROB 2164 (nil)))
 -> 60)
Renviron.c:207:1: internal compiler error: in find_reloads, at reload.c:3862
0x555be3 _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
        ../../src/gcc/rtl-error.c:110
0x5347ef find_reloads(rtx_insn*, int, int, int, short*)
        ../../src/gcc/reload.c:3862
0x54ad43 calculate_needs_all_insns
        ../../src/gcc/reload1.c:1540
0x54ad43 reload(rtx_insn*, int)
        ../../src/gcc/reload1.c:1028
0x425c0f do_reload
        ../../src/gcc/ira.c:5454
0x425c0f execute
        ../../src/gcc/ira.c:5613

The attached change fixes this ICE.  Tested on hppa-unknown-linux-gnu, 
hppa2.0w-hp-hpux11.11
and hppa64-hp-hpux11.11.  Committed to trunk, 4.9 and 5 branches.

Dave
--
John David Anglin       dave.ang...@bell.net


2016-04-05  John David Anglin  <dang...@gcc.gnu.org>

        * config/pa/predicates.md (integer_store_memory_operand): Accept
        REG+D operands with a large offset when reload_in_progress is true.
        (floating_point_store_memory_operand): Likewise.

Index: config/pa/predicates.md
===================================================================
--- config/pa/predicates.md     (revision 234702)
+++ config/pa/predicates.md     (working copy)
@@ -301,6 +301,9 @@
 
   if (reg_plus_base_memory_operand (op, mode))
     {
+      if (reload_in_progress)
+       return true;
+
       /* Extract CONST_INT operand.  */
       if (GET_CODE (op) == SUBREG)
        op = SUBREG_REG (op);
@@ -335,6 +338,9 @@
 
   if (reg_plus_base_memory_operand (op, mode))
     {
+      if (reload_in_progress)
+       return true;
+
       /* Extract CONST_INT operand.  */
       if (GET_CODE (op) == SUBREG)
        op = SUBREG_REG (op);

Reply via email to