Properly expand strlen to Pmode.
authorH.J. Lu <hongjiu.lu@intel.com>
Tue, 14 Jun 2011 16:31:57 +0000 (16:31 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Tue, 14 Jun 2011 16:31:57 +0000 (09:31 -0700)
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.

From-SVN: r175034

gcc/ChangeLog
gcc/builtins.c

index 651f380e54f09728cfdd61a14807c799d22aef3f..56e88cfaabb3d1529d3558d49cc288ce2cf9c356 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 7b24a0ce70395fac8d23069dbdb8ddc231fc5645..cf975e578a77c94a6414f6473cc0e6a13a3135a9 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 ();