re PR middle-end/65984 (ICE: definition in block 4 does not dominate use in block 2 with -fnon-call-exceptions -fsanitize=enum)

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: r222775
This commit is contained in:
Jakub Jelinek 2015-05-04 21:52:33 +02:00 committed by Jakub Jelinek
parent 2f4eb706df
commit 100c8e9e9d
4 changed files with 39 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2015-05-04 Jakub Jelinek <jakub@redhat.com>
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-05-04 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.c: Change GET_CODE (...) == CONST_DOUBLE check

View File

@ -1,3 +1,8 @@
2015-05-04 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/65984
* c-c++-common/ubsan/pr65984.c: New test.
2015-05-04 Jeff Law <law@redhat.com>
* gcc.dg/tree-ssa/shorten-1.c: New test.

View File

@ -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];
}

View File

@ -87,6 +87,7 @@ along with GCC; see the file COPYING3. If not see
#include "builtins.h"
#include "tree-object-size.h"
#include "tree-eh.h"
#include "tree-cfg.h"
/* Map from a tree to a VAR_DECL tree. */
@ -1420,7 +1421,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));
@ -1432,7 +1433,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);
if (can_throw)
if (ends_bb)
{
gimple_assign_set_lhs (stmt, urhs);
g = gimple_build_assign (lhs, NOP_EXPR, urhs);
@ -1469,7 +1470,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);
update_stmt (stmt);