summaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index fd26d015763..aa9e96584a1 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -68,7 +68,7 @@ enum machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */
/* Datastructures maintained for currently processed function in RTL form. */
-struct rtl_data rtl;
+struct rtl_data x_rtl;
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_align.
@@ -172,11 +172,11 @@ static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
htab_t const_fixed_htab;
-#define first_insn (rtl.emit.x_first_insn)
-#define last_insn (rtl.emit.x_last_insn)
-#define cur_insn_uid (rtl.emit.x_cur_insn_uid)
-#define last_location (rtl.emit.x_last_location)
-#define first_label_num (rtl.emit.x_first_label_num)
+#define first_insn (crtl->emit.x_first_insn)
+#define last_insn (crtl->emit.x_last_insn)
+#define cur_insn_uid (crtl->emit.x_cur_insn_uid)
+#define last_location (crtl->emit.x_last_location)
+#define first_label_num (crtl->emit.x_first_label_num)
static rtx make_call_insn_raw (rtx);
static rtx change_address_1 (rtx, enum machine_mode, rtx, int);
@@ -887,22 +887,22 @@ gen_reg_rtx (enum machine_mode mode)
/* Make sure regno_pointer_align, and regno_reg_rtx are large
enough to have an element for this pseudo reg number. */
- if (reg_rtx_no == rtl.emit.regno_pointer_align_length)
+ if (reg_rtx_no == crtl->emit.regno_pointer_align_length)
{
- int old_size = rtl.emit.regno_pointer_align_length;
+ int old_size = crtl->emit.regno_pointer_align_length;
char *new;
rtx *new1;
- new = xrealloc (rtl.emit.regno_pointer_align, old_size * 2);
+ new = xrealloc (crtl->emit.regno_pointer_align, old_size * 2);
memset (new + old_size, 0, old_size);
- rtl.emit.regno_pointer_align = (unsigned char *) new;
+ crtl->emit.regno_pointer_align = (unsigned char *) new;
new1 = ggc_realloc (regno_reg_rtx,
old_size * 2 * sizeof (rtx));
memset (new1 + old_size, 0, old_size * sizeof (rtx));
regno_reg_rtx = new1;
- rtl.emit.regno_pointer_align_length = old_size * 2;
+ crtl->emit.regno_pointer_align_length = old_size * 2;
}
val = gen_raw_REG (mode, reg_rtx_no);
@@ -964,11 +964,32 @@ set_reg_attrs_from_value (rtx reg, rtx x)
int offset;
offset = byte_lowpart_offset (GET_MODE (reg), GET_MODE (x));
- if (MEM_P (x) && MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT)
- REG_ATTRS (reg)
- = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset);
- if (REG_P (x) && REG_ATTRS (x))
- update_reg_offset (reg, x, offset);
+ if (MEM_P (x))
+ {
+ if (MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT)
+ REG_ATTRS (reg)
+ = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset);
+ if (MEM_POINTER (x))
+ mark_reg_pointer (reg, MEM_ALIGN (x));
+ }
+ else if (REG_P (x))
+ {
+ if (REG_ATTRS (x))
+ update_reg_offset (reg, x, offset);
+ if (REG_POINTER (x))
+ mark_reg_pointer (reg, REGNO_POINTER_ALIGN (REGNO (x)));
+ }
+}
+
+/* Generate a REG rtx for a new pseudo register, copying the mode
+ and attributes from X. */
+
+rtx
+gen_reg_rtx_and_attrs (rtx x)
+{
+ rtx reg = gen_reg_rtx (GET_MODE (x));
+ set_reg_attrs_from_value (reg, x);
+ return reg;
}
/* Set the register attributes for registers contained in PARM_RTX.
@@ -4988,14 +5009,14 @@ init_emit (void)
/* Init the tables that describe all the pseudo regs. */
- rtl.emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
+ crtl->emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
- rtl.emit.regno_pointer_align
- = xcalloc (rtl.emit.regno_pointer_align_length
+ crtl->emit.regno_pointer_align
+ = xcalloc (crtl->emit.regno_pointer_align_length
* sizeof (unsigned char), 1);
regno_reg_rtx
- = ggc_alloc (rtl.emit.regno_pointer_align_length * sizeof (rtx));
+ = ggc_alloc (crtl->emit.regno_pointer_align_length * sizeof (rtx));
/* Put copies of all the hard registers into regno_reg_rtx. */
memcpy (regno_reg_rtx,