re PR tree-optimization/89570 (ICE in prepare_cmp_insn, at optabs.c:4001)
authorJakub Jelinek <jakub@redhat.com>
Tue, 5 Mar 2019 15:05:07 +0000 (16:05 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 5 Mar 2019 15:05:07 +0000 (16:05 +0100)
PR tree-optimization/89570
* match.pd (vec_cond into cond_op simplification): Don't use
get_conditional_internal_fn, use as_internal_fn (cond_op).

Co-Authored-By: Richard Sandiford <richard.sandiford@arm.com>
From-SVN: r269391

gcc/ChangeLog
gcc/match.pd

index d4e8cbe66afdb07cb1ce2d7e1e4c7c046d77ef97..b85b54cb096b8178580198658e22f4162e8628b7 100644 (file)
@@ -1,3 +1,10 @@
+2019-03-05  Jakub Jelinek  <jakub@redhat.com>
+           Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/89570
+       * match.pd (vec_cond into cond_op simplification): Don't use
+       get_conditional_internal_fn, use as_internal_fn (cond_op).
+
 2019-03-05  Wilco Dijkstra  <wdijkstr@arm.com>
 
        PR target/89222
index 8bf653549de2d0e4c9e9b59edd82b9f708df9dcf..0d82beab45b13cfbab4d3f24720dae3018f82c6c 100644 (file)
@@ -5176,24 +5176,26 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 
    if the target can do it in one go.  This makes the operation conditional
    on c, so could drop potentially-trapping arithmetic, but that's a valid
-   simplification if the result of the operation isn't needed.  */
+   simplification if the result of the operation isn't needed.
+
+   Avoid speculatively generating a stand-alone vector comparison                                                                                
+   on targets that might not support them.  Any target implementing                                                                              
+   conditional internal functions must support the same comparisons                                                                              
+   inside and outside a VEC_COND_EXPR.  */                                                                                                       
+
 #if GIMPLE
 (for uncond_op (UNCOND_BINARY)
      cond_op (COND_BINARY)
  (simplify
   (vec_cond @0 (view_convert? (uncond_op@4 @1 @2)) @3)
-  (with { tree op_type = TREE_TYPE (@4); 
-         internal_fn cond_fn = get_conditional_internal_fn (uncond_op); }
-   (if (cond_fn != IFN_LAST
-       && vectorized_internal_fn_supported_p (cond_fn, op_type)
+  (with { tree op_type = TREE_TYPE (@4); }
+   (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type)
        && element_precision (type) == element_precision (op_type))
     (view_convert (cond_op @0 @1 @2 (view_convert:op_type @3))))))
  (simplify
   (vec_cond @0 @1 (view_convert? (uncond_op@4 @2 @3)))
-  (with { tree op_type = TREE_TYPE (@4);
-         internal_fn cond_fn = get_conditional_internal_fn (uncond_op); }
-   (if (cond_fn != IFN_LAST
-       && vectorized_internal_fn_supported_p (cond_fn, op_type)
+  (with { tree op_type = TREE_TYPE (@4); }
+   (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type)
        && element_precision (type) == element_precision (op_type))
     (view_convert (cond_op (bit_not @0) @2 @3 (view_convert:op_type @1)))))))
 
@@ -5202,20 +5204,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
      cond_op (COND_TERNARY)
  (simplify
   (vec_cond @0 (view_convert? (uncond_op@5 @1 @2 @3)) @4)
-  (with { tree op_type = TREE_TYPE (@5);
-         internal_fn cond_fn
-           = get_conditional_internal_fn (as_internal_fn (uncond_op)); }
-   (if (cond_fn != IFN_LAST
-       && vectorized_internal_fn_supported_p (cond_fn, op_type)
+  (with { tree op_type = TREE_TYPE (@5); }
+   (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type)
        && element_precision (type) == element_precision (op_type))
     (view_convert (cond_op @0 @1 @2 @3 (view_convert:op_type @4))))))
  (simplify
   (vec_cond @0 @1 (view_convert? (uncond_op@5 @2 @3 @4)))
-  (with { tree op_type = TREE_TYPE (@5);
-         internal_fn cond_fn
-           = get_conditional_internal_fn (as_internal_fn (uncond_op)); }
-   (if (cond_fn != IFN_LAST
-       && vectorized_internal_fn_supported_p (cond_fn, op_type)
+  (with { tree op_type = TREE_TYPE (@5); }
+   (if (vectorized_internal_fn_supported_p (as_internal_fn (cond_op), op_type)
        && element_precision (type) == element_precision (op_type))
     (view_convert (cond_op (bit_not @0) @2 @3 @4
                  (view_convert:op_type @1)))))))