[PATCH] combine: Fix an oversight in make_compound_operation (PR66706)

Segher Boessenkool segher@kernel.crashing.org
Thu Jul 2 12:38:00 GMT 2015


Combine expands things like
  (zero_extend:DI (lshiftrt:SI (reg:SI) (reg:SI)))
to
  (and:DI (subreg:DI (lshiftrt:SI (reg:SI) (reg:SI)) 0)
          (const_int 0xffffffff))
to do simplifications on, and then make_compound_operation is supposed
to transform it back to the simpler form (with the zero_extend).

But it doesn't; it tries to make a zero_extract and then gives up.

This fixes it.  Bootstrapped and regression tested on powerpc64-linux
(-m32,-m32/-mpowerpc64,-m64,-m64/-mlra); no regressions.  Committing.


Segher


2015-07-02  Segher Boessenkool  <segher@kernel.crashing.org>

	PR rtl-optimization/66706
	* combine.c (make_compound_operation): If an AND of SUBREG of
	LSHIFTRT does not simplify, see if just the AND of SUBREG does.

---
 gcc/combine.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gcc/combine.c b/gcc/combine.c
index 8eaae7c..b97aa10 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7893,6 +7893,15 @@ make_compound_operation (rtx x, enum rtx_code in_code)
 	  new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
 				 XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
 				 0, in_code == COMPARE);
+
+	  /* If that didn't give anything, see if the AND simplifies on
+	     its own.  */
+	  if (!new_rtx && i >= 0)
+	    {
+	      new_rtx = make_compound_operation (XEXP (x, 0), next_code);
+	      new_rtx = make_extraction (mode, new_rtx, 0, NULL_RTX, i, 1,
+					 0, in_code == COMPARE);
+	    }
 	}
       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
       else if ((GET_CODE (XEXP (x, 0)) == XOR
-- 
1.8.1.4



More information about the Gcc-patches mailing list