Commit 7e41c852 by Jeff Law Committed by Jeff Law

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
parent b270b096
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> 2014-01-10 Jan Hubicka <jh@suse.cz>
PR ipa/58585 PR ipa/58585
......
...@@ -723,8 +723,10 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state) ...@@ -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. /* 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 This is merely to keep the test for safety and updating the insn
stream simple. */ stream simple. Also ensure that within the block the candidate
if (BLOCK_FOR_INSN (cand->insn) != BLOCK_FOR_INSN (def_insn)) 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; return false;
/* If there is an overlap between the destination of DEF_INSN and /* If there is an overlap between the destination of DEF_INSN and
......
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> 2014-01-10 Jan Hubicka <jh@suse.cz>
PR ipa/58585 PR ipa/58585
......
/* 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--;
}
}
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