re PR rtl-optimization/79901 (ICE in prepare_cmp_insn, at optabs.c:3904)
authorJakub Jelinek <jakub@redhat.com>
Tue, 7 Mar 2017 08:04:38 +0000 (09:04 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 7 Mar 2017 08:04:38 +0000 (09:04 +0100)
PR rtl-optimization/79901
* expr.c (expand_expr_real_2): For vector MIN/MAX, if there is no
min/max expander, expand it using expand_vec_cond_expr.

From-SVN: r245946

gcc/ChangeLog
gcc/expr.c

index eb06b5ab2eb9dfe49f3e33e049fd13430c1ecc3f..efeee1a1796404ab6a8c9e8cef130308aedc53f3 100644 (file)
@@ -1,5 +1,9 @@
 2017-03-07  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/79901
+       * expr.c (expand_expr_real_2): For vector MIN/MAX, if there is no
+       min/max expander, expand it using expand_vec_cond_expr.
+
        PR sanitizer/79897
        * ubsan.c (ubsan_encode_value): Call mark_addressable on the
        temporary.
index 34bbf3d7b47f5fdae0871c104a49b4f10773b7ee..91d7ea217229fac62380b5d4b646961bf7c836c1 100644 (file)
@@ -8943,6 +8943,18 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode,
       if (temp != 0)
        return temp;
 
+      /* For vector MIN <x, y>, expand it a VEC_COND_EXPR <x <= y, x, y>
+        and similarly for MAX <x, y>.  */
+      if (VECTOR_TYPE_P (type))
+       {
+         tree t0 = make_tree (type, op0);
+         tree t1 = make_tree (type, op1);
+         tree comparison = build2 (code == MIN_EXPR ? LE_EXPR : GE_EXPR,
+                                   type, t0, t1);
+         return expand_vec_cond_expr (type, comparison, t0, t1,
+                                      original_target);
+       }
+
       /* At this point, a MEM target is no longer useful; we will get better
         code without it.  */