openbsd-ports/lang/gcc/3.3/patches/pp-gcc_cse_c
2005-01-04 23:06:33 +00:00

35 lines
1.2 KiB
Plaintext

$OpenBSD: pp-gcc_cse_c,v 1.1 2005/01/04 23:06:33 espie Exp $
--- gcc/cse.c.orig Sun Mar 21 17:28:59 2004
+++ gcc/cse.c Mon Jan 3 10:17:42 2005
@@ -4309,7 +4309,14 @@ fold_rtx (x, insn)
if (new_const == 0)
break;
-
+#ifndef FRAME_GROWS_DOWNWARD
+ if (flag_propolice_protection
+ && GET_CODE (y) == PLUS
+ && XEXP (y, 0) == frame_pointer_rtx
+ && INTVAL (inner_const) > 0
+ && INTVAL (new_const) <= 0)
+ break;
+#endif
/* If we are associating shift operations, don't let this
produce a shift of the size of the object or larger.
This could occur when we follow a sign-extend by a right
@@ -4844,6 +4851,14 @@ cse_insn (insn, libcall_insn)
if (SET_DEST (x) == pc_rtx
&& GET_CODE (SET_SRC (x)) == LABEL_REF)
;
+ /* cut the reg propagation of stack-protected argument */
+ else if (x->volatil) {
+ rtx x1 = SET_DEST (x);
+ if (GET_CODE (x1) == SUBREG && GET_CODE (SUBREG_REG (x1)) == REG)
+ x1 = SUBREG_REG (x1);
+ if (! REGNO_QTY_VALID_P(REGNO (x1)))
+ make_new_qty (REGNO (x1), GET_MODE (x1));
+ }
/* Don't count call-insns, (set (reg 0) (call ...)), as a set.
The hard function value register is used only once, to copy to