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.

Tested on powerpc64-linux {-m32,-m64}.  Is this okay for trunk?


Segher


2018-08-23  Segher Boessenkool  <seg...@kernel.crashing.org>

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

---
 gcc/expmed.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gcc/expmed.c b/gcc/expmed.c
index e281930..0922029 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -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);
 
-- 
1.8.3.1

Reply via email to