i386.c (ix86_expand_split_stack_prologue): Add REG_ARGS_SIZE note to 32-bit push...
authorIan Lance Taylor <iant@golang.org>
Tue, 31 Jan 2017 23:49:26 +0000 (23:49 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 31 Jan 2017 23:49:26 +0000 (23:49 +0000)
* config/i386/i386.c (ix86_expand_split_stack_prologue): Add
REG_ARGS_SIZE note to 32-bit push insns and call insn.

From-SVN: r245076

gcc/ChangeLog
gcc/config/i386/i386.c

index a264140a3f9e0e706e66290d67acbf3f27046880..02f635ea8f300612b82723127f7fe73582ea290b 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-31  Ian Lance Taylor  <iant@golang.org>
+
+       * config/i386/i386.c (ix86_expand_split_stack_prologue): Add
+       REG_ARGS_SIZE note to 32-bit push insns and call insn.
+
 2017-01-31  David Malcolm  <dmalcolm@redhat.com>
 
        PR preprocessor/79210
index 377e49a507a2f7807b1c652bb0df1ca20669cc09..01a05c63ccd1d5e4d5fdee4369ab4ac125b27a3a 100644 (file)
@@ -14944,6 +14944,7 @@ ix86_expand_split_stack_prologue (void)
   allocate_rtx = GEN_INT (allocate);
   args_size = crtl->args.size >= 0 ? crtl->args.size : 0;
   call_fusage = NULL_RTX;
+  rtx pop = NULL_RTX;
   if (TARGET_64BIT)
     {
       rtx reg10, reg11;
@@ -15021,13 +15022,18 @@ ix86_expand_split_stack_prologue (void)
     }
   else
     {
-      emit_insn (gen_push (GEN_INT (args_size)));
-      emit_insn (gen_push (allocate_rtx));
+      rtx_insn *insn = emit_insn (gen_push (GEN_INT (args_size)));
+      add_reg_note (insn, REG_ARGS_SIZE, GEN_INT (UNITS_PER_WORD));
+      insn = emit_insn (gen_push (allocate_rtx));
+      add_reg_note (insn, REG_ARGS_SIZE, GEN_INT (2 * UNITS_PER_WORD));
+      pop = GEN_INT (2 * UNITS_PER_WORD);
     }
   call_insn = ix86_expand_call (NULL_RTX, gen_rtx_MEM (QImode, fn),
                                GEN_INT (UNITS_PER_WORD), constm1_rtx,
-                               NULL_RTX, false);
+                               pop, false);
   add_function_usage_to (call_insn, call_fusage);
+  if (!TARGET_64BIT)
+    add_reg_note (call_insn, REG_ARGS_SIZE, GEN_INT (0));
 
   /* In order to make call/return prediction work right, we now need
      to execute a return instruction.  See