aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-04-03 23:45:52 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-04-03 23:45:52 +0200
commitb6a7a294ce823917dd08e8d5923137ff75b09fae (patch)
treedbdc41c7fea93688e556dfdeed9b17283f6a1196 /gcc
parent0d2f7959f7b5fed2f74f5ed1f3e2d7db77bb5361 (diff)
downloadgcc-b6a7a294ce823917dd08e8d5923137ff75b09fae.zip
gcc-b6a7a294ce823917dd08e8d5923137ff75b09fae.tar.gz
gcc-b6a7a294ce823917dd08e8d5923137ff75b09fae.tar.bz2
re PR rtl-optimization/85167 (shrink-wrap.c:333:15: runtime error with UBSAN)
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: r259058
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/shrink-wrap.c9
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr85167.c16
4 files changed, 29 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 78d14af..cd64aa4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2018-04-03 Jakub Jelinek <jakub@redhat.com>
+ 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.
+
PR tree-optimization/85156
* builtins.c (fold_builtin_expect): Use save_expr on arg1 to avoid
evaluating the argument multiple times.
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
index fd19ace..6b47d4e 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 6d1322c..de14495 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2018-04-03 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/85167
+ * gcc.dg/pr85167.c: New test.
+
PR tree-optimization/85156
* c-c++-common/pr85156.c: New test.
* gcc.c-torture/execute/pr85156.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr85167.c b/gcc/testsuite/gcc.dg/pr85167.c
new file mode 100644
index 0000000..e4277e3
--- /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;
+}