[20/32] Remove global call sets: loop-iv.c
diff mbox series

Message ID mpt4l1iwsrk.fsf@arm.com
State New
Headers show
Series
  • Support multiple ABIs in the same translation unit
Related show

Commit Message

Richard Sandiford Sept. 11, 2019, 7:13 p.m. UTC
Similar idea to the combine.c and gcse.c patches.


2019-09-11  Richard Sandiford  <richard.sandiford@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.

Patch
diff mbox series

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))
 	    {