]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/52306 (ICE in cselib_record_set, at cselib.c:2158)
authorJeff Law <law@redhat.com>
Mon, 10 Feb 2014 16:25:44 +0000 (09:25 -0700)
committerJeff Law <law@gcc.gnu.org>
Mon, 10 Feb 2014 16:25:44 +0000 (09:25 -0700)
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

gcc/ChangeLog
gcc/reload1.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr52306.c [new file with mode: 0644]

index 62d46495a26ece53af0be8d91adcd9028e20a47c..5f6252266aa750ad3319c5882f461baef7ceae0e 100644 (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
index bb761fef7f7ecb87263dcf76f8265bdd096ada7b..b789ee8f19f309535ef2024f375381edf444dc90 100644 (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
index f6db2b38636f0b61a48b5f1a1eb0d9cb5de7f02a..56125ad6f8427835a1261e3a8b3c7d39166ab79b 100644 (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.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52306.c b/gcc/testsuite/gcc.c-torture/compile/pr52306.c
new file mode 100644 (file)
index 0000000..e82cb2a
--- /dev/null
@@ -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);
+    }
+}
+