[patch RFA] Handle blockage insn in mode-switching.c/create_pre_exit

Kaz Kojima kkojima@rr.iij4u.or.jp
Thu Mar 8 06:22:00 GMT 2007


Hi,

The mainline fails to build for sh4-unknown-linux-gnu during
the compilation of libgcc2.c:

../../../ORIG/trunk/libgcc/../gcc/libgcc2.c: In function '__divdi3':
../../../ORIG/trunk/libgcc/../gcc/libgcc2.c:1102: internal compiler error: in create_pre_exit, at mode-switching.c:352

It starts to fail after the patch

r122626 | aph | 2007-03-07 02:21:37 +0900 (Wed, 07 Mar 2007) | 6 lines

2007-03-06  Andrew Haley  <aph@redhat.com>

        * function.c (expand_function_end): Move blockage to just after we
        emit the label for the naked return from the function.

The function mode-switching.c/create_pre_exit scans insns from
the last to find the insns for return copy.  Now the last insns are

(insn 453 394 454 51 (set (reg:SI 0 r0 [ <result> ])
        (reg:SI 262 [ w ])) 172 {movsi_ie} (nil)
    (expr_list:REG_DEAD (reg:SI 262 [ w ])
        (nil)))

(insn 454 453 406 51 (set (reg:SI 1 r1 [ <result>+4 ])
        (reg:SI 263 [ w+4 ])) 172 {movsi_ie} (nil)
    (expr_list:REG_DEAD (reg:SI 263 [ w+4 ])
        (nil)))

(insn 406 454 407 51 (asm_input ("")) -1 (nil)
    (nil))

(insn 407 406 0 51 (use (reg/i:DI 0 r0 [ <result> ])) -1 (insn_list:REG_DEP_TRUE 453 (nil))
    (nil))

in the above failed case but create_pre_exit can't handle
the blockage insn.  The attached patch is to handle it and
fixes the build failure for sh4-unknown-linux-gnu.
It's tested with bootstrap and regtested with the top level
"make -k check" on i686-pc-linux-gnu with no new failures.

Regards,
	kaz
--
:ADDPATCH rtl-optimization:

2007-03-07  Kaz Kojima  <kkojima@gcc.gnu.org>

	* mode-switching.c (create_pre_exit): Skip blockage insn.

diff -uprN ORIG/trunk/gcc/mode-switching.c LOCAL/trunk/gcc/mode-switching.c
--- ORIG/trunk/gcc/mode-switching.c	2006-09-06 07:03:37.000000000 +0900
+++ LOCAL/trunk/gcc/mode-switching.c	2007-03-07 16:45:42.000000000 +0900
@@ -259,6 +259,11 @@ create_pre_exit (int n_entities, int *en
 			last_insn = return_copy;
 			continue;
 		      }
+		    if (GET_CODE (PATTERN (return_copy)) == ASM_INPUT)
+		      {
+			last_insn = return_copy;
+			continue;
+		      }
 		    /* If the return register is not (in its entirety)
 		       likely spilled, the return copy might be
 		       partially or completely optimized away.  */



More information about the Gcc-patches mailing list