From ecbda48438f5bbdc95104785e61d81855f05db1b Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Tue, 15 Oct 2013 10:36:03 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/reload1.c | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39ea2033092..6bf624ee9cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-10-15 Bernd Schmidt + + * reload1.c (reloads_unique_chain_p): Ensure that r1 is the input for + r2. + 2013-10-15 Richard Biener * tree-loop-distribution.c (build_empty_rdg): Inline into diff --git a/gcc/reload1.c b/gcc/reload1.c index bb13bf802d1..d56c554b10d 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) -- 2.30.2