https://gcc.gnu.org/g:1cd32c7d3e1d016e234aaf6bfaf8e09930cbe8e9
commit r17-3951-g1cd32c7d3e1d016e234aaf6bfaf8e09930cbe8e9 Author: wangjue <[email protected]> Date: Sun Sep 6 08:00:10 2026 -0600 [PATCH] ifcvt, m68k: Handle targets without scheduling models, add RISC-V tests m68k_sched_issue_rate can be called for targets without a scheduling model. Return 1 for those targets instead of calling gcc_unreachable. Add tests for if-conversion costing on single-issue and multi-issue targets. Assisted-by: Codex (OpenAI) gcc/ChangeLog: * config/m68k/m68k.cc (m68k_sched_issue_rate): Return one for CPUs without a scheduling model. gcc/testsuite/ChangeLog: * gcc.target/riscv/ifcvt-parallel-cost-1.c: New test. * gcc.target/riscv/ifcvt-parallel-cost-2.c: Likewise. Diff: --- gcc/config/m68k/m68k.cc | 3 +-- .../gcc.target/riscv/ifcvt-parallel-cost-1.c | 26 +++++++++++++++++++ .../gcc.target/riscv/ifcvt-parallel-cost-2.c | 29 ++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/gcc/config/m68k/m68k.cc b/gcc/config/m68k/m68k.cc index b6134892883e..074d82efb25f 100644 --- a/gcc/config/m68k/m68k.cc +++ b/gcc/config/m68k/m68k.cc @@ -6594,8 +6594,7 @@ m68k_sched_issue_rate (void) return 2; default: - gcc_unreachable (); - return 0; + return 1; } } diff --git a/gcc/testsuite/gcc.target/riscv/ifcvt-parallel-cost-1.c b/gcc/testsuite/gcc.target/riscv/ifcvt-parallel-cost-1.c new file mode 100644 index 000000000000..1bec3f77dcd2 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/ifcvt-parallel-cost-1.c @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Os" "-Oz" } } */ +/* { dg-options "-O2 -march=rv64gc_zicond -mabi=lp64d -mtune=xt-c9501fdvt -mbranch-cost=3" } */ + +extern void consume (void *, void *, void *); + +__attribute__ ((noinline, noclone)) +void +select_three_pointers (long x, long y, + void *a0, void *a1, + void *b0, void *b1, + void *c0, void *c1) +{ + if (x > y) + { + a0 = a1; + b0 = b1; + c0 = c1; + } + + consume (a0, b0, c0); +} + +/* { dg-final { scan-assembler-times "\\sczero\\.eqz\\s" 3 } } */ +/* { dg-final { scan-assembler-times "\\sczero\\.nez\\s" 3 } } */ +/* { dg-final { scan-assembler-not "\\s(?:bge|bgt|ble|blt)\\s" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/ifcvt-parallel-cost-2.c b/gcc/testsuite/gcc.target/riscv/ifcvt-parallel-cost-2.c new file mode 100644 index 000000000000..6e1f9ed78493 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/ifcvt-parallel-cost-2.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Os" "-Oz" } } */ +/* { dg-options "-O2 -march=rv64gc_zicond -mabi=lp64d -mtune=generic -mbranch-cost=3" } */ + +extern void consume (void *, void *, void *); + +__attribute__ ((noinline, noclone)) +void +select_three_pointers_generic (long x, long y, + void *a0, void *a1, + void *b0, void *b1, + void *c0, void *c1) +{ + if (x >= y) + { + a0 = a1; + b0 = b1; + c0 = c1; + } + + consume (a0, b0, c0); +} + +/* The generic tuning model has an issue rate of one, so the three pointer + selections are not profitable at a branch cost of three. */ + +/* { dg-final { scan-assembler-times "\\sbge\\s" 1 } } */ +/* { dg-final { scan-assembler-not "\\sczero\\.eqz\\s" } } */ +/* { dg-final { scan-assembler-not "\\sczero\\.nez\\s" } } */
