diff options
author | Jeff Law <law@redhat.com> | 2020-05-30 21:53:28 -0600 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2020-05-30 21:53:28 -0600 |
commit | 6dda86084439af4f5315a5c3aaee732a610e3551 (patch) | |
tree | dc4b540f3496e331031485d24a1b904fffab0e71 /gcc | |
parent | 945b53ccf6ae899e32c5ed88471ae60d5814c47d (diff) | |
download | gcc-6dda86084439af4f5315a5c3aaee732a610e3551.zip gcc-6dda86084439af4f5315a5c3aaee732a610e3551.tar.gz gcc-6dda86084439af4f5315a5c3aaee732a610e3551.tar.bz2 |
Disable brabc/brabs patterns as their length computation is horribly broken and leads to incorrect code generation.
* config/h8300/jumpcall.md (brabs, brabc): Disable patterns.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/h8300/jumpcall.md | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/config/h8300/jumpcall.md b/gcc/config/h8300/jumpcall.md index 7208fb6..3917cf1 100644 --- a/gcc/config/h8300/jumpcall.md +++ b/gcc/config/h8300/jumpcall.md @@ -77,6 +77,16 @@ [(set_attr "type" "branch") (set_attr "cc" "none")]) +;; The brabc/brabs patterns have been disabled because their length computation +;; is horribly broken. When we call out to a function via a SYMBOL_REF we get +;; bogus default and minimum lengths. The trick used by the PA port seems to +;; fix the minimum, but not the default length. The broken lengths can lead +;; to bogusly using a short jump when a long jump was needed and thus +;; incorrect code. +;; +;; Given the restricted addressing modes for operand 1, we could probably just +;; open-code the necessary length computation in the two affected patterns +;; rather than using a function call. I think that would fix this problem. (define_insn "*brabc" [(set (pc) (if_then_else (eq (zero_extract (match_operand:QI 1 "bit_memory_operand" "WU") @@ -85,7 +95,7 @@ (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] - "TARGET_H8300SX" + "0 && TARGET_H8300SX" { switch (get_attr_length (insn) - h8300_insn_length_from_table (insn, operands)) @@ -110,7 +120,7 @@ (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] - "TARGET_H8300SX" + "0 && TARGET_H8300SX" { switch (get_attr_length (insn) - h8300_insn_length_from_table (insn, operands)) |