OSDN Git Service

Properly expand strlen to Pmode.
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Jun 2011 16:31:57 +0000 (16:31 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 14 Jun 2011 16:31:57 +0000 (16:31 +0000)
2011-06-14  H.J. Lu  <hongjiu.lu@intel.com>

PR middle-end/47364
* builtins.c (expand_builtin_strlen): Expand strlen to Pmode
and properly handle result not in Pmode.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@175034 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/builtins.c

index 651f380..56e88cf 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR middle-end/47364
+       * builtins.c (expand_builtin_strlen): Expand strlen to Pmode
+       and properly handle result not in Pmode.
+
 2011-06-14  Robert Millan  <rmh@gnu.org>
 
        * config/i386/kfreebsd-gnu.h: Resync with `config/i386/linux.h'.
index 7b24a0c..cf975e5 100644 (file)
@@ -2939,9 +2939,16 @@ expand_builtin_strlen (tree exp, rtx target,
 
       /* Now that we are assured of success, expand the source.  */
       start_sequence ();
-      pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
+      pat = expand_expr (src, src_reg, Pmode, EXPAND_NORMAL);
       if (pat != src_reg)
-       emit_move_insn (src_reg, pat);
+       {
+#ifdef POINTERS_EXTEND_UNSIGNED
+         if (GET_MODE (pat) != Pmode)
+           pat = convert_to_mode (Pmode, pat,
+                                  POINTERS_EXTEND_UNSIGNED);
+#endif
+         emit_move_insn (src_reg, pat);
+       }
       pat = get_insns ();
       end_sequence ();