{ build_minus_one_cst (type); })))
/* For unsigned integral types, FLOOR_DIV_EXPR is the same as
- TRUNC_DIV_EXPR. Rewrite into the latter in this case. */
-(simplify
- (floor_div @0 @1)
- (if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
- && TYPE_UNSIGNED (type))
- (trunc_div @0 @1)))
+ TRUNC_DIV_EXPR. Rewrite into the latter in this case. Similarly
+ for MOD instead of DIV. */
+(for floor_divmod (floor_div floor_mod)
+ trunc_divmod (trunc_div trunc_mod)
+ (simplify
+ (floor_divmod @0 @1)
+ (if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
+ && TYPE_UNSIGNED (type))
+ (trunc_divmod @0 @1))))
/* Combine two successive divisions. Note that combining ceil_div
and floor_div is trickier and combining round_div even more so. */
case MULT_HIGHPART_EXPR:
return TYPE_UNSIGNED (type) ? umul_highpart_optab : smul_highpart_optab;
- case TRUNC_MOD_EXPR:
case CEIL_MOD_EXPR:
case FLOOR_MOD_EXPR:
case ROUND_MOD_EXPR:
+ /* {s,u}mod_optab implements TRUNC_MOD_EXPR. For scalar modes,
+ expansion has code to adjust TRUNC_MOD_EXPR into the desired other
+ modes, but for vector modes it does not. The adjustment code
+ should be instead emitted in tree-vect-patterns.cc. */
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ return unknown_optab;
+ /* FALLTHRU */
+ case TRUNC_MOD_EXPR:
return TYPE_UNSIGNED (type) ? umod_optab : smod_optab;
- case RDIV_EXPR:
- case TRUNC_DIV_EXPR:
case CEIL_DIV_EXPR:
case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR:
+ /* {,u}{s,u}div_optab implements {TRUNC,EXACT}_DIV_EXPR or RDIV_EXPR.
+ For scalar modes, expansion has code to adjust TRUNC_DIV_EXPR
+ into the desired other modes, but for vector modes it does not.
+ The adjustment code should be instead emitted in
+ tree-vect-patterns.cc. */
+ if (TREE_CODE (type) == VECTOR_TYPE)
+ return unknown_optab;
+ /* FALLTHRU */
+ case RDIV_EXPR:
+ case TRUNC_DIV_EXPR:
case EXACT_DIV_EXPR:
if (TYPE_SATURATING (type))
return TYPE_UNSIGNED (type) ? usdiv_optab : ssdiv_optab;
--- /dev/null
+! PR middle-end/102860
+! { dg-do compile { target { powerpc*-*-* } } }
+! { dg-require-effective-target powerpc_vsx_ok }
+! { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power10" } }
+! { dg-options "-O2 -mcpu=power10" }
+
+function foo(a)
+ integer(kind=4) :: a(1024)
+ a(:) = modulo (a(:), 39)
+end function