This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, vectorizer]: Fix PR tree-optimization/33597: ICE while compiling libswcale from ffmpeg


Hello!

We forgot to check if optab is available in requested mode. Attached patch introduces this missing check.
Patch was bootstrapped and regression tested on x86_64-pc-linux-gnu.


OK for mainline?

2007-09-30 Uros Bizjak <ubizjak@gmail.com>

       PR tree-optimization/33597
       * tree-vect-analyze.c (vect_build_slp_tree): Check if optab handler
       for LSHIFT_EXPR and RSHIFT_EXPR is available for vec_mode.

testsuite/ChangeLog:

2007-09-30 Uros Bizjak <ubizjak@gmail.com>

       PR tree-optimization/33597
       * gcc.dg/vect/pr33597.c: New testcase.

Uros.



Index: testsuite/gcc.dg/vect/pr33597.c
===================================================================
--- testsuite/gcc.dg/vect/pr33597.c	(revision 0)
+++ testsuite/gcc.dg/vect/pr33597.c	(revision 0)
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+
+void
+rgb15to24_C (const uint8_t * src, uint8_t * dst, long src_size)
+{
+  const uint16_t *end;
+  const uint16_t *s = (uint16_t *)src;
+  uint8_t *d = (uint8_t *)dst;
+
+  end = s + src_size/2;
+  while (s < end)
+    {
+      uint16_t bgr = *s++;
+
+      *d++ = (bgr&0x1F)<<3;
+      *d++ = (bgr&0x3E0)>>2;
+      *d++ = (bgr&0x7C00)>>7;
+    }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
Index: tree-vect-analyze.c
===================================================================
--- tree-vect-analyze.c	(revision 128890)
+++ tree-vect-analyze.c	(working copy)
@@ -2696,6 +2696,13 @@ vect_build_slp_tree (loop_vec_info loop_
 		  return false;
 		}
 	      icode = (int) optab->handlers[(int) vec_mode].insn_code;
+	      if (icode == CODE_FOR_nothing)
+		{
+		  if (vect_print_dump_info (REPORT_SLP))
+		    fprintf (vect_dump,
+			     "Build SLP failed: op not supported by target.");
+		  return false;
+		}
 	      optab_op2_mode = insn_data[icode].operand[2].mode;
 	      if (!VECTOR_MODE_P (optab_op2_mode))
 		{

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]