aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2020-05-30 21:53:28 -0600
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 13:09:26 -0300
commitb067d98d80c5494baf1af96ebc7bd64f2edf410f (patch)
tree15817841730429f5d6e272e4ef1775c716b4322d /gcc
parent36692e29a8688b3e589d2402d6c4971ff484818a (diff)
downloadgcc-b067d98d80c5494baf1af96ebc7bd64f2edf410f.zip
gcc-b067d98d80c5494baf1af96ebc7bd64f2edf410f.tar.gz
gcc-b067d98d80c5494baf1af96ebc7bd64f2edf410f.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.md14
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))