[Patch] PR70751, correct the cost for spilling non-pseudo into memory
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 9 Jun 2016 21:28:31 +0000 (21:28 +0000)
committerJiong Wang <jiwang@gcc.gnu.org>
Thu, 9 Jun 2016 21:28:31 +0000 (21:28 +0000)
PR rtl-optimization/70751
* lra-constraints.c (process_alt_operands): Recognize Non-pseudo spilled
into memory.

Co-Authored-By: Jiong Wang <jiong.wang@arm.com>
From-SVN: r237277

gcc/ChangeLog
gcc/lra-constraints.c

index 274155fe4915ad35c14441f7978dd376351875bb..b27dd3f8df69de9cf744b707b88c4f88409d5d08 100644 (file)
@@ -1,3 +1,10 @@
+2016-06-09  Vladimir Makarov  <vmakarov@redhat.com>
+           Jiong Wang  <jiong.wang@arm.com>
+
+       PR rtl-optimization/70751
+       * lra-constraints.c (process_alt_operands): Recognize Non-pseudo spilled
+       into memory.
+
 2016-06-09 Jonathan Yong  <10walls@gmail.com>
 
        Revert:
index e4e6c8c47eb5738de935b9870013482a5771c1c1..bf08dce2e0a4c2ef4c339aedbda4dba47cba1645 100644 (file)
@@ -2474,14 +2474,27 @@ process_alt_operands (int only_alternative)
              /* We are trying to spill pseudo into memory.  It is
                 usually more costly than moving to a hard register
                 although it might takes the same number of
-                reloads.  */
-             if (no_regs_p && REG_P (op) && hard_regno[nop] >= 0)
+                reloads.
+
+                Non-pseudo spill may happen also.  Suppose a target allows both
+                register and memory in the operand constraint alternatives,
+                then it's typical that an eliminable register has a substition
+                of "base + offset" which can either be reloaded by a simple
+                "new_reg <= base + offset" which will match the register
+                constraint, or a similar reg addition followed by further spill
+                to and reload from memory which will match the memory
+                constraint, but this memory spill will be much more costly
+                usually.
+
+                Code below increases the reject for both pseudo and non-pseudo
+                spill.  */
+             if (no_regs_p && !(REG_P (op) && hard_regno[nop] < 0))
                {
                  if (lra_dump_file != NULL)
                    fprintf
                      (lra_dump_file,
-                      "            %d Spill pseudo into memory: reject+=3\n",
-                      nop);
+                      "            %d Spill %spseudo into memory: reject+=3\n",
+                      nop, REG_P (op) ? "" : "Non-");
                  reject += 3;
                  if (VECTOR_MODE_P (mode))
                    {