This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Question about merging two instructions.
- From: Leehod Baruch <LEEHOD at il dot ibm dot com>
- To: gcc at gcc dot gnu dot org
- Cc: Steven Bosscher <stevenb at suse dot de>, Roger Sayle <roger at eyesopen dot com>, Paolo Bonzini <paolo dot bonzini at lu dot unisi dot ch>, Mircea Namolaru <NAMOLARU at il dot ibm dot com>
- Date: Sun, 21 Aug 2005 16:52:32 +0300
- Subject: Question about merging two instructions.
Hello,
I'm working on a the sign extension elimination pass.
(see http://gcc.gnu.org/ml/gcc-patches/2005-08/msg01087.html for details)
I would like to merge these two instructions:
(insn 1 0 2 0 (set (reg/v:Xmode r)
(sign_extend:Xmode (op:Ymode (...))))
(insn 2 1 3 0 (set (lhs) (rhs)))
where:
1. Xmode > Ymode
2. rhs and/or lhs may contain: (subreg:Ymode (reg/v:Xmode r) lowpart)
The extension may be redundant here.
I would like to merge these instructions and eliminate the extension,
if possible.
I tried to use simplify_replace_rtx to replace any use of (reg r) with
the right-hand-side of the extension and simplify the result.
But, it didn't work till I added this change:
Index: simplify-rtx.c
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/simplify-rtx.c,v
retrieving revision 1.243
diff -c -3 -p -r1.243 simplify-rtx.c
*** simplify-rtx.c 16 Aug 2005 02:01:27 -0000 1.243
--- simplify-rtx.c 21 Aug 2005 12:07:57 -0000
*************** simplify_replace_rtx (rtx x, rtx old_rtx
*** 319,325 ****
return simplify_gen_ternary (code, mode, op_mode, op0, op1, op2);
case RTX_EXTRA:
- /* The only case we try to handle is a SUBREG. */
if (code == SUBREG)
{
op0 = simplify_replace_rtx (SUBREG_REG (x), old_rtx, new_rtx);
--- 319,324 ----
*************** simplify_replace_rtx (rtx x, rtx old_rtx
*** 329,334 ****
--- 328,341 ----
GET_MODE (SUBREG_REG (x)),
SUBREG_BYTE (x));
return op0 ? op0 : x;
+ }
+ if (code == SET)
+ {
+ op0 = simplify_replace_rtx (XEXP (x, 0), old_rtx, new_rtx);
+ op1 = simplify_replace_rtx (XEXP (x, 1), old_rtx, new_rtx);
+ if ((op0 == XEXP (x, 0)) && (op1 == XEXP (x, 1)))
+ return x;
+ return gen_rtx_SET (VOIDmode, op0, op1);
}
break;
This way, when the replacement succeeds and the result instruction
is recognizable, I can eliminate the extension.
Does it seem like a good change?
Does anyone have a better solution?
Thanks,
Leehod.