]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Tighten use of HARD_FRAME_POINTER_REGNUM in alias.c (PR 84538)
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 1 Mar 2018 08:22:06 +0000 (08:22 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 1 Mar 2018 08:22:06 +0000 (08:22 +0000)
RTL code needs to be consistent about whether it uses the stack
pointer, the frame pointer or the argument pointer to access a
given part of the frame.  alias.c used this to divide accesses
into three independent areas.

The problem in the PR is that we did this for HARD_FRAME_POINTER_REGNUM
even when the register wasn't being used as a frame pointer.  We can't
do that because the frame pointer is then just any old allocatable
register and could certainly point to info accessed through the
argument pointer or stack pointer.

2018-03-01  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
PR rtl-optimization/84538
* alias.c (init_alias_target): Add commentary.
(init_alias_analysis): Only give HARD_FRAME_POINTER_REGNUM
a unique base value if the frame pointer is not eliminated
to the stack pointer.

gcc/testsuite/
PR rtl-optimization/84538
* gcc.dg/torture/pr84538.c: New test.

From-SVN: r258094

gcc/ChangeLog
gcc/alias.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr84538.c [new file with mode: 0644]

index 0a07f4b0a92151d9136fae096dee59451951a94e..0d93e26a920d23640d1a77e1bc05320a38903ead 100644 (file)
@@ -1,3 +1,11 @@
+2018-03-01  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/84538
+       * alias.c (init_alias_target): Add commentary.
+       (init_alias_analysis): Only give HARD_FRAME_POINTER_REGNUM
+       a unique base value if the frame pointer is not eliminated
+       to the stack pointer.
+
 2018-03-01  Tom de Vries  <tom@codesourcery.com>
 
        PR rtl-optimization/83327
index 4c7965de8071707a200139c2f7a14c8b96b1d911..5fa15cbd1022961f8ffb0149d15ba39dd10e1984 100644 (file)
@@ -3191,12 +3191,21 @@ init_alias_target (void)
        && targetm.hard_regno_mode_ok (i, Pmode))
       static_reg_base_value[i] = arg_base_value;
 
+  /* RTL code is required to be consistent about whether it uses the
+     stack pointer, the frame pointer or the argument pointer to
+     access a given area of the frame.  We can therefore use the
+     base address to distinguish between the different areas.  */
   static_reg_base_value[STACK_POINTER_REGNUM]
     = unique_base_value (UNIQUE_BASE_VALUE_SP);
   static_reg_base_value[ARG_POINTER_REGNUM]
     = unique_base_value (UNIQUE_BASE_VALUE_ARGP);
   static_reg_base_value[FRAME_POINTER_REGNUM]
     = unique_base_value (UNIQUE_BASE_VALUE_FP);
+
+  /* The above rules extend post-reload, with eliminations applying
+     consistently to each of the three pointers.  Cope with cases in
+     which the frame pointer is eliminated to the hard frame pointer
+     rather than the stack pointer.  */
   if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
     static_reg_base_value[HARD_FRAME_POINTER_REGNUM]
       = unique_base_value (UNIQUE_BASE_VALUE_HFP);
@@ -3329,7 +3338,14 @@ init_alias_analysis (void)
 
       /* Initialize the alias information for this pass.  */
       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-       if (static_reg_base_value[i])
+       if (static_reg_base_value[i]
+           /* Don't treat the hard frame pointer as special if we
+              eliminated the frame pointer to the stack pointer instead.  */
+           && !(i == HARD_FRAME_POINTER_REGNUM
+                && reload_completed
+                && !frame_pointer_needed
+                && targetm.can_eliminate (FRAME_POINTER_REGNUM,
+                                          STACK_POINTER_REGNUM)))
          {
            new_reg_base_value[i] = static_reg_base_value[i];
            bitmap_set_bit (reg_seen, i);
index aac49641416cdda8abcfa1157176797233d093e9..6528ac0276d9aa323b9b01620a08750ba7d8b52b 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-01  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR rtl-optimization/84538
+       * gcc.dg/torture/pr84538.c: New test.
+
 2018-02-28  Martin Sebor  <msebor@redhat.com>
 
        * c-c++-common/Warray-bounds-2.c: Declare helper static to avoid
diff --git a/gcc/testsuite/gcc.dg/torture/pr84538.c b/gcc/testsuite/gcc.dg/torture/pr84538.c
new file mode 100644 (file)
index 0000000..b56a1c4
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fno-omit-frame-pointer -w" } */
+
+#define SIZE 8
+
+main()
+{
+  int a[SIZE] = {1};
+  int i;
+
+  for (i = 1; i < SIZE; i++)
+    if (a[i] != 0)
+      abort();
+
+  exit (0);
+}