This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Add REG_EQUAL note to forced-to-mem const to reg move
- To: gcc-patches at gcc dot gnu dot org
- Subject: Add REG_EQUAL note to forced-to-mem const to reg move
- From: Alexandre Oliva <aoliva at redhat dot com>
- Date: 22 Jan 2001 11:39:54 -0200
- Organization: GCC Team, Red Hat
When a constant has to be forced into memory, we miss some obvious
optimizations, because we don't know the value of the register loaded
from the constant pool through a complex addressing mode. That's the
case of gcc.c-torture/execute/builtin-abs-[12].c on sh-elf with -m2
-O1 -fPIC.
This patch adds a REG_EQUAL note to the insn that moves the constant
from memory, so that the RTL optimizer can do its job. With this
patch, the tests mentioned above don't fail to link.
Ok to install, assuming bootstrap on i686-pc-linux-gnu succeeds?
Index: gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* expr.c (emit_move_insn): Add REG_EQUAL note when constant loaded
into register was forced into memory.
Index: gcc/expr.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/expr.c,v
retrieving revision 1.291
diff -u -p -r1.291 expr.c
--- gcc/expr.c 2001/01/20 17:47:45 1.291
+++ gcc/expr.c 2001/01/22 13:38:32
@@ -2709,6 +2709,8 @@ emit_move_insn (x, y)
rtx x, y;
{
enum machine_mode mode = GET_MODE (x);
+ rtx y_cst = NULL_RTX;
+ rtx last_insn;
x = protect_from_queue (x, 1);
y = protect_from_queue (y, 0);
@@ -2720,7 +2722,10 @@ emit_move_insn (x, y)
if (GET_CODE (y) == CONSTANT_P_RTX)
;
else if (CONSTANT_P (y) && ! LEGITIMATE_CONSTANT_P (y))
- y = force_const_mem (mode, y);
+ {
+ y_cst = y;
+ y = force_const_mem (mode, y);
+ }
/* If X or Y are memory references, verify that their addresses are valid
for the machine. */
@@ -2740,7 +2745,13 @@ emit_move_insn (x, y)
if (mode == BLKmode)
abort ();
- return emit_move_insn_1 (x, y);
+ last_insn = emit_move_insn_1 (x, y);
+
+ if (y_cst && GET_CODE (x) == REG)
+ REG_NOTES (last_insn)
+ = gen_rtx_EXPR_LIST (REG_EQUAL, y_cst, REG_NOTES (last_insn));
+
+ return last_insn;
}
/* Low level part of emit_move_insn.
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist *Please* write to mailing lists, not to me