aboutsummaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1997-03-18 14:55:01 -0800
committerJim Wilson <wilson@gcc.gnu.org>1997-03-18 14:55:01 -0800
commit3d14e82f05ff8af2c14ff18cfbcee50d64aa22d7 (patch)
treec638d7f111b1248210d76f7b8586c9ae1789894f /gcc/final.c
parentaff4d29bf4e61838c3ed08862146f16c8cfe9253 (diff)
downloadgcc-3d14e82f05ff8af2c14ff18cfbcee50d64aa22d7.zip
gcc-3d14e82f05ff8af2c14ff18cfbcee50d64aa22d7.tar.gz
gcc-3d14e82f05ff8af2c14ff18cfbcee50d64aa22d7.tar.bz2
(shorten_branches): Split all insns before computing insn lengths.
(shorten_branches): Split all insns before computing insn lengths. (final_scan_insn, case default): If HAVE_ATTR_length defined, call abort for any insn that has a '#' output template. From-SVN: r13744
Diffstat (limited to 'gcc/final.c')
-rw-r--r--gcc/final.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/final.c b/gcc/final.c
index 5129611..64b5c50 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -655,6 +655,13 @@ shorten_branches (first)
rtx body;
int uid;
+ /* In order to make sure that all instructions have valid length info,
+ we must split them before we compute the address/length info. */
+
+ for (insn = NEXT_INSN (first); insn; insn = NEXT_INSN (insn))
+ if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
+ insn = try_split (PATTERN (insn), insn, 1);
+
/* Compute maximum UID and allocate arrays. */
for (insn = first; insn; insn = NEXT_INSN (insn))
if (INSN_UID (insn) > max_uid)
@@ -2090,6 +2097,13 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
if (new == insn && PATTERN (new) == body)
abort ();
+#ifdef HAVE_ATTR_length
+ /* This instruction should have been split in shorten_branches,
+ to ensure that we would have valid length info for the
+ splitees. */
+ abort ();
+#endif
+
new_block = 0;
return new;
}