On Fri, 2022-03-04 at 15:18 +0800, xucheng...@loongson.cn wrote: > * config/loongarch/loongarch.md: New file.
An ICE happens building OpenSSH-8.9p1. Investigation shows it's caused by the flag "-fzero-call-used-regs=". It's because the compiler attempts to clear FCCx registers but can't figure out how. This flag also triggers ICE for other targets (for example, PR 104820 for MIPS), and the related tests (zero-scratch-regs-{8,9,10,11}.c) are marked dg-skip for many targets. But it's unfortunate that packages like OpenSSH have already start to use this flag... I guess they just enabled it once they saw it was working for i386 :(. So it's better to solve the problem for a new target. A "quick fix" is adding an insn to clear FCCx. This is enough to build OpenSSH and make zero-scratch-regs-{8,9,10,11}.c PASS. diff --git a/gcc/config/loongarch/loongarch.md b/gcc/config/loongarch/loongarch.md index a9a8bc4b038..76c5ded9fe4 100644 --- a/gcc/config/loongarch/loongarch.md +++ b/gcc/config/loongarch/loongarch.md @@ -2020,6 +2020,12 @@ DONE; }) +;; Clear one FCC register +(define_insn "movfcc" [(set (match_operand:FCC 0 "register_operand" "=z") + (const_int 0))] + "" + "movgr2cf\t%0,$r0") + ;; Conditional move instructions. (define_insn "*sel<code><GPR:mode>_using_<GPR2:mode>" -- Xi Ruoyao <xry...@mengyan1223.wang> School of Aerospace Science and Technology, Xidian University