Fix recent bug in canonicalize_comparison (PR87026)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 23 Aug 2018 12:40:14 +0000 (14:40 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 23 Aug 2018 12:40:14 +0000 (14:40 +0200)
The new code testing which way a comparison is best expressed creates
a pseudoregister (by hand) and creates some insns with that.  Such
insns will no longer recog() when pseudo-registers are no longer
aloowed (after reload).  But we have an ifcvt pass after reload (ce3).

This patch simply returns if we cannot create pseudos.

PR rtl-optimization/87026
* expmed.c (canonicalize_comparison): If we can no longer create
pseudoregisters, don't.

From-SVN: r263810

gcc/ChangeLog
gcc/expmed.c

index 7b7c79b..8cf5ab1 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-23  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/87026
+       * expmed.c (canonicalize_comparison): If we can no longer create
+       pseudoregisters, don't.
+
 2018-08-23  Richard Earnshaw  <rearnsha@arm.com>
 
        PR target/86951
index e281930..0922029 100644 (file)
@@ -6243,6 +6243,10 @@ canonicalize_comparison (machine_mode mode, enum rtx_code *code, rtx *imm)
   if (overflow)
     return;
 
+  /* The following creates a pseudo; if we cannot do that, bail out.  */
+  if (!can_create_pseudo_p ())
+    return;
+
   rtx reg = gen_rtx_REG (mode, LAST_VIRTUAL_REGISTER + 1);
   rtx new_imm = immed_wide_int_const (imm_modif, mode);