On Thu, Aug 03, 2006 at 11:55:49PM -0700, Ian Lance Taylor wrote:
>
> In general, operand_mode[] will be unreliable in cases where it is not
> specified. This is frowned upon but more or less permitted, and a few
> backends take advantage of it for relatively nefarious purposes.
I only have modeless operands in "call_value" and "setmemhi" and I don't
know how that can be avoided. But presumably, GET_MODE_BITSIZE (VOIDmode)
returns something sensible like 0, so it shouldn't be a problem.
> Still, I can't think of a better approach for this problem. It's
> worth a try to set rld[i].mode to operand_mode[] when operand_mode[]
> is larger. I don't see that you will have to worry about matching
> constraints. A big-endian system might be an issue; hopefully
> reload_adjust_reg_for_mode is called whereever necessary.
I tried this patch to find_reloads(), and it did solve the problem.
Index: gcc/reload.c
===================================================================
--- gcc/reload.c (revision 115810)
+++ gcc/reload.c (working copy)
@@ -4416,6 +4428,12 @@
> GET_MODE_SIZE (rld[i].inmode)))
? rld[i].outmode : rld[i].inmode;
+ /* Don't be fooled by e.g. paradoxical subreg operands.
+ We need a register which is at least as wide as the operand. */
+ if (GET_MODE_BITSIZE (rld[i].mode)
+ < GET_MODE_BITSIZE (operand_mode[rld[i].opnum]))
+ rld[i].mode = operand_mode[i];
+
rld[i].nregs = CLASS_MAX_NREGS (rld[i].class, rld[i].mode);
}
Before reload:
(insn:HI 2485 2483 2486 39 ../../../cvssrc/gcc/gcc/libgcc2.c:1825 (set
(subreg:HI (reg:QI 178) 0)
(ashiftrt:HI (reg:HI 641)
(const_int 15 [0xf]))) 31 {*ashrhi3_const15}
(insn_list:REG_DEP_TRUE 2480 (nil))
(expr_list:REG_DEAD (reg:HI 641)
(nil)))
After reload:
Reloads for insn # 2485
Reload 0: reload_out (QI) = (reg:QI 178)
DX_REGS, RELOAD_FOR_OUTPUT (opnum = 0)
reload_out_reg: (reg:QI 178)
reload_reg_rtx: (reg:HI 4 d)
(insn:HI 2485 2483 2604 39 ../../../cvssrc/gcc/gcc/libgcc2.c:1825 (set (reg:HI
4 d)
(ashiftrt:HI (reg:HI 2 a [641])
(const_int 15 [0xf]))) 31 {*ashrhi3_const15}
(insn_list:REG_DEP_TRUE 2480 (nil))
(nil))
(insn 2604 2485 2486 39 ../../../cvssrc/gcc/gcc/libgcc2.c:1825 (set (mem/c:QI
(plus:HI (reg/f:HI 10 bp)
(const_int -42 [0xffffffd6])) [10 S1 A8])
(reg:QI 4 d)) 34 {movqi} (nil)
(nil))
This is close to what it looked like before combine (in the life1 dump):
(insn 2483 2480 2485 40 ../../../cvssrc/gcc/gcc/libgcc2.c:1825 (set (reg:HI 643)
(ashiftrt:HI (reg:HI 641)
(const_int 15 [0xf]))) 31 {*ashrhi3_const15}
(insn_list:REG_DEP_TRUE 2480 (nil))
(expr_list:REG_DEAD (reg:HI 641)
(nil)))
(insn 2485 2483 2486 40 ../../../cvssrc/gcc/gcc/libgcc2.c:1825 (set (reg:QI 178)
(subreg:QI (reg:HI 643) 0)) 34 {movqi} (insn_list:REG_DEP_TRUE 2483
(nil))
(expr_list:REG_DEAD (reg:HI 643)
(nil)))
But nice try anyway, combine. :-)
--
Rask Ingemann Lambertsen