Commit 255520e0 by Marek Polacek Committed by Marek Polacek

re PR middle-end/67133 (ICE at -Os and above on x86_64-linux-gnu in gimple_op, at gimple.h:2274)

	PR middle-end/67133
	* gimple-ssa-isolate-paths.c
	(insert_trap_and_remove_trailing_statements): Rename to ...
	(insert_trap): ... this.  Don't remove trailing statements; split
	block instead.
	(find_explicit_erroneous_behaviour): Don't remove all outgoing edges.

	* g++.dg/torture/pr67133.C: New test.

From-SVN: r227009
parent d63c8648
2015-08-19 Marek Polacek <polacek@redhat.com>
PR middle-end/67133
* gimple-ssa-isolate-paths.c
(insert_trap_and_remove_trailing_statements): Rename to ...
(insert_trap): ... this. Don't remove trailing statements; split
block instead.
(find_explicit_erroneous_behaviour): Don't remove all outgoing edges.
2015-08-19 Mikael Morin <mikael@gcc.gnu.org> 2015-08-19 Mikael Morin <mikael@gcc.gnu.org>
PR other/67042 PR other/67042
......
...@@ -66,10 +66,10 @@ check_loadstore (gimple stmt, tree op, tree, void *data) ...@@ -66,10 +66,10 @@ check_loadstore (gimple stmt, tree op, tree, void *data)
return false; return false;
} }
/* Insert a trap after SI and remove SI and all statements after the trap. */ /* Insert a trap after SI and split the block after the trap. */
static void static void
insert_trap_and_remove_trailing_statements (gimple_stmt_iterator *si_p, tree op) insert_trap (gimple_stmt_iterator *si_p, tree op)
{ {
/* We want the NULL pointer dereference to actually occur so that /* We want the NULL pointer dereference to actually occur so that
code that wishes to catch the signal can do so. code that wishes to catch the signal can do so.
...@@ -115,18 +115,8 @@ insert_trap_and_remove_trailing_statements (gimple_stmt_iterator *si_p, tree op) ...@@ -115,18 +115,8 @@ insert_trap_and_remove_trailing_statements (gimple_stmt_iterator *si_p, tree op)
else else
gsi_insert_before (si_p, seq, GSI_NEW_STMT); gsi_insert_before (si_p, seq, GSI_NEW_STMT);
/* We must remove statements from the end of the block so that we split_block (gimple_bb (new_stmt), new_stmt);
never reference a released SSA_NAME. */ *si_p = gsi_for_stmt (stmt);
basic_block bb = gimple_bb (gsi_stmt (*si_p));
for (gimple_stmt_iterator si = gsi_last_bb (bb);
gsi_stmt (si) != gsi_stmt (*si_p);
si = gsi_last_bb (bb))
{
stmt = gsi_stmt (si);
unlink_stmt_vdef (stmt);
gsi_remove (&si, true);
release_defs (stmt);
}
} }
/* BB when reached via incoming edge E will exhibit undefined behaviour /* BB when reached via incoming edge E will exhibit undefined behaviour
...@@ -215,7 +205,7 @@ isolate_path (basic_block bb, basic_block duplicate, ...@@ -215,7 +205,7 @@ isolate_path (basic_block bb, basic_block duplicate,
update_stmt (ret); update_stmt (ret);
} }
else else
insert_trap_and_remove_trailing_statements (&si2, op); insert_trap (&si2, op);
} }
return duplicate; return duplicate;
...@@ -422,14 +412,8 @@ find_explicit_erroneous_behaviour (void) ...@@ -422,14 +412,8 @@ find_explicit_erroneous_behaviour (void)
continue; continue;
} }
insert_trap_and_remove_trailing_statements (&si, insert_trap (&si, null_pointer_node);
null_pointer_node); bb = gimple_bb (gsi_stmt (si));
/* And finally, remove all outgoing edges from BB. */
edge e;
for (edge_iterator ei = ei_start (bb->succs);
(e = ei_safe_edge (ei)); )
remove_edge (e);
/* Ignore any more operands on this statement and /* Ignore any more operands on this statement and
continue the statement iterator (which should continue the statement iterator (which should
......
2015-08-19 Marek Polacek <polacek@redhat.com>
PR middle-end/67133
* g++.dg/torture/pr67133.C: New test.
2015-08-18 Bill Schmidt <wschmidt@vnet.linux.ibm.com> 2015-08-18 Bill Schmidt <wschmidt@vnet.linux.ibm.com>
* gcc.target/powerpc/altivec-35.c: New test. * gcc.target/powerpc/altivec-35.c: New test.
......
// { dg-do compile }
// { dg-additional-options "-fisolate-erroneous-paths-attribute" }
class A;
struct B {
typedef A type;
};
template <typename> struct I : B {};
class C {
public:
C(char *);
int size();
};
template <typename> struct D;
template <typename _Tp, typename = D<_Tp>> class F {
class G {
template <typename> static _Tp *__test();
typedef int _Del;
public:
typedef decltype(__test<_Del>()) type;
};
public:
typename I<_Tp>::type operator*() {
typename G::type a = 0;
return *a;
}
};
class H {
F<A> Out;
H();
};
void fn1(void *, void *, int) __attribute__((__nonnull__));
class A {
int OutBufEnd, OutBufCur;
public:
void operator<<(C p1) {
int b, c = p1.size();
if (OutBufEnd)
fn1(&OutBufCur, &b, c);
}
};
char* a;
H::H() { *Out << a; }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment