]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/26655 (ICE in ix86_secondary_memory_needed, at config/i386...
authorJan Hubicka <jh@suse.cz>
Fri, 4 Aug 2006 17:05:38 +0000 (19:05 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 4 Aug 2006 17:05:38 +0000 (17:05 +0000)
PR target/26655
PR target/28270
* reload.c (push_reload): Patch out the mismathcing instruction; return early.
(find_reload): Bail out if the instruction was patched out.

From-SVN: r115928

gcc/ChangeLog
gcc/reload.c

index 642cde8cdb94e5256ed599743de172121dbdc07c..eb198c84acec4aa53381671df38976f37b7e479f 100644 (file)
@@ -1,3 +1,10 @@
+2006-08-04  Jan Hubicka  <jh@suse.cz>
+
+       PR target/26655
+       PR target/28270
+       * reload.c (push_reload): Patch out the mismathcing instruction; return early.
+       (find_reload): Bail out if the instruction was patched out.
+
 2006-08-04  Jan Hubicka  <jh@suse.cz>
 
        PR tree-optimization/24888
index 616a73726a16937d7fb0d91a77039485b009d9ae..c8c48b1dc78fb2c4bb72de494af3173dc739d5fe 100644 (file)
@@ -1254,7 +1254,19 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
        {
          error_for_asm (this_insn, "impossible register constraint "
                         "in %<asm%>");
-         class = ALL_REGS;
+         /* Avoid further trouble with this insn.  */
+         PATTERN (this_insn) = gen_rtx_USE (VOIDmode, const0_rtx);
+         /* We used to continue here setting class to ALL_REGS, but it triggers
+            sanity check on i386 for:
+            void foo(long double d)
+            {
+              asm("" :: "a" (d));
+            }
+            Returning zero here ought to be safe as we take care in
+            find_reloads to not process the reloads when instruction was
+            replaced by USE.  */
+           
+         return 0;
        }
     }
 
@@ -4133,6 +4145,12 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
       }
 #endif
 
+  /* If we detected error and replaced asm instruction by USE, forget about the
+     reloads.  */
+  if (GET_CODE (PATTERN (insn)) == USE
+      && GET_CODE (XEXP (PATTERN (insn), 0)) == CONST_INT)
+    n_reloads = 0;
+
   /* Perhaps an output reload can be combined with another
      to reduce needs by one.  */
   if (!goal_earlyclobber)