Blame SOURCES/gcc48-rh1546728.patch

5ed81e
2015-09-03  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
5ed81e
5ed81e
	* optabs.c (expand_binop): Don't create a broadcast vector with a
5ed81e
	source element wider than the inner mode.
5ed81e
5ed81e
	* gcc.target/powerpc/vec-shift.c: New test.
5ed81e
5ed81e
--- gcc/optabs.c
5ed81e
+++ gcc/optabs.c
5ed81e
@@ -1608,6 +1608,15 @@ expand_binop (machine_mode mode, optab binoptab, rtx op0, rtx op1,
5ed81e
 
5ed81e
       if (otheroptab && optab_handler (otheroptab, mode) != CODE_FOR_nothing)
5ed81e
 	{
5ed81e
+	  /* The scalar may have been extended to be too wide.  Truncate
5ed81e
+	     it back to the proper size to fit in the broadcast vector.  */
5ed81e
+	  machine_mode inner_mode = GET_MODE_INNER (mode);
5ed81e
+	  if (!CONST_INT_P (op1)
5ed81e
+	      && (GET_MODE_BITSIZE (inner_mode)
5ed81e
+		  < GET_MODE_BITSIZE (GET_MODE (op1))))
5ed81e
+	    op1 = force_reg (inner_mode,
5ed81e
+			     simplify_gen_unary (TRUNCATE, inner_mode, op1,
5ed81e
+						 GET_MODE (op1)));
5ed81e
 	  rtx vop1 = expand_vector_broadcast (mode, op1);
5ed81e
 	  if (vop1)
5ed81e
 	    {
5ed81e
--- /dev/null
5ed81e
+++ gcc/testsuite/gcc.target/powerpc/vec-shift.c
5ed81e
@@ -0,0 +1,20 @@
5ed81e
+/* { dg-do compile { target { powerpc*-*-* } } } */
5ed81e
+/* { dg-require-effective-target powerpc_altivec_ok } */
5ed81e
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
5ed81e
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power7" } } */
5ed81e
+/* { dg-options "-mcpu=power7 -O2" } */
5ed81e
+
5ed81e
+/* This used to ICE.  During gimplification, "i" is widened to an unsigned
5ed81e
+   int.  We used to fail at expand time as we tried to cram an SImode item
5ed81e
+   into a QImode memory slot.  This has been fixed to properly truncate the
5ed81e
+   shift amount when splatting it into a vector.  */
5ed81e
+
5ed81e
+typedef unsigned char v16ui __attribute__((vector_size(16)));
5ed81e
+
5ed81e
+v16ui vslb(v16ui v, unsigned char i)
5ed81e
+{
5ed81e
+	return v << i;
5ed81e
+}
5ed81e
+
5ed81e
+/* { dg-final { scan-assembler "vspltb" } } */
5ed81e
+/* { dg-final { scan-assembler "vslb" } } */