On 2015-12-18, at 9:05 PM, John David Anglin wrote:

> On 2015-12-09, at 8:00 PM, John David Anglin wrote:
> 
>> The attached fixes an ICE building gridengine.  The problem is we are asked 
>> to do an HImode reload
>> for a floating pointing register.  However, we can only do 32 and 64-bit 
>> loads and stores to/from floating
>> point registers.
>> 
>> The problem is resolved by not checking that the mode requested is 
>> consistent with the modes of the
>> input and output operands.
>> 
>> Tested on hppa-unknown-linux-gnu, hppa2.0w-hp-hpux11.11 and 
>> hppa64-hp-hpux11.11.  Committed
>> to trunk and active branches.
> 
> 
> Sadly, this change broke the gcc build on hppa1.X systems.  The default 
> scheduling for these systems allows
> pre and post increment patterns.  The previous change copied a POST_INC 
> address to a general register.
> This is not supported.
> 
> The attached revision now only reloads REG+CONST_INT addresses and leaves all 
> other forms as is.
> 
> Tested on hppa1.1-hp-hpux10.20, hppa2.0w-hp-hpux11.11, hppa64-hp-hpux11.11 
> and hppa-unknown-linux-gnu.


And yet another regression related to this change, we need to deal with cases 
where reload throws us
an unsupported memory address form.  This fixes an ICE compiling cs_base.c in 
the code-saturne package.

Tested on hppa1.1-hp-hpux10.20, hppa2.0w-hp-hpux11.11, hppa64-hp-hpux11.11 and 
hppa-unknown-linux-gnu.

Committed to trunk, gcc-5 and gcc-4.9.

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


2016-01-11  John David Anglin  <dang...@gcc.gnu.org>

        * config/pa/pa.c (pa_emit_move_sequence): Handle floating point
        reloads for other unsupported memory operands.

