re PR middle-end/52306 (ICE in cselib_record_set, at cselib.c:2158)

PR middle-end/52306
	* reload1.c (emit_input_reload_insns): Do not create invalid RTL
	when changing the SET_DEST of a prior insn to avoid an input
	reload.

	PR middle-end-52306
	* gcc.c-torture/compile/pr52306.c: New test.

From-SVN: r207662
This commit is contained in:
Jeff Law 2014-02-10 09:25:44 -07:00 committed by Jeff Law
parent 7606ae1a4b
commit f27be5508a
4 changed files with 107 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2014-02-10 Jeff Law <law@redhat.com>
PR middle-end/52306
* reload1.c (emit_input_reload_insns): Do not create invalid RTL
when changing the SET_DEST of a prior insn to avoid an input
reload.
2014-02-10 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* config/rs6000/sysv4.h (ENDIAN_SELECT): Do not attempt to enforce

View File

@ -7362,9 +7362,18 @@ emit_input_reload_insns (struct insn_chain *chain, struct reload *rl,
/* Store into the reload register instead of the pseudo. */
SET_DEST (PATTERN (temp)) = reloadreg;
/* Verify that resulting insn is valid. */
/* Verify that resulting insn is valid.
Note that we have replaced the destination of TEMP with
RELOADREG. If TEMP references RELOADREG within an
autoincrement addressing mode, then the resulting insn
is ill-formed and we must reject this optimization. */
extract_insn (temp);
if (constrain_operands (1))
if (constrain_operands (1)
#ifdef AUTO_INC_DEC
&& ! find_reg_note (temp, REG_INC, reloadreg)
#endif
)
{
/* If the previous insn is an output reload, the source is
a reload register, and its spill_reg_store entry will

View File

@ -1,3 +1,8 @@
2014-02-10 Jeff Law <law@redhat.com>
PR middle-end-52306
* gcc.c-torture/compile/pr52306.c: New test.
2014-02-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* g++.dg/ext/vector26.C: Use -mmmx for 32-bit x86.

View File

@ -0,0 +1,84 @@
/* PR middle-end/52306 */
struct xmlNs {
const unsigned char *prefix;
};
struct xmlNode {
const unsigned char *name;
struct xmlNs *ns;
struct xmlNs *nsDef;
};
struct xsltTemplate {
const unsigned char *name;
int inheritedNsNr;
void *inheritedNs;
};
struct xsltTemplate *xsltNewTemplate(void);
void xsltGetQNameURI(unsigned char**);
long xmlMalloc(unsigned long);
void xsltGenericDebug(void);
int xmlStrEqual(const unsigned char*, const unsigned char*);
static void xsltGetInheritedNsList(
struct xsltTemplate *template,
struct xmlNode *node)
{
struct xmlNs *cur;
struct xmlNs **ret;
int nbns = 0;
int maxns = 10;
int i;
if (template == 0
|| template->inheritedNsNr != 0
|| template->inheritedNs != 0)
return;
while (node != 0) {
cur = node->nsDef;
ret = (struct xmlNs**) xmlMalloc((maxns + 1) * sizeof(struct xmlNs*));
for (i = 0; i < nbns; i++)
if (cur->prefix == ret[i]->prefix
|| xmlStrEqual(cur->prefix, 0))
break;
if (i >= nbns) {
if (nbns >= maxns)
return;
ret[nbns++] = cur;
}
}
}
static void
xsltParseStylesheetTemplate(struct xmlNode *template)
{
struct xsltTemplate *ret;
unsigned char *prop;
ret = xsltNewTemplate();
if (ret == 0)
return;
xsltGetInheritedNsList(ret, template);
xsltGenericDebug();
xsltGetQNameURI(&prop);
xmlStrEqual(0, ret->name);
}
void xsltParseStylesheetTop(struct xmlNode *cur)
{
xmlStrEqual(0, 0);
while (cur != 0) {
if (xmlStrEqual(cur->name, 0))
;
else if (xmlStrEqual(cur->name, 0))
;
else if (xmlStrEqual(cur->name, 0))
xsltParseStylesheetTemplate(cur);
}
}