This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[tree-ssa] S/390: Fix loops emitted by backend
- From: Ulrich Weigand <weigand at i1 dot informatik dot uni-erlangen dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 5 Mar 2004 19:03:21 +0100 (CET)
- Subject: [tree-ssa] S/390: Fix loops emitted by backend
Hello,
this patch makes gcc bootstrap on the tree-ssa branch for
s390-ibm-linux and s390x-ibm-linux targets. The problem was
that we were manually constructing a loop in the string
expanders, using the expand_exit_loop_top_cond routine.
This doesn't work any longer as expected, since loop header
copying isn't done on RTL any more; also, for some reason
doloop now got confused into computing incorrect loop
iteration counts.
Fixed by performing loop header copying manually.
Bootstrapped/regtested on s390-ibm-linux and s390x-ibm-linux,
applied to the tree-ssa branch.
Bye,
Ulrich
ChangeLog:
* config/s390/s390.c (s390_expand_movstr): Do not use
expand_exit_loop_top_cond, manually copy loop header.
(s390_expand_clrstr): Likewise.
(s390_expand_cmpmem): Likewise.
Index: gcc/config/s390/s390.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/s390/s390.c,v
retrieving revision 1.41.2.31
diff -c -p -r1.41.2.31 s390.c
*** gcc/config/s390/s390.c 13 Feb 2004 13:13:11 -0000 1.41.2.31
--- gcc/config/s390/s390.c 1 Mar 2004 21:33:24 -0000
*************** s390_expand_movstr (rtx dst, rtx src, rt
*** 2942,2959 ****
else
{
rtx dst_addr, src_addr, count, blocks, temp;
rtx end_label = gen_label_rtx ();
enum machine_mode mode;
- tree type;
mode = GET_MODE (len);
if (mode == VOIDmode)
mode = Pmode;
- type = lang_hooks.types.type_for_mode (mode, 1);
- if (!type)
- abort ();
-
dst_addr = gen_reg_rtx (Pmode);
src_addr = gen_reg_rtx (Pmode);
count = gen_reg_rtx (mode);
--- 2942,2955 ----
else
{
rtx dst_addr, src_addr, count, blocks, temp;
+ rtx loop_end_label = gen_label_rtx ();
rtx end_label = gen_label_rtx ();
enum machine_mode mode;
mode = GET_MODE (len);
if (mode == VOIDmode)
mode = Pmode;
dst_addr = gen_reg_rtx (Pmode);
src_addr = gen_reg_rtx (Pmode);
count = gen_reg_rtx (mode);
*************** s390_expand_movstr (rtx dst, rtx src, rt
*** 2976,2985 ****
if (temp != blocks)
emit_move_insn (blocks, temp);
expand_start_loop (1);
- expand_exit_loop_top_cond (0, build (NE_EXPR, type,
- make_tree (type, blocks),
- make_tree (type, const0_rtx)));
emit_insn (gen_movstr_short (dst, src, GEN_INT (255)));
s390_load_address (dst_addr,
--- 2972,2980 ----
if (temp != blocks)
emit_move_insn (blocks, temp);
+ emit_cmp_and_jump_insns (blocks, const0_rtx,
+ EQ, NULL_RTX, mode, 1, loop_end_label);
expand_start_loop (1);
emit_insn (gen_movstr_short (dst, src, GEN_INT (255)));
s390_load_address (dst_addr,
*************** s390_expand_movstr (rtx dst, rtx src, rt
*** 2991,2997 ****
--- 2986,2995 ----
if (temp != blocks)
emit_move_insn (blocks, temp);
+ emit_cmp_and_jump_insns (blocks, const0_rtx,
+ EQ, NULL_RTX, mode, 1, loop_end_label);
expand_end_loop ();
+ emit_label (loop_end_label);
emit_insn (gen_movstr_short (dst, src,
convert_to_mode (Pmode, count, 1)));
*************** s390_expand_clrstr (rtx dst, rtx len)
*** 3018,3035 ****
else
{
rtx dst_addr, src_addr, count, blocks, temp;
rtx end_label = gen_label_rtx ();
enum machine_mode mode;
- tree type;
mode = GET_MODE (len);
if (mode == VOIDmode)
mode = Pmode;
- type = lang_hooks.types.type_for_mode (mode, 1);
- if (!type)
- abort ();
-
dst_addr = gen_reg_rtx (Pmode);
src_addr = gen_reg_rtx (Pmode);
count = gen_reg_rtx (mode);
--- 3016,3029 ----
else
{
rtx dst_addr, src_addr, count, blocks, temp;
+ rtx loop_end_label = gen_label_rtx ();
rtx end_label = gen_label_rtx ();
enum machine_mode mode;
mode = GET_MODE (len);
if (mode == VOIDmode)
mode = Pmode;
dst_addr = gen_reg_rtx (Pmode);
src_addr = gen_reg_rtx (Pmode);
count = gen_reg_rtx (mode);
*************** s390_expand_clrstr (rtx dst, rtx len)
*** 3050,3059 ****
if (temp != blocks)
emit_move_insn (blocks, temp);
expand_start_loop (1);
- expand_exit_loop_top_cond (0, build (NE_EXPR, type,
- make_tree (type, blocks),
- make_tree (type, const0_rtx)));
emit_insn (gen_clrstr_short (dst, GEN_INT (255)));
s390_load_address (dst_addr,
--- 3044,3052 ----
if (temp != blocks)
emit_move_insn (blocks, temp);
+ emit_cmp_and_jump_insns (blocks, const0_rtx,
+ EQ, NULL_RTX, mode, 1, loop_end_label);
expand_start_loop (1);
emit_insn (gen_clrstr_short (dst, GEN_INT (255)));
s390_load_address (dst_addr,
*************** s390_expand_clrstr (rtx dst, rtx len)
*** 3063,3069 ****
--- 3056,3065 ----
if (temp != blocks)
emit_move_insn (blocks, temp);
+ emit_cmp_and_jump_insns (blocks, const0_rtx,
+ EQ, NULL_RTX, mode, 1, loop_end_label);
expand_end_loop ();
+ emit_label (loop_end_label);
emit_insn (gen_clrstr_short (dst, convert_to_mode (Pmode, count, 1)));
emit_label (end_label);
*************** s390_expand_cmpmem (rtx target, rtx op0,
*** 3106,3123 ****
else
{
rtx addr0, addr1, count, blocks, temp;
rtx end_label = gen_label_rtx ();
enum machine_mode mode;
- tree type;
mode = GET_MODE (len);
if (mode == VOIDmode)
mode = Pmode;
- type = lang_hooks.types.type_for_mode (mode, 1);
- if (!type)
- abort ();
-
addr0 = gen_reg_rtx (Pmode);
addr1 = gen_reg_rtx (Pmode);
count = gen_reg_rtx (mode);
--- 3102,3115 ----
else
{
rtx addr0, addr1, count, blocks, temp;
+ rtx loop_end_label = gen_label_rtx ();
rtx end_label = gen_label_rtx ();
enum machine_mode mode;
mode = GET_MODE (len);
if (mode == VOIDmode)
mode = Pmode;
addr0 = gen_reg_rtx (Pmode);
addr1 = gen_reg_rtx (Pmode);
count = gen_reg_rtx (mode);
*************** s390_expand_cmpmem (rtx target, rtx op0,
*** 3140,3149 ****
if (temp != blocks)
emit_move_insn (blocks, temp);
expand_start_loop (1);
- expand_exit_loop_top_cond (0, build (NE_EXPR, type,
- make_tree (type, blocks),
- make_tree (type, const0_rtx)));
emit_insn (gen_cmpmem_short (op0, op1, GEN_INT (255)));
temp = gen_rtx_NE (VOIDmode, gen_rtx_REG (CCSmode, 33), const0_rtx);
--- 3132,3140 ----
if (temp != blocks)
emit_move_insn (blocks, temp);
+ emit_cmp_and_jump_insns (blocks, const0_rtx,
+ EQ, NULL_RTX, mode, 1, loop_end_label);
expand_start_loop (1);
emit_insn (gen_cmpmem_short (op0, op1, GEN_INT (255)));
temp = gen_rtx_NE (VOIDmode, gen_rtx_REG (CCSmode, 33), const0_rtx);
*************** s390_expand_cmpmem (rtx target, rtx op0,
*** 3161,3167 ****
--- 3152,3161 ----
if (temp != blocks)
emit_move_insn (blocks, temp);
+ emit_cmp_and_jump_insns (blocks, const0_rtx,
+ EQ, NULL_RTX, mode, 1, loop_end_label);
expand_end_loop ();
+ emit_label (loop_end_label);
emit_insn (gen_cmpmem_short (op0, op1,
convert_to_mode (Pmode, count, 1)));
--
Dr. Ulrich Weigand
weigand@informatik.uni-erlangen.de