re PR middle-end/90553 (Register allocation allocates post-incremented address-load...
authorHans-Peter Nilsson <hp@axis.com>
Wed, 22 May 2019 00:35:32 +0000 (00:35 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Wed, 22 May 2019 00:35:32 +0000 (00:35 +0000)
PR middle-end/90553
* ira-lives.c (process_bb_node_lives): Consider defs
for a call insn to be die before the call, not after.

From-SVN: r271498

gcc/ChangeLog
gcc/ira-lives.c

index 9c4c21589cabfecaeb83a7dc421ca7a56c3aa498..e5e0fe18159694b31fb9695fbc434e4ecef9bac4 100644 (file)
@@ -1,5 +1,9 @@
 2019-05-22  Hans-Peter Nilsson  <hp@axis.com>
 
+       PR middle-end/90553
+       * ira-lives.c (process_bb_node_lives): Consider defs
+       for a call insn to be die before the call, not after.
+
        * function.c (assign_parm_setup_block): Raise alignment of
        stacked parameter only for STRICT_ALIGNMENT targets.
 
index faadf08b07387ccc1b3c4a5f339767557ec4165d..581fdd36aa4adae0c072e6a9e77d518f2eeb12d9 100644 (file)
@@ -1241,11 +1241,6 @@ process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
          preprocess_constraints (insn);
          process_single_reg_class_operands (false, freq);
 
-         /* See which defined values die here.  */
-         FOR_EACH_INSN_DEF (def, insn)
-           if (!call_p || !DF_REF_FLAGS_IS_SET (def, DF_REF_MAY_CLOBBER))
-             mark_ref_dead (def);
-
          if (call_p)
            {
              /* Try to find a SET in the CALL_INSN_FUNCTION_USAGE, and from
@@ -1309,6 +1304,17 @@ process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
                }
            }
 
+         /* See which defined values die here.  Note that we include
+            the call insn in the lifetimes of these values, so we don't
+            mistakenly consider, for e.g. an addressing mode with a
+            side-effect like a post-increment fetching the address,
+            that the use happens before the call, and the def to happen
+            after the call: we believe both to happen before the actual
+            call.  (We don't handle return-values here.)  */
+         FOR_EACH_INSN_DEF (def, insn)
+           if (!call_p || !DF_REF_FLAGS_IS_SET (def, DF_REF_MAY_CLOBBER))
+             mark_ref_dead (def);
+
          make_early_clobber_and_input_conflicts ();
 
          curr_point++;