From: Jakub Jelinek Date: Fri, 22 Jun 2018 21:05:08 +0000 (+0200) Subject: backport: re PR rtl-optimization/85167 (shrink-wrap.c:333:15: runtime error with... X-Git-Tag: releases/gcc-7.4.0~343 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47eddf9eed9cb40e22bfb3b45e8b7e1426ac5a7b;p=thirdparty%2Fgcc.git backport: re PR rtl-optimization/85167 (shrink-wrap.c:333:15: runtime error with UBSAN) Backported from mainline 2018-04-03 Jakub Jelinek PR rtl-optimization/85167 * shrink-wrap.c (move_insn_for_shrink_wrap): Don't set bb_uses and bb_defs if *split_p, instead preinitialize it to NULL. * gcc.dg/pr85167.c: New test. From-SVN: r261946 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 05e9df4ee30a..dd6bc807df06 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-04-03 Jakub Jelinek + + PR rtl-optimization/85167 + * shrink-wrap.c (move_insn_for_shrink_wrap): Don't set bb_uses and + bb_defs if *split_p, instead preinitialize it to NULL. + 2018-03-28 Jakub Jelinek PR target/85095 diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c index 253be9d5273b..083eebc257c8 100644 --- a/gcc/shrink-wrap.c +++ b/gcc/shrink-wrap.c @@ -157,7 +157,7 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn, struct dead_debug_local *debug) { rtx set, src, dest; - bitmap live_out, live_in, bb_uses, bb_defs; + bitmap live_out, live_in, bb_uses = NULL, bb_defs = NULL; unsigned int i, dregno, end_dregno; unsigned int sregno = FIRST_PSEUDO_REGISTER; unsigned int end_sregno = FIRST_PSEUDO_REGISTER; @@ -330,8 +330,11 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn, /* Check whether BB uses DEST or clobbers DEST. We need to add INSN to BB if so. Either way, DEST is no longer live on entry, except for any part that overlaps SRC (next loop). */ - bb_uses = &DF_LR_BB_INFO (bb)->use; - bb_defs = &DF_LR_BB_INFO (bb)->def; + if (!*split_p) + { + bb_uses = &DF_LR_BB_INFO (bb)->use; + bb_defs = &DF_LR_BB_INFO (bb)->def; + } if (df_live) { for (i = dregno; i < end_dregno; i++) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 84abc4f8e37e..ae3c9cb8681d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2018-04-03 Jakub Jelinek + PR rtl-optimization/85167 + * gcc.dg/pr85167.c: New test. + PR c++/85147 * g++.dg/cpp0x/pr85147.C: New test. diff --git a/gcc/testsuite/gcc.dg/pr85167.c b/gcc/testsuite/gcc.dg/pr85167.c new file mode 100644 index 000000000000..e4277e3ef722 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr85167.c @@ -0,0 +1,16 @@ +/* PR rtl-optimization/85167 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -w" } */ + +struct A { long b; }; +int c, d, e; +int bar (void); + +int +foo (void) +{ + long g; + for (; g == c ? 0 : (e = 1); g = ((struct A *)g)->b) + if (bar ()) + return d; +}