Index: config/pa/pa.c
===================================================================
--- config/pa/pa.c      (revision 232130)
+++ config/pa/pa.c      (working copy)
@@ -1681,7 +1681,8 @@
 
   /* Handle secondary reloads for loads/stores of FP registers from
      REG+D addresses where D does not fit in 5 or 14 bits, including
-     (subreg (mem (addr))) cases.  */
+     (subreg (mem (addr))) cases, and reloads for other unsupported
+     memory operands.  */
   if (scratch_reg
       && FP_REG_P (operand0)
       && (MEM_P (operand1)
@@ -1693,30 +1694,43 @@
       if (GET_CODE (op1) == SUBREG)
        op1 = XEXP (op1, 0);
 
-      if (reg_plus_base_memory_operand (op1, GET_MODE (op1))
-         && !(TARGET_PA_20
-              && !TARGET_ELF32
-              && INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
-         && !INT_5_BITS (XEXP (XEXP (op1, 0), 1)))
+      if (reg_plus_base_memory_operand (op1, GET_MODE (op1)))
        {
-         /* SCRATCH_REG will hold an address and maybe the actual data.
-            We want it in WORD_MODE regardless of what mode it was
-            originally given to us.  */
-         scratch_reg = force_mode (word_mode, scratch_reg);
+         if (!(TARGET_PA_20
+               && !TARGET_ELF32
+               && INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
+             && !INT_5_BITS (XEXP (XEXP (op1, 0), 1)))
+           {
+             /* SCRATCH_REG will hold an address and maybe the actual data.
+                We want it in WORD_MODE regardless of what mode it was
+                originally given to us.  */
+             scratch_reg = force_mode (word_mode, scratch_reg);
 
-         /* D might not fit in 14 bits either; for such cases load D into
-            scratch reg.  */
-         if (!INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
-           {
-             emit_move_insn (scratch_reg, XEXP (XEXP (op1, 0), 1));
-             emit_move_insn (scratch_reg,
-                             gen_rtx_fmt_ee (GET_CODE (XEXP (op1, 0)),
-                                             Pmode,
-                                             XEXP (XEXP (op1, 0), 0),
-                                             scratch_reg));
+             /* D might not fit in 14 bits either; for such cases load D
+                into scratch reg.  */
+             if (!INT_14_BITS (XEXP (XEXP (op1, 0), 1)))
+               {
+                 emit_move_insn (scratch_reg, XEXP (XEXP (op1, 0), 1));
+                 emit_move_insn (scratch_reg,
+                                 gen_rtx_fmt_ee (GET_CODE (XEXP (op1, 0)),
+                                                 Pmode,
+                                                 XEXP (XEXP (op1, 0), 0),
+                                                 scratch_reg));
+               }
+             else
+               emit_move_insn (scratch_reg, XEXP (op1, 0));
+             emit_insn (gen_rtx_SET (operand0,
+                                 replace_equiv_address (op1, scratch_reg)));
+             return 1;
            }
-         else
-           emit_move_insn (scratch_reg, XEXP (op1, 0));
+       }
+      else if ((!INT14_OK_STRICT && symbolic_memory_operand (op1, VOIDmode))
+              || IS_LO_SUM_DLT_ADDR_P (XEXP (op1, 0))
+              || IS_INDEX_ADDR_P (XEXP (op1, 0)))
+       {
+         /* Load memory address into SCRATCH_REG.  */
+         scratch_reg = force_mode (word_mode, scratch_reg);
+         emit_move_insn (scratch_reg, XEXP (op1, 0));
          emit_insn (gen_rtx_SET (operand0,
                                  replace_equiv_address (op1, scratch_reg)));
          return 1;
@@ -1733,30 +1747,43 @@
       if (GET_CODE (op0) == SUBREG)
        op0 = XEXP (op0, 0);
 
-      if (reg_plus_base_memory_operand (op0, GET_MODE (op0))
-         && !(TARGET_PA_20
-              && !TARGET_ELF32
-              && INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
-         && !INT_5_BITS (XEXP (XEXP (op0, 0), 1)))
+      if (reg_plus_base_memory_operand (op0, GET_MODE (op0)))
        {
-         /* SCRATCH_REG will hold an address and maybe the actual data.
-            We want it in WORD_MODE regardless of what mode it was
-            originally given to us.  */
-         scratch_reg = force_mode (word_mode, scratch_reg);
+         if (!(TARGET_PA_20
+               && !TARGET_ELF32
+               && INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
+             && !INT_5_BITS (XEXP (XEXP (op0, 0), 1)))
+           {
+             /* SCRATCH_REG will hold an address and maybe the actual data.
+                We want it in WORD_MODE regardless of what mode it was
+                originally given to us.  */
+             scratch_reg = force_mode (word_mode, scratch_reg);
 
-         /* D might not fit in 14 bits either; for such cases load D into
-            scratch reg.  */
-         if (!INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
-           {
-             emit_move_insn (scratch_reg, XEXP (XEXP (op0, 0), 1));
-             emit_move_insn (scratch_reg,
-                             gen_rtx_fmt_ee (GET_CODE (XEXP (op0, 0)),
-                                             Pmode,
-                                             XEXP (XEXP (op0, 0), 0),
-                                             scratch_reg));
+             /* D might not fit in 14 bits either; for such cases load D
+                into scratch reg.  */
+             if (!INT_14_BITS (XEXP (XEXP (op0, 0), 1)))
+               {
+                 emit_move_insn (scratch_reg, XEXP (XEXP (op0, 0), 1));
+                 emit_move_insn (scratch_reg,
+                                 gen_rtx_fmt_ee (GET_CODE (XEXP (op0, 0)),
+                                                 Pmode,
+                                                 XEXP (XEXP (op0, 0), 0),
+                                                 scratch_reg));
+               }
+             else
+               emit_move_insn (scratch_reg, XEXP (op0, 0));
+             emit_insn (gen_rtx_SET (replace_equiv_address (op0, scratch_reg),
+                                     operand1));
+             return 1;
            }
-         else
-           emit_move_insn (scratch_reg, XEXP (op0, 0));
+       }
+      else if ((!INT14_OK_STRICT && symbolic_memory_operand (op0, VOIDmode))
+              || IS_LO_SUM_DLT_ADDR_P (XEXP (op0, 0))
+              || IS_INDEX_ADDR_P (XEXP (op0, 0)))
+       {
+         /* Load memory address into SCRATCH_REG.  */
+         scratch_reg = force_mode (word_mode, scratch_reg);
+         emit_move_insn (scratch_reg, XEXP (op0, 0));
          emit_insn (gen_rtx_SET (replace_equiv_address (op0, scratch_reg),
                                  operand1));
          return 1;

Reply via email to