re PR target/78002 (gcc.target/aarch64/stack-checking.c ICEs with -mabi=ilp32)
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 5 Apr 2017 11:48:02 +0000 (11:48 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 5 Apr 2017 11:48:02 +0000 (11:48 +0000)
PR target/78002
* config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Replace
ptr_mode with Pmode throughout.
* config/aarch64/aarch64.md (probe_stack_range_<PTR:mode): Rename
into probe_stack_range and use DImode.

From-SVN: r246702

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.md

index b29311a651d6adf886b5b217f8ebec9e793807f8..873d0bcc3e71aaebb5077154f9f310f2251acfdc 100644 (file)
@@ -1,3 +1,11 @@
+2017-04-05  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR target/78002
+       * config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Replace
+       ptr_mode with Pmode throughout.
+       * config/aarch64/aarch64.md (probe_stack_range_<PTR:mode): Rename
+       into probe_stack_range and use DImode.
+
 2017-04-05  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        PR target/79890
index 4f769a40a4e9de83cb5aacfd3ff58301c2feeb78..721ced1831a00748144889e11b032d1abeea4160 100644 (file)
@@ -2610,7 +2610,7 @@ aarch64_libgcc_cmp_return_mode (void)
 static void
 aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
 {
-  rtx reg1 = gen_rtx_REG (ptr_mode, PROBE_STACK_FIRST_REG);
+  rtx reg1 = gen_rtx_REG (Pmode, PROBE_STACK_FIRST_REG);
 
   /* See the same assertion on PROBE_INTERVAL above.  */
   gcc_assert ((first % ARITH_FACTOR) == 0);
@@ -2622,9 +2622,9 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
       const HOST_WIDE_INT base = ROUND_UP (size, ARITH_FACTOR);
 
       emit_set_insn (reg1,
-                    plus_constant (ptr_mode,
+                    plus_constant (Pmode,
                                    stack_pointer_rtx, -(first + base)));
-      emit_stack_probe (plus_constant (ptr_mode, reg1, base - size));
+      emit_stack_probe (plus_constant (Pmode, reg1, base - size));
     }
 
   /* The run-time loop is made up of 8 insns in the generic case while the
@@ -2634,7 +2634,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
       HOST_WIDE_INT i, rem;
 
       emit_set_insn (reg1,
-                    plus_constant (ptr_mode,
+                    plus_constant (Pmode,
                                    stack_pointer_rtx,
                                    -(first + PROBE_INTERVAL)));
       emit_stack_probe (reg1);
@@ -2645,7 +2645,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
       for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
        {
          emit_set_insn (reg1,
-                        plus_constant (ptr_mode, reg1, -PROBE_INTERVAL));
+                        plus_constant (Pmode, reg1, -PROBE_INTERVAL));
          emit_stack_probe (reg1);
        }
 
@@ -2654,11 +2654,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
        {
          const HOST_WIDE_INT base = ROUND_UP (rem, ARITH_FACTOR);
 
-         emit_set_insn (reg1, plus_constant (ptr_mode, reg1, -base));
-         emit_stack_probe (plus_constant (ptr_mode, reg1, base - rem));
+         emit_set_insn (reg1, plus_constant (Pmode, reg1, -base));
+         emit_stack_probe (plus_constant (Pmode, reg1, base - rem));
        }
       else
-       emit_stack_probe (plus_constant (ptr_mode, reg1, -rem));
+       emit_stack_probe (plus_constant (Pmode, reg1, -rem));
     }
 
   /* Otherwise, do the same as above, but in a loop.  Note that we must be
@@ -2668,7 +2668,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
      equality test for the loop condition.  */
   else
     {
-      rtx reg2 = gen_rtx_REG (ptr_mode, PROBE_STACK_SECOND_REG);
+      rtx reg2 = gen_rtx_REG (Pmode, PROBE_STACK_SECOND_REG);
 
       /* Step 1: round SIZE to the previous multiple of the interval.  */
 
@@ -2679,11 +2679,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
 
       /* TEST_ADDR = SP + FIRST.  */
       emit_set_insn (reg1,
-                    plus_constant (ptr_mode, stack_pointer_rtx, -first));
+                    plus_constant (Pmode, stack_pointer_rtx, -first));
 
       /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
       emit_set_insn (reg2,
-                    plus_constant (ptr_mode, stack_pointer_rtx,
+                    plus_constant (Pmode, stack_pointer_rtx,
                                    -(first + rounded_size)));
 
 
@@ -2699,10 +2699,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
         probes at FIRST + N * PROBE_INTERVAL for values of N from 1
         until it is equal to ROUNDED_SIZE.  */
 
-      if (ptr_mode == DImode)
-       emit_insn (gen_probe_stack_range_di (reg1, reg1, reg2));
-      else
-       emit_insn (gen_probe_stack_range_si (reg1, reg1, reg2));
+      emit_insn (gen_probe_stack_range (reg1, reg1, reg2));
 
 
       /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
@@ -2716,11 +2713,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
            {
              const HOST_WIDE_INT base = ROUND_UP (rem, ARITH_FACTOR);
 
-             emit_set_insn (reg2, plus_constant (ptr_mode, reg2, -base));
-             emit_stack_probe (plus_constant (ptr_mode, reg2, base - rem));
+             emit_set_insn (reg2, plus_constant (Pmode, reg2, -base));
+             emit_stack_probe (plus_constant (Pmode, reg2, base - rem));
            }
          else
-           emit_stack_probe (plus_constant (ptr_mode, reg2, -rem));
+           emit_stack_probe (plus_constant (Pmode, reg2, -rem));
        }
     }
 
index 5adc5edb8dde9c30450b04932a37c41f84cc5ed1..51368e29f2d1fd12f48a972bd81a08589a720e07 100644 (file)
    (set_attr "type" "block")]
 )
 
-(define_insn "probe_stack_range_<PTR:mode>"
-  [(set (match_operand:PTR 0 "register_operand" "=r")
-       (unspec_volatile:PTR [(match_operand:PTR 1 "register_operand" "0")
-                             (match_operand:PTR 2 "register_operand" "r")]
-                              UNSPECV_PROBE_STACK_RANGE))]
+(define_insn "probe_stack_range"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+       (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "0")
+                            (match_operand:DI 2 "register_operand" "r")]
+                             UNSPECV_PROBE_STACK_RANGE))]
   ""
 {
   return aarch64_output_probe_stack_range (operands[0], operands[2]);