]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/postreload.c
c++: Handle multiple aggregate overloads [PR95319].
[thirdparty/gcc.git] / gcc / postreload.c
index 8849679ae0fa0c2016d8d6514c5bb5eb42f5f73c..f625828502248f74f9fd88f6383e6e04b02a0cb8 100644 (file)
@@ -97,6 +97,16 @@ reload_cse_simplify (rtx_insn *insn, rtx testreg)
   if (NO_FUNCTION_CSE && CALL_P (insn))
     return false;
 
+  /* Remember if this insn has been sp += const_int.  */
+  rtx sp_set = set_for_reg_notes (insn);
+  rtx sp_addend = NULL_RTX;
+  if (sp_set
+      && SET_DEST (sp_set) == stack_pointer_rtx
+      && GET_CODE (SET_SRC (sp_set)) == PLUS
+      && XEXP (SET_SRC (sp_set), 0) == stack_pointer_rtx
+      && CONST_INT_P (XEXP (SET_SRC (sp_set), 1)))
+    sp_addend = XEXP (SET_SRC (sp_set), 1);
+
   if (GET_CODE (body) == SET)
     {
       int count = 0;
@@ -180,6 +190,15 @@ reload_cse_simplify (rtx_insn *insn, rtx testreg)
        reload_cse_simplify_operands (insn, testreg);
     }
 
+  /* If sp += const_int insn is changed into sp = reg;, add REG_EQUAL
+     note so that the stack_adjustments pass can undo it if beneficial.  */
+  if (sp_addend
+      && SET_DEST (sp_set) == stack_pointer_rtx
+      && REG_P (SET_SRC (sp_set)))
+    set_dst_reg_note (insn, REG_EQUAL,
+                     gen_rtx_PLUS (Pmode, stack_pointer_rtx,
+                                   sp_addend), stack_pointer_rtx);
+
 done:
   return (EDGE_COUNT (insn_bb->succs) != insn_bb_succs);
 }
@@ -1204,11 +1223,10 @@ reload_combine_recognize_pattern (rtx_insn *insn)
              /* Delete the reg-reg addition.  */
              delete_insn (insn);
 
-             if (reg_state[regno].offset != const0_rtx
-                 /* Previous REG_EQUIV / REG_EQUAL notes for PREV
-                    are now invalid.  */
-                 && remove_reg_equal_equiv_notes (prev))
-               df_notes_rescan (prev);
+             if (reg_state[regno].offset != const0_rtx)
+               /* Previous REG_EQUIV / REG_EQUAL notes for PREV
+                  are now invalid.  */
+               remove_reg_equal_equiv_notes (prev);
 
              reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
              return true;