From: Jakub Jelinek Date: Mon, 25 Jun 2018 17:43:41 +0000 (+0200) Subject: backport: re PR rtl-optimization/85167 (shrink-wrap.c:333:15: runtime error with... X-Git-Tag: releases/gcc-6.5.0~193 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c963e17286d8db193471b4b20e0de9ce45d5f8e;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: r262091 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0227db7dafd8..63e840b5ddf7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2018-06-25 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-23 Jakub Jelinek PR inline-asm/85022 diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c index fe7951967098..8d321b6bfe32 100644 --- a/gcc/shrink-wrap.c +++ b/gcc/shrink-wrap.c @@ -154,7 +154,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; @@ -327,8 +327,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 4d9de83dbcca..556fb5781b96 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; +}