[backport from gcc-4.7/trunk via ARM/embedded-4_6-branch ] From: Richard Sandiford Subject: Use gen_int_mode in expand_builtin_memset_args Date: Mon, 28 Mar 2011 16:47:35 +0100 List-Archive: This patch fixes a case where expand_builtin_memset_args was creating a zero- rather than sign-extended character-sized CONST_INT. The problem showed up on s390, where a character was being passed as (const_int 171) rather than (const_int -85). Tested on x86_64-linux-gnu. Andreas also confirms that it fixes the s390 failure. OK to install? Richard gcc/ 2011-09-19 chengbin Backport r171632 from mainline 2011-03-28 Richard Sandiford * builtins.c (expand_builtin_memset_args): Use gen_int_mode instead of GEN_INT. --- gcc-4.6.2/gcc/builtins.c.~1~ 2011-10-06 21:57:52.000000000 +0200 +++ gcc-4.6.2/gcc/builtins.c 2011-12-17 19:11:53.000000000 +0100 @@ -3972,6 +3972,7 @@ expand_builtin_memset_args (tree dest, t { tree fndecl, fn; enum built_in_function fcode; + enum machine_mode val_mode; char c; unsigned int dest_align; rtx dest_mem, dest_addr, len_rtx; @@ -4006,14 +4007,14 @@ expand_builtin_memset_args (tree dest, t len_rtx = expand_normal (len); dest_mem = get_memory_rtx (dest, len); + val_mode = TYPE_MODE (unsigned_char_type_node); if (TREE_CODE (val) != INTEGER_CST) { rtx val_rtx; val_rtx = expand_normal (val); - val_rtx = convert_to_mode (TYPE_MODE (unsigned_char_type_node), - val_rtx, 0); + val_rtx = convert_to_mode (val_mode, val_rtx, 0); /* Assume that we can memset by pieces if we can store * the coefficients by pieces (in the required modes). @@ -4024,8 +4025,7 @@ expand_builtin_memset_args (tree dest, t builtin_memset_read_str, &c, dest_align, true)) { - val_rtx = force_reg (TYPE_MODE (unsigned_char_type_node), - val_rtx); + val_rtx = force_reg (val_mode, val_rtx); store_by_pieces (dest_mem, tree_low_cst (len, 1), builtin_memset_gen_str, val_rtx, dest_align, true, 0); @@ -4051,7 +4051,8 @@ expand_builtin_memset_args (tree dest, t true)) store_by_pieces (dest_mem, tree_low_cst (len, 1), builtin_memset_read_str, &c, dest_align, true, 0); - else if (!set_storage_via_setmem (dest_mem, len_rtx, GEN_INT (c), + else if (!set_storage_via_setmem (dest_mem, len_rtx, + gen_int_mode (c, val_mode), dest_align, expected_align, expected_size)) goto do_libcall;