Backported from mainline
2013-08-23 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/58209
* tree-tailcall.c (find_tail_calls): Give up for pointer result types
if m or a is non-NULL.
* gcc.c-torture/execute/pr58209.c: New test.
From-SVN: r210170
2014-05-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2013-08-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/58209
+ * tree-tailcall.c (find_tail_calls): Give up for pointer result types
+ if m or a is non-NULL.
+
2013-07-03 Jakub Jelinek <jakub@redhat.com>
PR target/57777
2014-05-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2013-08-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/58209
+ * gcc.c-torture/execute/pr58209.c: New test.
+
2013-07-03 Jakub Jelinek <jakub@redhat.com>
PR target/57777
--- /dev/null
+/* PR tree-optimization/58209 */
+
+extern void abort (void);
+typedef __INTPTR_TYPE__ T;
+T buf[1024];
+
+T *
+foo (T n)
+{
+ if (n == 0)
+ return (T *) buf;
+ T s = (T) foo (n - 1);
+ return (T *) (s + sizeof (T));
+}
+
+T *
+bar (T n)
+{
+ if (n == 0)
+ return buf;
+ return foo (n - 1) + 1;
+}
+
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 27; i++)
+ if (foo (i) != buf + i || bar (i) != buf + i)
+ abort ();
+ return 0;
+}
if (!tail_recursion && (m || a))
return;
+ /* For pointers don't allow additions or multiplications. */
+ if ((m || a)
+ && POINTER_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
+ return;
+
nw = XNEW (struct tailcall);
nw->call_gsi = gsi;