aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-08-18 08:11:22 +0930
committerAlan Modra <amodra@gcc.gnu.org>2016-08-18 08:11:22 +0930
commit66592e95db41216e6fb1d76a831f8efa6bcf0d6f (patch)
treef81e4c1cdce3465669f486e5c83c18bd770bc7ee
parent6fbf26cc575cd5d50acc63a0d935744399230435 (diff)
downloadgcc-66592e95db41216e6fb1d76a831f8efa6bcf0d6f.zip
gcc-66592e95db41216e6fb1d76a831f8efa6bcf0d6f.tar.gz
gcc-66592e95db41216e6fb1d76a831f8efa6bcf0d6f.tar.bz2
[RELOAD] Don't assume subreg mem address is ok
This patch fixes a case where reload blindly assumes a subreg mem is OK if its address has been partially reloaded by legitimize_reload_address. PR rtl-optimization/72771 * reload.c (find_reloads): Don't assume that a subreg mem is OK when find_reloads_toplev returns address_reloaded==-1. (alternative_allows_const_pool_ref): Update comment. testsuite/ * gcc.c-torture/compile/pr72771.c: New. From-SVN: r239549
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/reload.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr72771.c29
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6f63146..e09cdea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-08-18 Alan Modra <amodra@gmail.com>
+
+ PR rtl-optimization/72771
+ * reload.c (find_reloads): Don't assume that a subreg mem is OK
+ when find_reloads_toplev returns address_reloaded==-1.
+ (alternative_allows_const_pool_ref): Update comment.
+
2015-08-17 Alan Hayward <alan.hayward@arm.com>
PR tree-optimization/71752
diff --git a/gcc/reload.c b/gcc/reload.c
index afdd56d..cd0d661 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -3961,7 +3961,7 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known,
there will be no reload needed at all. */
if (plus == NULL_RTX
&& subreg == NULL_RTX
- && alternative_allows_const_pool_ref (this_address_reloaded == 0
+ && alternative_allows_const_pool_ref (this_address_reloaded != 1
? substed_operand[i]
: NULL,
recog_data.constraints[i],
@@ -4606,8 +4606,8 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known,
/* Return true if alternative number ALTNUM in constraint-string
CONSTRAINT is guaranteed to accept a reloaded constant-pool reference.
- MEM gives the reference if it didn't need any reloads, otherwise it
- is null. */
+ MEM gives the reference if its address hasn't been fully reloaded,
+ otherwise it is NULL. */
static bool
alternative_allows_const_pool_ref (rtx mem ATTRIBUTE_UNUSED,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f1a0fa8..4c7e609 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-08-18 Alan Modra <amodra@gmail.com>
+
+ * gcc.c-torture/compile/pr72771.c: New.
+
2016-08-17 Jakub Jelinek <jakub@redhat.com>
PR fortran/67496
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr72771.c b/gcc/testsuite/gcc.c-torture/compile/pr72771.c
new file mode 100644
index 0000000..1cc13e3
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr72771.c
@@ -0,0 +1,29 @@
+void fn2(void);
+void fn3(unsigned long);
+
+signed char a;
+int b, c, e, f;
+float *d;
+
+void fn1(void) {
+ unsigned short g = 0;
+lbl_986:
+ for (;;) {
+ c = 0;
+ for (; c <= 2;) {
+ *d = g;
+ fn2();
+ if (e)
+ goto lbl_986;
+ }
+ g = 2;
+ for (; (short) g >= 0; g--) {
+ for (; b;) {
+ fn3(45360);
+ f = 0;
+ for (; a >= 0; a--)
+ ;
+ }
+ }
+ }
+}