From 0ce2b2991c6cef3d65055cc06ad76aeffb3587a3 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 3 Dec 2008 08:40:50 +0000 Subject: [PATCH] re PR rtl-optimization/38281 (segmentation fault with optimization enabled) PR rtl-optimization/38281 * combine.c (distribute_notes): When invoking SET_INSN_DELETED on i2, set it to NULL_RTX afterwards. * emit-rtl.c (set_insn_deleted): Fix formatting. Co-Authored-By: Andrew Pinski Co-Authored-By: Jakub Jelinek From-SVN: r142388 --- gcc/ChangeLog | 10 ++++++++ gcc/combine.c | 4 ++++ gcc/emit-rtl.c | 3 ++- gcc/testsuite/ChangeLog | 4 ++++ .../gcc.c-torture/compile/20081203-1.c | 24 +++++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20081203-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ee8dd848c5..a4afc7ebbd9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2008-12-03 Eric Botcazou + Jakub Jelinek + Andrew Pinski + + PR rtl-optimization/38281 + * combine.c (distribute_notes): When invoking SET_INSN_DELETED on i2, + set it to NULL_RTX afterwards. + + * emit-rtl.c (set_insn_deleted): Fix formatting. + 2008-12-02 Richard Sandiford * config/mips/mips.c (mips_expand_builtin): Fix the mode of the diff --git a/gcc/combine.c b/gcc/combine.c index b8a43356b46..d6f7480223a 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -12653,6 +12653,8 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2, distribute_links (LOG_LINKS (tem)); SET_INSN_DELETED (tem); + if (tem == i2) + i2 = NULL_RTX; #ifdef HAVE_cc0 /* Delete the setter too. */ @@ -12668,6 +12670,8 @@ distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2, distribute_links (LOG_LINKS (cc0_setter)); SET_INSN_DELETED (cc0_setter); + if (cc0_setter == i2) + i2 = NULL_RTX; } #endif } diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index ced4e58b160..0738f384497 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -3620,7 +3620,8 @@ add_insn_before (rtx insn, rtx before, basic_block bb) /* Replace insn with an deleted instruction note. */ -void set_insn_deleted (rtx insn) +void +set_insn_deleted (rtx insn) { df_insn_delete (BLOCK_FOR_INSN (insn), INSN_UID (insn)); PUT_CODE (insn, NOTE); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d585a6ef25..a1623c9be97 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-12-03 Eric Botcazou + + * gcc.c-torture/compile/20081203-1.c: New test. + 2008-12-02 Jason Merrill PR c++/35782, c++/37860 diff --git a/gcc/testsuite/gcc.c-torture/compile/20081203-1.c b/gcc/testsuite/gcc.c-torture/compile/20081203-1.c new file mode 100644 index 00000000000..713235ff50f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20081203-1.c @@ -0,0 +1,24 @@ +/* PR rtl-optimization/38281 */ +/* Reporter: John Regehr */ +/* Testcase by Jakub Jelinek */ + +inline unsigned short +foo (unsigned short x, unsigned short y) +{ + if (y == 0) + return x; + return x / y; +} + +unsigned short a, b, c; + +extern int baz (int, int); + +void +bar (void) +{ + int d = 0x3D75D162; + a = foo (b > d, baz (0, 1)); + for (c = 0; c; c = 1) + ; +} -- 2.30.2