summaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-14 08:35:56 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2000-01-14 08:35:56 +0000
commit1e21781187db46627e7a9d60478045e305ecfc5b (patch)
treee4089684e1d7c267db1bb44c506adcc2d83afe75 /gcc/cse.c
parentb408db88ceb558693bf1d665771404f1b9290073 (diff)
downloadgcc-1e21781187db46627e7a9d60478045e305ecfc5b.tar.gz
* cse.c (cse_insn): When changing (set (pc) (reg)) to
(set (pc) (label_ref)), verify the change creates a valid insn. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31407 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index 25821abdb2b..40d30a79d38 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5189,8 +5189,18 @@ cse_insn (insn, libcall_insn)
trial = gen_rtx_LABEL_REF (Pmode, get_label_after (trial));
- SET_SRC (sets[i].rtl) = trial;
- cse_jumps_altered = 1;
+ if (trial == pc_rtx)
+ {
+ SET_SRC (sets[i].rtl) = trial;
+ cse_jumps_altered = 1;
+ break;
+ }
+
+ /* We must actually validate the change. Consider a target
+ where unconditional jumps are more complex than
+ (set (pc) (label_ref)) such as the fr30. */
+ if (validate_change (insn, &SET_SRC (sets[i].rtl), trial, 0))
+ cse_jumps_altered = 1;
break;
}