Hi, expand_builtin_strlen has
src_reg = gen_reg_rtx (Pmode); ... pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL); if (pat != src_reg) emit_move_insn (src_reg, pat); But src_reg may be in ptr_mode, wich may not be the same as Pmode. This patch checks it. OK for trunk? Thanks. H.J. --- 2011-06-11 H.J. Lu <hongjiu...@intel.com> PR middle-end/47364 * builtins.c (expand_builtin_strlen): Properly handle target not in Pmode. diff --git a/gcc/builtins.c b/gcc/builtins.c index 7b24a0c..4e2cf31 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2941,7 +2941,11 @@ expand_builtin_strlen (tree exp, rtx target, start_sequence (); pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL); if (pat != src_reg) - emit_move_insn (src_reg, pat); + { + if (GET_MODE (pat) != Pmode) + pat = convert_to_mode (Pmode, pat, 1); + emit_move_insn (src_reg, pat); + } pat = get_insns (); end_sequence ();