re PR middle-end/71732 (FAIL: gcc.dg/torture/pr71532.c at -O2 and above)
authorJohn David Anglin <danglin@gcc.gnu.org>
Mon, 25 Jul 2016 17:32:44 +0000 (17:32 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Mon, 25 Jul 2016 17:32:44 +0000 (17:32 +0000)
PR middle-end/71732
* cselib.c (cselib_process_insn): Invalidate argument slots for
const/pure calls.

From-SVN: r238727

gcc/ChangeLog
gcc/cselib.c

index 303e4f5b9e39c0f87b2a0507bef31e0b22fe9842..97a9ab094fc71f8cee81bc6e7bc5f9a3bd021a53 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-25  John David Anglin  <danglin@gcc.gnu.org>
+
+       PR middle-end/71732
+       * cselib.c (cselib_process_insn): Invalidate argument slots for
+       const/pure calls.
+
 2016-07-25  Jiong Wang  <jiong.wang@arm.com>
 
        * config/aarch64/arm_neon.h (vfmah_lane_f16, vfmah_laneq_f16,
index 14c7b320b0353449e59cd6850ce16f366ebb1f5a..0c5183cf7307e9dd53d8a0c71c6913a80ee2d647 100644 (file)
@@ -2659,6 +2659,13 @@ cselib_process_insn (rtx_insn *insn)
       if (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
          || !(RTL_CONST_OR_PURE_CALL_P (insn)))
        cselib_invalidate_mem (callmem);
+      else
+       /* For const/pure calls, invalidate any argument slots because
+          they are owned by the callee.  */
+       for (x = CALL_INSN_FUNCTION_USAGE (insn); x; x = XEXP (x, 1))
+         if (GET_CODE (XEXP (x, 0)) == USE
+             && MEM_P (XEXP (XEXP (x, 0), 0)))
+           cselib_invalidate_mem (XEXP (XEXP (x, 0), 0));
     }
 
   cselib_record_sets (insn);