aboutsummaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>2000-01-14 08:35:56 +0000
committerJeff Law <law@gcc.gnu.org>2000-01-14 01:35:56 -0700
commit516ff948a73dc0f5520eeea790ae0d7d3a09ead9 (patch)
treee4089684e1d7c267db1bb44c506adcc2d83afe75 /gcc/cse.c
parent66ec08884147b3cd0638b20f625f3a87897fdd76 (diff)
downloadgcc-516ff948a73dc0f5520eeea790ae0d7d3a09ead9.zip
gcc-516ff948a73dc0f5520eeea790ae0d7d3a09ead9.tar.gz
gcc-516ff948a73dc0f5520eeea790ae0d7d3a09ead9.tar.bz2
cse.c (cse_insn): When changing (set (pc) (reg)) to (set (pc) (label_ref))...
* cse.c (cse_insn): When changing (set (pc) (reg)) to (set (pc) (label_ref)), verify the change creates a valid insn. From-SVN: r31407
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 25821abd..40d30a7 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;
}