This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]