This patch makes expand_vector_ubsan_overflow cope with a polynomial number of elements.
2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * internal-fn.c (expand_vector_ubsan_overflow): Handle polynomial numbers of elements. Index: gcc/internal-fn.c =================================================================== --- gcc/internal-fn.c 2017-10-23 17:11:39.913311438 +0100 +++ gcc/internal-fn.c 2017-10-23 17:22:51.056325855 +0100 @@ -1872,7 +1872,7 @@ expand_mul_overflow (location_t loc, tre expand_vector_ubsan_overflow (location_t loc, enum tree_code code, tree lhs, tree arg0, tree arg1) { - int cnt = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)); + poly_uint64 cnt = TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)); rtx_code_label *loop_lab = NULL; rtx cntvar = NULL_RTX; tree cntv = NULL_TREE; @@ -1882,6 +1882,8 @@ expand_vector_ubsan_overflow (location_t tree resv = NULL_TREE; rtx lhsr = NULL_RTX; rtx resvr = NULL_RTX; + unsigned HOST_WIDE_INT const_cnt = 0; + bool use_loop_p = (!cnt.is_constant (&const_cnt) || const_cnt > 4); if (lhs) { @@ -1902,7 +1904,7 @@ expand_vector_ubsan_overflow (location_t } } } - if (cnt > 4) + if (use_loop_p) { do_pending_stack_adjust (); loop_lab = gen_label_rtx (); @@ -1921,10 +1923,10 @@ expand_vector_ubsan_overflow (location_t rtx arg1r = expand_normal (arg1); arg1 = make_tree (TREE_TYPE (arg1), arg1r); } - for (int i = 0; i < (cnt > 4 ? 1 : cnt); i++) + for (unsigned int i = 0; i < (use_loop_p ? 1 : const_cnt); i++) { tree op0, op1, res = NULL_TREE; - if (cnt > 4) + if (use_loop_p) { tree atype = build_array_type_nelts (eltype, cnt); op0 = uniform_vector_p (arg0); @@ -1964,7 +1966,7 @@ expand_vector_ubsan_overflow (location_t false, false, false, true, &data); break; case MINUS_EXPR: - if (cnt > 4 ? integer_zerop (arg0) : integer_zerop (op0)) + if (use_loop_p ? integer_zerop (arg0) : integer_zerop (op0)) expand_neg_overflow (loc, res, op1, true, &data); else expand_addsub_overflow (loc, MINUS_EXPR, res, op0, op1, @@ -1978,7 +1980,7 @@ expand_vector_ubsan_overflow (location_t gcc_unreachable (); } } - if (cnt > 4) + if (use_loop_p) { struct separate_ops ops; ops.code = PLUS_EXPR; @@ -1991,7 +1993,8 @@ expand_vector_ubsan_overflow (location_t EXPAND_NORMAL); if (ret != cntvar) emit_move_insn (cntvar, ret); - do_compare_rtx_and_jump (cntvar, GEN_INT (cnt), NE, false, + rtx cntrtx = gen_int_mode (cnt, TYPE_MODE (sizetype)); + do_compare_rtx_and_jump (cntvar, cntrtx, NE, false, TYPE_MODE (sizetype), NULL_RTX, NULL, loop_lab, profile_probability::very_likely ()); }