aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2013-10-15 10:36:03 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2013-10-15 10:36:03 +0000
commitecbda48438f5bbdc95104785e61d81855f05db1b (patch)
tree7369119b9e35e9bf57ac39662d8575c34356256e
parentef163a0a6343e7baf9767105a8e0c0553c89f7f2 (diff)
downloadgcc-ecbda48438f5bbdc95104785e61d81855f05db1b.zip
gcc-ecbda48438f5bbdc95104785e61d81855f05db1b.tar.gz
gcc-ecbda48438f5bbdc95104785e61d81855f05db1b.tar.bz2
Fix a miscompilation where a reload reg is reused after it has been clobbered.
* reload1.c (reloads_unique_chain_p): Ensure that r1 is the input for r2. From-SVN: r203596
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/reload1.c8
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 39ea203..6bf624e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-15 Bernd Schmidt <bernds@codesourcery.com>
+
+ * reload1.c (reloads_unique_chain_p): Ensure that r1 is the input for
+ r2.
+
2013-10-15 Richard Biener <rguenther@suse.de>
* tree-loop-distribution.c (build_empty_rdg): Inline into
diff --git a/gcc/reload1.c b/gcc/reload1.c
index bb13bf8..d56c554 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -5560,6 +5560,14 @@ reloads_unique_chain_p (int r1, int r2)
|| reg_mentioned_p (rld[r2].in, rld[r1].in)))
return false;
+ /* The following loop assumes that r1 is the reload that feeds r2. */
+ if (r1 > r2)
+ {
+ int tmp = r2;
+ r2 = r1;
+ r1 = tmp;
+ }
+
for (i = 0; i < n_reloads; i ++)
/* Look for input reloads that aren't our two */
if (i != r1 && i != r2 && rld[i].in)