On Thu, Apr 30, 2015 at 12:53 PM, Marc Glisse <marc.gli...@inria.fr> wrote: > On Thu, 30 Apr 2015, Richard Biener wrote: > >> I have in my local dev tree (so completely untested...) >> >> @@ -1040,31 +1052,22 @@ (define_operator_list CBRT BUILT_IN_CBRT >> operation and convert the result to the desired type. */ >> (for op (plus minus) >> (simplify >> - (convert (op (convert@2 @0) (convert@3 @1))) >> + (convert (op:c@4 (convert@2 @0) (convert?@3 @1))) > > > I believe the :c here requires extra code further down, so we don't turn a-b > into b-a.
Indeed. I've added :c only for minus as 5 - x can't be canonicalized to move the constant to 2nd position which is always possible for plus. Might be cleaner to add a separate pattern for that case. Richard. > >> (if (INTEGRAL_TYPE_P (type) >> - /* We check for type compatibility between @0 and @1 below, >> - so there's no need to check that @1/@3 are integral types. */ >> && INTEGRAL_TYPE_P (TREE_TYPE (@0)) >> - && INTEGRAL_TYPE_P (TREE_TYPE (@2)) >> + && INTEGRAL_TYPE_P (TREE_TYPE (@4)) >> /* The precision of the type of each operand must match the >> precision of the mode of each operand, similarly for the >> result. */ >> && (TYPE_PRECISION (TREE_TYPE (@0)) >> == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (@0)))) >> - && (TYPE_PRECISION (TREE_TYPE (@1)) >> - == GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (@1)))) >> - && TYPE_PRECISION (type) == GET_MODE_PRECISION (TYPE_MODE (type)) >> /* The inner conversion must be a widening conversion. */ >> && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (TREE_TYPE >> (@0)) >> - && ((GENERIC >> - && (TYPE_MAIN_VARIANT (TREE_TYPE (@0)) >> - == TYPE_MAIN_VARIANT (TREE_TYPE (@1))) >> - && (TYPE_MAIN_VARIANT (TREE_TYPE (@0)) >> - == TYPE_MAIN_VARIANT (type))) >> - || (GIMPLE >> - && types_compatible_p (TREE_TYPE (@0), TREE_TYPE (@1)) >> - && types_compatible_p (TREE_TYPE (@0), type)))) >> + /* The final precision should match that of operand @0. */ >> + && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (@0)) >> + /* Make sure the wide operation is dead after the transform. */ >> + && (TREE_CODE (@4) != SSA_NAME || has_single_use (@4))) >> (if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))) >> - (convert (op @0 @1))) >> + (convert (op @0 (convert @1)))) >> (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); } >> (convert (op (convert:utype @0) (convert:utype @1))))))) > > > -- > Marc Glisse