This change: > commit 3133bed5d0327e8a9cd0a601b7ecdb9de4fc825d > Author: Vladimir N. Makarov <vmaka...@redhat.com> > Date: Sun Feb 23 16:20:05 2020 -0500 > > Changing cost propagation and ordering colorable bucket heuristics for > PR93564. > > 2020-02-23 Vladimir Makarov <vmaka...@redhat.com> > > PR rtl-optimization/93564 > * ira-color.c (struct update_cost_queue_elem): New member start. > (queue_update_cost, get_next_update_cost): Add new arg start. > (allocnos_conflict_p): New function. > (update_costs_from_allocno): Add new arg conflict_cost_update_p. > Add checking conflicts with allocnos_conflict_p. > (update_costs_from_prefs, restore_costs_from_copies): Adjust > update_costs_from_allocno calls. > (update_conflict_hard_regno_costs): Add checking conflicts with > allocnos_conflict_p. Adjust calls of queue_update_cost and > get_next_update_cost. > (assign_hard_reg): Adjust calls of queue_update_cost. Add > debugging print. > (bucket_allocno_compare_func): Restore previous version. >
Is causing c-torture/compile/sync-1 to fail with an ICE on sh4eb (search for "Tests that now fail, but worked before": http://3.14.90.209:8080/job/sh4eb-linux-gnu/lastFailedBuild/console In the .log we have: > /home/gcc/gcc/gcc/testsuite/gcc.c-torture/compile/sync-1.c:253:1: error: > unable to find a register to spill in class 'R0_REGS'^M > /home/gcc/gcc/gcc/testsuite/gcc.c-torture/compile/sync-1.c:253:1: error: this > is the insn:^M > (insn 209 207 212 2 (parallel [^M > (set (subreg:SI (reg:HI 431) 0)^M > (unspec_volatile:SI [^M > (mem/v:HI (reg/f:SI 299) [-1 S2 A16])^M > (subreg:HI (reg:SI 6 r6 [orig:425 uc+-3 ] [425]) 2)^M > (reg:HI 5 r5 [orig:428 sc+-1 ] [428])^M > ] UNSPECV_CMPXCHG_1))^M > (set (mem/v:HI (reg/f:SI 299) [-1 S2 A16])^M > (unspec_volatile:HI [^M > (const_int 0 [0])^M > ] UNSPECV_CMPXCHG_2))^M > (set (reg:SI 147 t)^M > (unspec_volatile:SI [^M > (const_int 0 [0])^M > ] UNSPECV_CMPXCHG_3))^M > (clobber (scratch:SI))^M > (clobber (reg:SI 0 r0))^M > (clobber (reg:SI 1 r1))^M > ]) "/home/gcc/gcc/gcc/testsuite/gcc.c-torture/compile/sync-1.c":245:8 > 406 {atomic_compare_and_swaphi_soft_gusa}^M > (expr_list:REG_DEAD (reg:HI 5 r5 [orig:428 sc+-1 ] [428])^M > (expr_list:REG_DEAD (reg:SI 6 r6 [orig:425 uc+-3 ] [425])^M > (expr_list:REG_DEAD (reg/f:SI 299)^M > (expr_list:REG_UNUSED (reg:HI 431)^M > (expr_list:REG_UNUSED (reg:SI 1 r1)^M > (expr_list:REG_UNUSED (reg:SI 0 r0)^M > (nil))))))))^M > You should be able to trigger it with a cross compiler at -O2 with the attached testcase. This could well be a target issue. I haven't tried to debug it. If it's a target issue, I'm fully comfortable punting it to the SH folks for resolving.
/* { dg-message "note: '__sync_fetch_and_nand' changed semantics in GCC 4.4" "fetch_and_nand" { target *-*-* } 0 } */ /* { dg-message "note: '__sync_nand_and_fetch' changed semantics in GCC 4.4" "nand_and_fetch" { target *-*-* } 0 } */ /* { dg-options "-ffat-lto-objects" } */ /* Validate that each of the __sync builtins compiles. This won't necessarily link, since the target might not support the builtin, so this may result in external library calls. */ signed char sc; unsigned char uc; signed short ss; unsigned short us; signed int si; unsigned int ui; signed long sl; unsigned long ul; signed long long sll; unsigned long long ull; void *vp; int *ip; struct S { struct S *next; int x; } *sp; void test_op_ignore (void) { (void) __sync_fetch_and_add (&sc, 1); (void) __sync_fetch_and_add (&uc, 1); (void) __sync_fetch_and_add (&ss, 1); (void) __sync_fetch_and_add (&us, 1); (void) __sync_fetch_and_add (&si, 1); (void) __sync_fetch_and_add (&ui, 1); (void) __sync_fetch_and_add (&sl, 1); (void) __sync_fetch_and_add (&ul, 1); (void) __sync_fetch_and_add (&sll, 1); (void) __sync_fetch_and_add (&ull, 1); (void) __sync_fetch_and_sub (&sc, 1); (void) __sync_fetch_and_sub (&uc, 1); (void) __sync_fetch_and_sub (&ss, 1); (void) __sync_fetch_and_sub (&us, 1); (void) __sync_fetch_and_sub (&si, 1); (void) __sync_fetch_and_sub (&ui, 1); (void) __sync_fetch_and_sub (&sl, 1); (void) __sync_fetch_and_sub (&ul, 1); (void) __sync_fetch_and_sub (&sll, 1); (void) __sync_fetch_and_sub (&ull, 1); (void) __sync_fetch_and_or (&sc, 1); (void) __sync_fetch_and_or (&uc, 1); (void) __sync_fetch_and_or (&ss, 1); (void) __sync_fetch_and_or (&us, 1); (void) __sync_fetch_and_or (&si, 1); (void) __sync_fetch_and_or (&ui, 1); (void) __sync_fetch_and_or (&sl, 1); (void) __sync_fetch_and_or (&ul, 1); (void) __sync_fetch_and_or (&sll, 1); (void) __sync_fetch_and_or (&ull, 1); (void) __sync_fetch_and_xor (&sc, 1); (void) __sync_fetch_and_xor (&uc, 1); (void) __sync_fetch_and_xor (&ss, 1); (void) __sync_fetch_and_xor (&us, 1); (void) __sync_fetch_and_xor (&si, 1); (void) __sync_fetch_and_xor (&ui, 1); (void) __sync_fetch_and_xor (&sl, 1); (void) __sync_fetch_and_xor (&ul, 1); (void) __sync_fetch_and_xor (&sll, 1); (void) __sync_fetch_and_xor (&ull, 1); (void) __sync_fetch_and_and (&sc, 1); (void) __sync_fetch_and_and (&uc, 1); (void) __sync_fetch_and_and (&ss, 1); (void) __sync_fetch_and_and (&us, 1); (void) __sync_fetch_and_and (&si, 1); (void) __sync_fetch_and_and (&ui, 1); (void) __sync_fetch_and_and (&sl, 1); (void) __sync_fetch_and_and (&ul, 1); (void) __sync_fetch_and_and (&sll, 1); (void) __sync_fetch_and_and (&ull, 1); (void) __sync_fetch_and_nand (&sc, 1); (void) __sync_fetch_and_nand (&uc, 1); (void) __sync_fetch_and_nand (&ss, 1); (void) __sync_fetch_and_nand (&us, 1); (void) __sync_fetch_and_nand (&si, 1); (void) __sync_fetch_and_nand (&ui, 1); (void) __sync_fetch_and_nand (&sl, 1); (void) __sync_fetch_and_nand (&ul, 1); (void) __sync_fetch_and_nand (&sll, 1); (void) __sync_fetch_and_nand (&ull, 1); } void test_fetch_and_op (void) { sc = __sync_fetch_and_add (&sc, 11); uc = __sync_fetch_and_add (&uc, 11); ss = __sync_fetch_and_add (&ss, 11); us = __sync_fetch_and_add (&us, 11); si = __sync_fetch_and_add (&si, 11); ui = __sync_fetch_and_add (&ui, 11); sl = __sync_fetch_and_add (&sl, 11); ul = __sync_fetch_and_add (&ul, 11); sll = __sync_fetch_and_add (&sll, 11); ull = __sync_fetch_and_add (&ull, 11); sc = __sync_fetch_and_sub (&sc, 11); uc = __sync_fetch_and_sub (&uc, 11); ss = __sync_fetch_and_sub (&ss, 11); us = __sync_fetch_and_sub (&us, 11); si = __sync_fetch_and_sub (&si, 11); ui = __sync_fetch_and_sub (&ui, 11); sl = __sync_fetch_and_sub (&sl, 11); ul = __sync_fetch_and_sub (&ul, 11); sll = __sync_fetch_and_sub (&sll, 11); ull = __sync_fetch_and_sub (&ull, 11); sc = __sync_fetch_and_or (&sc, 11); uc = __sync_fetch_and_or (&uc, 11); ss = __sync_fetch_and_or (&ss, 11); us = __sync_fetch_and_or (&us, 11); si = __sync_fetch_and_or (&si, 11); ui = __sync_fetch_and_or (&ui, 11); sl = __sync_fetch_and_or (&sl, 11); ul = __sync_fetch_and_or (&ul, 11); sll = __sync_fetch_and_or (&sll, 11); ull = __sync_fetch_and_or (&ull, 11); sc = __sync_fetch_and_xor (&sc, 11); uc = __sync_fetch_and_xor (&uc, 11); ss = __sync_fetch_and_xor (&ss, 11); us = __sync_fetch_and_xor (&us, 11); si = __sync_fetch_and_xor (&si, 11); ui = __sync_fetch_and_xor (&ui, 11); sl = __sync_fetch_and_xor (&sl, 11); ul = __sync_fetch_and_xor (&ul, 11); sll = __sync_fetch_and_xor (&sll, 11); ull = __sync_fetch_and_xor (&ull, 11); sc = __sync_fetch_and_and (&sc, 11); uc = __sync_fetch_and_and (&uc, 11); ss = __sync_fetch_and_and (&ss, 11); us = __sync_fetch_and_and (&us, 11); si = __sync_fetch_and_and (&si, 11); ui = __sync_fetch_and_and (&ui, 11); sl = __sync_fetch_and_and (&sl, 11); ul = __sync_fetch_and_and (&ul, 11); sll = __sync_fetch_and_and (&sll, 11); ull = __sync_fetch_and_and (&ull, 11); sc = __sync_fetch_and_nand (&sc, 11); uc = __sync_fetch_and_nand (&uc, 11); ss = __sync_fetch_and_nand (&ss, 11); us = __sync_fetch_and_nand (&us, 11); si = __sync_fetch_and_nand (&si, 11); ui = __sync_fetch_and_nand (&ui, 11); sl = __sync_fetch_and_nand (&sl, 11); ul = __sync_fetch_and_nand (&ul, 11); sll = __sync_fetch_and_nand (&sll, 11); ull = __sync_fetch_and_nand (&ull, 11); } void test_op_and_fetch (void) { sc = __sync_add_and_fetch (&sc, uc); uc = __sync_add_and_fetch (&uc, uc); ss = __sync_add_and_fetch (&ss, uc); us = __sync_add_and_fetch (&us, uc); si = __sync_add_and_fetch (&si, uc); ui = __sync_add_and_fetch (&ui, uc); sl = __sync_add_and_fetch (&sl, uc); ul = __sync_add_and_fetch (&ul, uc); sll = __sync_add_and_fetch (&sll, uc); ull = __sync_add_and_fetch (&ull, uc); sc = __sync_sub_and_fetch (&sc, uc); uc = __sync_sub_and_fetch (&uc, uc); ss = __sync_sub_and_fetch (&ss, uc); us = __sync_sub_and_fetch (&us, uc); si = __sync_sub_and_fetch (&si, uc); ui = __sync_sub_and_fetch (&ui, uc); sl = __sync_sub_and_fetch (&sl, uc); ul = __sync_sub_and_fetch (&ul, uc); sll = __sync_sub_and_fetch (&sll, uc); ull = __sync_sub_and_fetch (&ull, uc); sc = __sync_or_and_fetch (&sc, uc); uc = __sync_or_and_fetch (&uc, uc); ss = __sync_or_and_fetch (&ss, uc); us = __sync_or_and_fetch (&us, uc); si = __sync_or_and_fetch (&si, uc); ui = __sync_or_and_fetch (&ui, uc); sl = __sync_or_and_fetch (&sl, uc); ul = __sync_or_and_fetch (&ul, uc); sll = __sync_or_and_fetch (&sll, uc); ull = __sync_or_and_fetch (&ull, uc); sc = __sync_xor_and_fetch (&sc, uc); uc = __sync_xor_and_fetch (&uc, uc); ss = __sync_xor_and_fetch (&ss, uc); us = __sync_xor_and_fetch (&us, uc); si = __sync_xor_and_fetch (&si, uc); ui = __sync_xor_and_fetch (&ui, uc); sl = __sync_xor_and_fetch (&sl, uc); ul = __sync_xor_and_fetch (&ul, uc); sll = __sync_xor_and_fetch (&sll, uc); ull = __sync_xor_and_fetch (&ull, uc); sc = __sync_and_and_fetch (&sc, uc); uc = __sync_and_and_fetch (&uc, uc); ss = __sync_and_and_fetch (&ss, uc); us = __sync_and_and_fetch (&us, uc); si = __sync_and_and_fetch (&si, uc); ui = __sync_and_and_fetch (&ui, uc); sl = __sync_and_and_fetch (&sl, uc); ul = __sync_and_and_fetch (&ul, uc); sll = __sync_and_and_fetch (&sll, uc); ull = __sync_and_and_fetch (&ull, uc); sc = __sync_nand_and_fetch (&sc, uc); uc = __sync_nand_and_fetch (&uc, uc); ss = __sync_nand_and_fetch (&ss, uc); us = __sync_nand_and_fetch (&us, uc); si = __sync_nand_and_fetch (&si, uc); ui = __sync_nand_and_fetch (&ui, uc); sl = __sync_nand_and_fetch (&sl, uc); ul = __sync_nand_and_fetch (&ul, uc); sll = __sync_nand_and_fetch (&sll, uc); ull = __sync_nand_and_fetch (&ull, uc); } void test_compare_and_swap (void) { sc = __sync_val_compare_and_swap (&sc, uc, sc); uc = __sync_val_compare_and_swap (&uc, uc, sc); ss = __sync_val_compare_and_swap (&ss, uc, sc); us = __sync_val_compare_and_swap (&us, uc, sc); si = __sync_val_compare_and_swap (&si, uc, sc); ui = __sync_val_compare_and_swap (&ui, uc, sc); sl = __sync_val_compare_and_swap (&sl, uc, sc); ul = __sync_val_compare_and_swap (&ul, uc, sc); sll = __sync_val_compare_and_swap (&sll, uc, sc); ull = __sync_val_compare_and_swap (&ull, uc, sc); ui = __sync_bool_compare_and_swap (&sc, uc, sc); ui = __sync_bool_compare_and_swap (&uc, uc, sc); ui = __sync_bool_compare_and_swap (&ss, uc, sc); ui = __sync_bool_compare_and_swap (&us, uc, sc); ui = __sync_bool_compare_and_swap (&si, uc, sc); ui = __sync_bool_compare_and_swap (&ui, uc, sc); ui = __sync_bool_compare_and_swap (&sl, uc, sc); ui = __sync_bool_compare_and_swap (&ul, uc, sc); ui = __sync_bool_compare_and_swap (&sll, uc, sc); ui = __sync_bool_compare_and_swap (&ull, uc, sc); } void test_lock (void) { sc = __sync_lock_test_and_set (&sc, 1); uc = __sync_lock_test_and_set (&uc, 1); ss = __sync_lock_test_and_set (&ss, 1); us = __sync_lock_test_and_set (&us, 1); si = __sync_lock_test_and_set (&si, 1); ui = __sync_lock_test_and_set (&ui, 1); sl = __sync_lock_test_and_set (&sl, 1); ul = __sync_lock_test_and_set (&ul, 1); sll = __sync_lock_test_and_set (&sll, 1); ull = __sync_lock_test_and_set (&ull, 1); __sync_synchronize (); __sync_lock_release (&sc); __sync_lock_release (&uc); __sync_lock_release (&ss); __sync_lock_release (&us); __sync_lock_release (&si); __sync_lock_release (&ui); __sync_lock_release (&sl); __sync_lock_release (&ul); __sync_lock_release (&sll); __sync_lock_release (&ull); }