diff options
-rw-r--r-- | gcc/ira.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr116179-1.C | 26 |
2 files changed, 30 insertions, 1 deletions
@@ -5144,7 +5144,10 @@ split_live_ranges_for_shrink_wrap (void) use = DF_REF_NEXT_REG (use)) { int ubbi = DF_REF_BB (use)->index; - if (bitmap_bit_p (reachable, ubbi)) + + /* Only non debug insns should be taken into account. */ + if (NONDEBUG_INSN_P (DF_REF_INSN (use)) + && bitmap_bit_p (reachable, ubbi)) bitmap_set_bit (need_new, ubbi); } last_interesting_insn = insn; diff --git a/gcc/testsuite/g++.dg/torture/pr116179-1.C b/gcc/testsuite/g++.dg/torture/pr116179-1.C new file mode 100644 index 0000000..85e63c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr116179-1.C @@ -0,0 +1,26 @@ +/* { dg-additional-options "-fcompare-debug" } */ + +/* PR rtl-optimization/116179 */ + +struct g *b; +struct g {}; +void *operator new(__SIZE_TYPE__, void *); +enum c {}; +struct d : g{} * e; +c f; +struct h { + g *k() { + d *a; + c i; + if (a || i == 0 || i == 1) + if (e || f) + return 0; + return new (&j) d; + } + void n(); + g j; +}; +void h::n() { + for (g *l(b), *m(b); l; l = m, m = 0) + k(); +} |