Blob Blame History Raw
2000-09-18  Bernd Schmidt  <bernds@redhat.co.uk>

	* reload1.c (forget_old_reloads_1): If a hard reg is stored, clear
	its entry in spill_reg_store.

2004-03-02  Jakub Jelinek  <jakub@redhat.com>

	* gcc.c-torture/execute/20040302-1.c: New test.

--- gcc/reload1.c.jj	2004-02-29 21:22:51.000000000 +0100
+++ gcc/reload1.c	2004-03-02 16:14:56.000000000 +0100
@@ -4058,7 +4058,10 @@ forget_old_reloads_1 (x, ignored, data)
 	   reload reg in the current instruction.  */
 	if (n_reloads == 0
 	    || ! TEST_HARD_REG_BIT (reg_is_output_reload, regno + i))
-	  CLEAR_HARD_REG_BIT (reg_reloaded_valid, regno + i);
+	  {
+	    CLEAR_HARD_REG_BIT (reg_reloaded_valid, regno + i);
+	    spill_reg_store[regno + i] = 0;
+	  }
     }
 
   /* Since value of X has changed,
--- gcc/testsuite/gcc.c-torture/execute/20040302-1.c.jj	2004-03-02 16:22:52.000000000 +0100
+++ gcc/testsuite/gcc.c-torture/execute/20040302-1.c	2004-02-29 21:52:00.000000000 +0100
@@ -0,0 +1,33 @@
+extern void abort (void);
+
+void
+foo (const char *a)
+{
+}
+
+void
+bar (const char *f, int a, int b, int c)
+{
+  if (a != 2 || b != 7 || c != 1999)
+    abort ();
+}
+
+typedef struct
+{
+  unsigned char a, b, c, d, e;
+} T;
+
+T t = { b : 2, c : 7, d : 0x99, e : 0x19 };
+
+int
+main (void)
+{
+  T *p = &t;
+  foo ("foo");
+  bar ("bar",
+       (p->b >> 4) * 10 + (p->b & 0xf),
+       (p->c >> 4) * 10 + (p->c & 0xf),
+       (p->e >> 4) * 1000 + (p->e & 0xf) * 100
+       + (p->d >> 4) * 10 + (p->d & 0xf));
+  return 0;
+}