Blame SOURCES/gcc32-s390-reload-dup.patch

6f1b0c
2002-09-26  Ulrich Weigand  <uweigand@de.ibm.com>
6f1b0c
6f1b0c
	* reload.c (dup_replacements): New function.
6f1b0c
	(find_reloads): Use it to duplicate replacements at the top level
6f1b0c
	of match_dup operands.
6f1b0c
6f1b0c
2004-10-25  Jakub Jelinek  <jakub@redhat.com>
6f1b0c
6f1b0c
	* gcc.c-torture/execute/20041025-1.c: New test.
6f1b0c
6f1b0c
--- gcc/reload.c.jj	2003-04-08 15:51:07.000000000 +0200	1.190
6f1b0c
+++ gcc/reload.c	2004-10-25 13:10:48.056167117 +0200	1.191
6f1b0c
@@ -244,6 +244,7 @@ static enum reg_class find_valid_class P
6f1b0c
 						unsigned int));
6f1b0c
 static int reload_inner_reg_of_subreg PARAMS ((rtx, enum machine_mode, int));
6f1b0c
 static void push_replacement	PARAMS ((rtx *, int, enum machine_mode));
6f1b0c
+static void dup_replacements	PARAMS ((rtx *, rtx *));
6f1b0c
 static void combine_reloads	PARAMS ((void));
6f1b0c
 static int find_reusable_reload	PARAMS ((rtx *, rtx, enum reg_class,
6f1b0c
 				       enum reload_type, int, int));
6f1b0c
@@ -1578,6 +1579,25 @@ push_replacement (loc, reloadnum, mode)
6f1b0c
       r->mode = mode;
6f1b0c
     }
6f1b0c
 }
6f1b0c
+
6f1b0c
+/* Duplicate any replacement we have recorded to apply at
6f1b0c
+   location ORIG_LOC to also be performed at DUP_LOC.
6f1b0c
+   This is used in insn patterns that use match_dup.  */
6f1b0c
+
6f1b0c
+static void
6f1b0c
+dup_replacements (dup_loc, orig_loc)
6f1b0c
+     rtx *dup_loc;
6f1b0c
+     rtx *orig_loc;
6f1b0c
+{
6f1b0c
+  int i, n = n_replacements;
6f1b0c
+
6f1b0c
+  for (i = 0; i < n; i++)
6f1b0c
+    {
6f1b0c
+      struct replacement *r = &replacements[i];
6f1b0c
+      if (r->where == orig_loc)
6f1b0c
+	push_replacement (dup_loc, r->what, r->mode);
6f1b0c
+    }
6f1b0c
+}
6f1b0c
 
6f1b0c
 /* Transfer all replacements that used to be in reload FROM to be in
6f1b0c
    reload TO.  */
6f1b0c
@@ -3969,9 +3989,7 @@ find_reloads (insn, replace, ind_levels,
6f1b0c
       {
6f1b0c
 	int opno = recog_data.dup_num[i];
6f1b0c
 	*recog_data.dup_loc[i] = *recog_data.operand_loc[opno];
6f1b0c
-	if (operand_reloadnum[opno] >= 0)
6f1b0c
-	  push_replacement (recog_data.dup_loc[i], operand_reloadnum[opno],
6f1b0c
-			    insn_data[insn_code_number].operand[opno].mode);
6f1b0c
+	dup_replacements (recog_data.dup_loc[i], recog_data.operand_loc[opno]);
6f1b0c
       }
6f1b0c
 
6f1b0c
 #if 0
6f1b0c
--- gcc/testsuite/gcc.c-torture/execute/20041025-1.c.jj	2004-10-25 13:13:28.604657996 +0200
6f1b0c
+++ gcc/testsuite/gcc.c-torture/execute/20041025-1.c	2004-10-25 13:11:43.119389360 +0200
6f1b0c
@@ -0,0 +1,17 @@
6f1b0c
+extern void abort (void);
6f1b0c
+
6f1b0c
+void
6f1b0c
+foo (int a, int b, int c, int d, int e, void **f)
6f1b0c
+{
6f1b0c
+  char g[4096];
6f1b0c
+  if (f == 0 || *f != 0)
6f1b0c
+    abort ();
6f1b0c
+}
6f1b0c
+
6f1b0c
+int
6f1b0c
+main (void)
6f1b0c
+{
6f1b0c
+  void *x = 0;
6f1b0c
+  foo (0, 1, 2, 3, 4, &x);
6f1b0c
+  return 0;
6f1b0c
+}