Hi,

This patch adds a check for call destination register for a call return value 
optimization based on REG_RETURNED note.  This solves some ICE issues for MPX 
codes.

Bootstrapped and tested on linux-x86_64.  OK for trunk?

Thanks,
Ilya
--
2014-10-02  Ilya Enkovich  <ilya.enkov...@intel.com>

        * lra-constraints.c (inherit_in_ebb): Handle calls with
        multiple return values.
        * caller-save.c (save_call_clobbered_regs): Likewise.


diff --git a/gcc/caller-save.c b/gcc/caller-save.c
index 11df2ec..f983165 100644
--- a/gcc/caller-save.c
+++ b/gcc/caller-save.c
@@ -879,8 +879,11 @@ save_call_clobbered_regs (void)
                  if (GET_CODE (pat) == PARALLEL)
                    pat = XVECEXP (pat, 0, 0);
                  dest = SET_DEST (pat);
-                 newpat = gen_rtx_SET (VOIDmode, cheap, copy_rtx (dest));
-                 chain = insert_one_insn (chain, 0, -1, newpat);
+                 if (REG_P (dest))
+                   {
+                     newpat = gen_rtx_SET (VOIDmode, cheap, copy_rtx (dest));
+                     chain = insert_one_insn (chain, 0, -1, newpat);
+                   }
                }
            }
           last = chain;
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 5f68399..cd54abd 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -5348,16 +5348,19 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
                  if (GET_CODE (pat) == PARALLEL)
                    pat = XVECEXP (pat, 0, 0);
                  dest = SET_DEST (pat);
-                 start_sequence ();
-                 emit_move_insn (cheap, copy_rtx (dest));
-                 restore = get_insns ();
-                 end_sequence ();
-                 lra_process_new_insns (curr_insn, NULL, restore,
-                                        "Inserting call parameter restore");
-                 /* We don't need to save/restore of the pseudo from
-                    this call.  */
-                 usage_insns[regno].calls_num = calls_num;
-                 bitmap_set_bit (&check_only_regs, regno);
+                 if (REG_P (dest))
+                   {
+                     start_sequence ();
+                     emit_move_insn (cheap, copy_rtx (dest));
+                     restore = get_insns ();
+                     end_sequence ();
+                     lra_process_new_insns (curr_insn, NULL, restore,
+                                            "Inserting call parameter 
restore");
+                     /* We don't need to save/restore of the pseudo from
+                        this call.      */
+                     usage_insns[regno].calls_num = calls_num;
+                     bitmap_set_bit (&check_only_regs, regno);
+                   }
                }
            }
          to_inherit_num = 0;

Reply via email to