re PR middle-end/59743 (ICE: Segmentation fault)

PR middle-end/59743
	* ree.c (combine_reaching_defs): Ensure the defining statement
	occurs before the extension when optimizing extensions with
	different source and destination hard registers.

	PR middle-end/59743
	* gcc.c-torture/compile/pr59743.c: New test.

From-SVN: r206545
This commit is contained in:
Jeff Law 2014-01-10 15:13:18 -07:00 committed by Jeff Law
parent b270b096a1
commit 7e41c852e3
4 changed files with 39 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2014-01-10 Jeff Law <law@redhat.com>
PR middle-end/59743
* ree.c (combine_reaching_defs): Ensure the defining statement
occurs before the extension when optimizing extensions with
different source and destination hard registers.
2014-01-10 Jan Hubicka <jh@suse.cz>
PR ipa/58585

View File

@ -723,8 +723,10 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
/* The defining statement and candidate insn must be in the same block.
This is merely to keep the test for safety and updating the insn
stream simple. */
if (BLOCK_FOR_INSN (cand->insn) != BLOCK_FOR_INSN (def_insn))
stream simple. Also ensure that within the block the candidate
follows the defining insn. */
if (BLOCK_FOR_INSN (cand->insn) != BLOCK_FOR_INSN (def_insn)
|| DF_INSN_LUID (def_insn) > DF_INSN_LUID (cand->insn))
return false;
/* If there is an overlap between the destination of DEF_INSN and

View File

@ -1,3 +1,8 @@
2014-01-10 Jeff Law <law@redhat.com>
PR middle-end/59743
* gcc.c-torture/compile/pr59743.c: New test.
2014-01-10 Jan Hubicka <jh@suse.cz>
PR ipa/58585

View File

@ -0,0 +1,23 @@
/* PR middle-end/59743 */
typedef union {
long all;
struct {
int low;
int high;
} s;
} udwords;
int a, b, c, d;
void __udivmoddi4() {
udwords r;
d = __builtin_clz(0);
r.s.low = 0;
for (; d; --d) {
r.s.high = r.s.high << 1 | r.s.low >> a;
r.s.low = r.s.low << b >> 1;
int s = -r.all;
c = s;
r.all--;
}
}