diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2013-10-15 10:36:03 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2013-10-15 10:36:03 +0000 |
commit | ecbda48438f5bbdc95104785e61d81855f05db1b (patch) | |
tree | 7369119b9e35e9bf57ac39662d8575c34356256e | |
parent | ef163a0a6343e7baf9767105a8e0c0553c89f7f2 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/reload1.c | 8 |
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) |