From fe5c443ea50fd90cba2352d5482d709fd2511d5b Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Tue, 2 Dec 2008 18:14:18 +0100
Subject: [PATCH] re PR middle-end/38343 (ice for legal code with -O2)

	PR middle-end/38343
	* builtins.c (fold_builtin_memory_op): Convert len to sizetype
	before using it in POINTER_PLUS_EXPR.

	* gcc.c-torture/compile/pr38343-2.c: New test.

From-SVN: r142363
---
 gcc/ChangeLog                                   |  6 ++++++
 gcc/builtins.c                                  |  1 +
 gcc/testsuite/ChangeLog                         |  5 +++++
 gcc/testsuite/gcc.c-torture/compile/pr38343-2.c | 12 ++++++++++++
 4 files changed, 24 insertions(+)
 create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr38343-2.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 843b22168bdf..a0a839c4ab94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-02  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/38343
+	* builtins.c (fold_builtin_memory_op): Convert len to sizetype
+	before using it in POINTER_PLUS_EXPR.
+
 2008-12-02  Richard Guenther  <rguenther@suse.de>
 
 	PR tree-optimization/38359
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 34066675873b..444baa606d1d 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -8993,6 +8993,7 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i
     len = fold_build2 (MINUS_EXPR, TREE_TYPE (len), len,
 		       ssize_int (1));
 
+  len = fold_convert (sizetype, len);
   dest = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
   dest = fold_convert (type, dest);
   if (expr)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 33d0f8650d98..a08d83b5b33b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-12-02  Jakub Jelinek  <jakub@redhat.com>
+
+	PR middle-end/38343
+	* gcc.c-torture/compile/pr38343-2.c: New test.
+
 2008-12-02  Richard Guenther  <rguenther@suse.de>
 
 	PR tree-optimization/38359
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr38343-2.c b/gcc/testsuite/gcc.c-torture/compile/pr38343-2.c
new file mode 100644
index 000000000000..8444cc78f06a
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr38343-2.c
@@ -0,0 +1,12 @@
+/* PR middle-end/38343 */
+
+static struct S
+{
+  char f[6];
+} s[] = { {"01000"} };
+
+char *
+foo (void)
+{
+  return __builtin_stpcpy (s[0].f, "S0022");
+}
-- 
GitLab