aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1998-12-30 23:14:25 +0000
committerJeff Law <law@gcc.gnu.org>1998-12-30 16:14:25 -0700
commitf67c2384cb78c7f241aa3e9ef10e06c916363f9a (patch)
tree713dde59b8605269ed312043a8514901690d5d5c /gcc/reload1.c
parentf203c52060870af5098bbdc24cfc6f3a855dc057 (diff)
downloadgcc-f67c2384cb78c7f241aa3e9ef10e06c916363f9a.zip
gcc-f67c2384cb78c7f241aa3e9ef10e06c916363f9a.tar.gz
gcc-f67c2384cb78c7f241aa3e9ef10e06c916363f9a.tar.bz2
reload1.c (reload_as_needed): Verify that the insn satisfies its constraints after replacing a register...
* reload1.c (reload_as_needed): Verify that the insn satisfies its constraints after replacing a register address with an autoincrement address for reload inheritance purposes. From-SVN: r24449
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 39da06d..3e5f898 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4333,9 +4333,31 @@ reload_as_needed (live_known)
if (! n)
continue;
if (n == 1)
- n = validate_replace_rtx (reload_reg,
- gen_rtx (code, mode,
- reload_reg), p);
+ {
+ n = validate_replace_rtx (reload_reg,
+ gen_rtx (code, mode,
+ reload_reg),
+ p);
+
+ /* We must also verify that the constraints
+ are met after the replacement. */
+ extract_insn (p);
+ if (n)
+ n = constrain_operands (1);
+ else
+ break;
+
+ /* If the constraints were not met, then
+ undo the replacement. */
+ if (!n)
+ {
+ validate_replace_rtx (gen_rtx (code, mode,
+ reload_reg),
+ reload_reg, p);
+ break;
+ }
+
+ }
break;
}
if (n == 1)