Disable brabc/brabs patterns as their length computation is horribly broken and leads...
authorJeff Law <law@redhat.com>
Sun, 31 May 2020 03:53:28 +0000 (21:53 -0600)
committerJeff Law <law@redhat.com>
Sun, 31 May 2020 03:53:28 +0000 (21:53 -0600)
* config/h8300/jumpcall.md (brabs, brabc): Disable patterns.

gcc/config/h8300/jumpcall.md

index 7208fb6d86b550a39efd16ca1da795177162b1ba..3917cf18920337edb240231a6bd1623cf78fc6a1 100644 (file)
  [(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))
                          (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))