From: Jakub Jelinek Date: Wed, 3 Jun 2015 15:33:59 +0000 (+0200) Subject: backport: re PR middle-end/65984 (ICE: definition in block 4 does not dominate use... X-Git-Tag: releases/gcc-4.9.3~104 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46d4186fe3860c6e1915b4f69611b95cfe6fc0f5;p=thirdparty%2Fgcc.git backport: re PR middle-end/65984 (ICE: definition in block 4 does not dominate use in block 2 with -fnon-call-exceptions -fsanitize=enum) Backported from mainline 2015-05-04 Jakub Jelinek PR tree-optimization/65984 * ubsan.c: Include tree-cfg.h. (instrument_bool_enum_load): Use stmt_ends_bb_p instead of stmt_could_throw_p test, rename can_throw variable to ends_bb. * c-c++-common/ubsan/pr65984.c: New test. From-SVN: r224092 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2f68b618c7d1..cf6b60c4c2a0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-05-04 Jakub Jelinek + + PR tree-optimization/65984 + * ubsan.c: Include tree-cfg.h. + (instrument_bool_enum_load): Use stmt_ends_bb_p instead of + stmt_could_throw_p test, rename can_throw variable to ends_bb. + 2015-04-07 Jakub Jelinek PR middle-end/65680 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7717db9c12c3..c69ce9c11602 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-05-04 Jakub Jelinek + + PR tree-optimization/65984 + * c-c++-common/ubsan/pr65984.c: New test. + 2015-04-07 Jakub Jelinek PR middle-end/65680 diff --git a/gcc/testsuite/c-c++-common/ubsan/pr65984.c b/gcc/testsuite/c-c++-common/ubsan/pr65984.c new file mode 100644 index 000000000000..94ba0110b0b2 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/pr65984.c @@ -0,0 +1,23 @@ +/* PR tree-optimization/65984 */ +/* { dg-do compile } */ +/* { dg-options "-fnon-call-exceptions -fsanitize=bool,enum" } */ + +#ifndef __cplusplus +#define bool _Bool +#endif + +enum E { E0, E1, E2 }; +enum E e[2]; +bool *b; + +int +foo (int i) +{ + return e[i]; +} + +int +bar (int i) +{ + return b[i]; +} diff --git a/gcc/ubsan.c b/gcc/ubsan.c index 25c2cde60401..106cba41ead4 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. If not see #include "gimplify-me.h" #include "intl.h" #include "tree-eh.h" +#include "tree-cfg.h" /* Map from a tree to a VAR_DECL tree. */ @@ -808,7 +809,7 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) || TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) return; - bool can_throw = stmt_could_throw_p (stmt); + bool ends_bb = stmt_ends_bb_p (stmt); location_t loc = gimple_location (stmt); tree lhs = gimple_assign_lhs (stmt); tree ptype = build_pointer_type (TREE_TYPE (rhs)); @@ -820,7 +821,7 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g), build_int_cst (atype, 0)); tree urhs = make_ssa_name (utype, NULL); - if (can_throw) + if (ends_bb) { gimple_assign_set_lhs (stmt, urhs); g = gimple_build_assign_with_ops (NOP_EXPR, lhs, urhs, NULL_TREE); @@ -859,7 +860,7 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) gimple_set_location (g, loc); gsi_insert_after (gsi, g, GSI_NEW_STMT); - if (!can_throw) + if (!ends_bb) { gimple_assign_set_rhs_with_ops (&gsi2, NOP_EXPR, urhs, NULL_TREE); update_stmt (stmt);