strcpy arg optimised out
authorAlan Modra <amodra@gmail.com>
Fri, 1 Jul 2016 11:15:17 +0000 (20:45 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Fri, 1 Jul 2016 11:15:17 +0000 (20:45 +0930)
For functions that return an argument unchanged, like strcat,
find_call_crossed_cheap_reg attempts to find an assignment between
a pseudo reg and the arg reg before the call, so that uses of the
pseudo after the call can instead use the return value.  The exit
condition on the loop looking at previous insns was wrong.  Uses of
the arg reg don't matter.  What matters is the insn setting the arg
reg as any assignment involving the arg reg prior to that insn is
likely a completely unrelated use of the hard reg.

PR rtl-optimization/71709
* ira-lives.c (find_call_crossed_cheap_reg): Exit loop on arg reg
being set, not referenced.

From-SVN: r237909

gcc/ChangeLog
gcc/ira-lives.c

index 685847bf043910f053e1708a039fa8984100d119..6551c0ec31c3cf65ceb7c6238763148f56a95e65 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-01  Alan Modra  <amodra@gmail.com>
+
+       PR rtl-optimization/71709
+       * ira-lives.c (find_call_crossed_cheap_reg): Exit loop on arg reg
+       being set, not referenced.
+
 2016-07-01  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        PR tree-optimization/70729
index 6950ffb17b31cd5e52dfd948a00645ae163f9ac9..6b7ee81bea16fd51373f7b1463004bfc48527a2d 100644 (file)
@@ -1014,7 +1014,7 @@ find_call_crossed_cheap_reg (rtx_insn *insn)
                  break;
                }
 
-             if (reg_overlap_mentioned_p (reg, PATTERN (prev)))
+             if (reg_set_p (reg, prev))
                break;
            }
          prev = PREV_INSN (prev);