https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127142
--- Comment #10 from John David Anglin <danglin at gcc dot gnu.org> ---
Part of the problem is LRA leaves register %r1 live after a call. Testing
removing %r1 clobber from call patterns. Works okay on 64-bit HP-UX. This
makes it hard for LRA to handle patterns that output to %r1 under high register
pressure.
The trdos_insert_boot_loader spill failure is triggered by this pattern:
(define_expand "cpymemsi"
[(parallel [(set (match_operand:BLK 0 "" "")
(match_operand:BLK 1 "" ""))
(clobber (match_dup 4))
(clobber (match_dup 5))
(clobber (match_dup 6))
(clobber (match_dup 7))
(clobber (match_dup 8))
(use (match_operand:SI 2 "arith14_operand" ""))
(use (match_operand:SI 3 "const_int_operand" ""))])]
"!TARGET_64BIT && optimize > 0"
It is interesting that LRA fails to find a spill register in spite of the fact
that %r3-%r18 are free. It wants to just use the call clobbered registers.