Similar idea to the combine.c and gcse.c patches.

2019-09-11  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        * loop-iv.c: Include regs.h and function-abi.h.
        (simplify_using_initial_values): Use call_insn_abi to get the
        ABI of the call insn target.  Conservatively assume that
        partially-clobbered registers are altered.

Index: gcc/loop-iv.c
===================================================================
--- gcc/loop-iv.c       2019-09-09 19:01:40.371078272 +0100
+++ gcc/loop-iv.c       2019-09-11 19:48:35.161764168 +0100
@@ -62,6 +62,8 @@ Free Software Foundation; either version
 #include "dumpfile.h"
 #include "rtl-iter.h"
 #include "tree-ssa-loop-niter.h"
+#include "regs.h"
+#include "function-abi.h"
 
 /* Possible return values of iv_get_reaching_def.  */
 
@@ -1972,8 +1974,14 @@ simplify_using_initial_values (class loo
          CLEAR_REG_SET (this_altered);
          note_stores (insn, mark_altered, this_altered);
          if (CALL_P (insn))
-           /* Kill all call clobbered registers.  */
-           IOR_REG_SET_HRS (this_altered, regs_invalidated_by_call);
+           {
+             /* Kill all registers that might be clobbered by the call.
+                We don't track modes of hard registers, so we need to be
+                conservative and assume that partial kills are full kills.  */
+             function_abi abi = call_insn_abi (insn);
+             IOR_REG_SET_HRS (this_altered,
+                              abi.full_and_partial_reg_clobbers ());
+           }
 
          if (suitable_set_for_replacement (insn, &dest, &src))
            {

Reply via email to