Hi, My recenttly introduced STV pass doesn't skip debug instructions and it causes transformation (mistly cost computation) depending on debug info. It causes bootstrap comparison failure. This patch fixes. Bootstrapped for i686-linux. Testing for x86_64-unknown-linux-gnu{,m32} is in progress. OK for trunk if pass?
Thanks, Ilya -- gcc/ 2015-09-29 Ilya Enkovich <enkovich....@gmail.com> * config/i386/i386.c (scalar_chain::analyze_register_chain): Ignore debug insns. (scalar_chain::convert_reg): Likewise. gcc/testsuite/ 2015-09-29 Ilya Enkovich <enkovich....@gmail.com> * gcc.target/i386/pr67761.c: New test. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6f2380f..7b3ffb0 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2919,6 +2919,10 @@ scalar_chain::analyze_register_chain (bitmap candidates, df_ref ref) for (chain = DF_REF_CHAIN (ref); chain; chain = chain->next) { unsigned uid = DF_REF_INSN_UID (chain->ref); + + if (!NONDEBUG_INSN_P (DF_REF_INSN (chain->ref))) + continue; + if (!DF_REF_REG_MEM_P (chain->ref)) { if (bitmap_bit_p (insns, uid)) @@ -3279,7 +3283,7 @@ scalar_chain::convert_reg (unsigned regno) bitmap_clear_bit (conv, DF_REF_INSN_UID (ref)); } } - else + else if (NONDEBUG_INSN_P (DF_REF_INSN (ref))) { replace_rtx (DF_REF_INSN (ref), reg, scopy); df_insn_rescan (DF_REF_INSN (ref)); diff --git a/gcc/testsuite/gcc.target/i386/pr67761.c b/gcc/testsuite/gcc.target/i386/pr67761.c new file mode 100644 index 0000000..9b13d58 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67761.c @@ -0,0 +1,13 @@ +/* PR target/pr67761 */ +/* { dg-do run { target { ia32 } } } */ +/* { dg-options "-O2 -march=slm -g" } */ +/* { dg-final { scan-assembler "paddq" } } */ + +void +test (long long *values, long long val, long long delta) +{ + unsigned i; + + for (i = 0; i < 128; i++, val += delta) + values[i] = val; +}