From 66592e95db41216e6fb1d76a831f8efa6bcf0d6f Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 18 Aug 2016 08:11:22 +0930 Subject: [PATCH] [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 --- gcc/ChangeLog | 7 +++++ gcc/reload.c | 6 ++-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.c-torture/compile/pr72771.c | 29 +++++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr72771.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6f6314671aa..e09cdeafe6b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-08-18 Alan Modra + + 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 PR tree-optimization/71752 diff --git a/gcc/reload.c b/gcc/reload.c index afdd56dfeca..cd0d661e224 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 f1a0fa86c34..4c7e6091a49 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-08-18 Alan Modra + + * gcc.c-torture/compile/pr72771.c: New. + 2016-08-17 Jakub Jelinek 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 00000000000..1cc13e3d462 --- /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--) + ; + } + } + } +} -- 2.30.2