This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PATCH [1/n]: Prepare x32: PR middle-end/47364: internal compiler error: in emit_move_insn, at expr.c:3355
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 11 Jun 2011 08:09:53 -0700
- Subject: PATCH [1/n]: Prepare x32: PR middle-end/47364: internal compiler error: in emit_move_insn, at expr.c:3355
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
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.lu@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 ();