The testcase has a debug insn referencing a pseudo right before an insn that modifies the pseudo.
Without debug insns, REG_N_CALLS_CROSSED was zero for that pseudo, so sched_analyze_reg added a dep between the pseudo setter and an earlier (lib)call. With debug insns, we miscomputed REG_N_CALLS_CROSSED as nonzero because of the debug insn, and then no dep was added between the two insns. This was enough to change sched1's decisions about where to place the pseudo setter. REG_N_CALLS_CROSSED is computed by both regstat_bb_compute_ri and regstat_bb_compute_calls_crossed, but although the former skipped debug insns, the latter didn't. Fixing this inconsistency was enough to fix the -fcompare-debug error. Regstrapped on x86_64-linux-gnu and i686-linux-gnu. Ok to install? for gcc/ChangeLog PR target/69634 * regstat.c (regstat_bb_compute_calls_crossed): Disregard debug insns. for gcc/testsuite/ChangeLog PR target/69634 * gcc.dg/pr69634.c: New. --- gcc/regstat.c | 2 +- gcc/testsuite/gcc.dg/pr69634.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr69634.c diff --git a/gcc/regstat.c b/gcc/regstat.c index af5e475..c05b69f 100644 --- a/gcc/regstat.c +++ b/gcc/regstat.c @@ -444,7 +444,7 @@ regstat_bb_compute_calls_crossed (unsigned int bb_index, bitmap live) struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn); unsigned int regno; - if (!INSN_P (insn)) + if (!NONDEBUG_INSN_P (insn)) continue; /* Process the defs. */ diff --git a/gcc/testsuite/gcc.dg/pr69634.c b/gcc/testsuite/gcc.dg/pr69634.c new file mode 100644 index 0000000..837bd57 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr69634.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-dce -fschedule-insns -fno-tree-vrp -fcompare-debug" } */ +/* { dg-additional-options "-Wno-psabi -mno-sse" { target i?86-*-* x86_64-*-* } } */ +/* { dg-additional-options "-m32" { target x86_64-*-* } } */ + +typedef unsigned short u16; +typedef short v16u16 __attribute__ ((vector_size (16))); +typedef unsigned v16u32 __attribute__ ((vector_size (16))); +typedef unsigned long long v16u64 __attribute__ ((vector_size (16))); + +u16 +foo(u16 u16_1, v16u16 v16u16_0, v16u32 v16u64_0, v16u16 v16u16_1, v16u32 v16u32_1, v16u64 v16u64_1) +{ + v16u64_1 /= (v16u64){~v16u32_1[1]}; + u16_1 = 0; + u16_1 /= v16u32_1[2]; + v16u64_1 -= (v16u64) v16u16_1; + u16_1 >>= 1; + u16_1 -= ~0; + v16u16_1 /= (v16u16){~u16_1, 1 - v16u64_0[0], 0xffb6}; + return u16_1 + v16u16_0[1] + v16u16_1[3] + v16u64_1[0] + v16u64_1[1]; +} -- Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ You must be the change you wish to see in the world. -- Gandhi Be Free! -- http://FSFLA.org/ FSF Latin America board member Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer