Here is the patch.

Thanks,
bin

On Thu, Nov 24, 2016 at 10:11 AM, Bin.Cheng <amker.ch...@gmail.com> wrote:
> On Thu, Nov 24, 2016 at 8:57 AM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Wed, Nov 23, 2016 at 3:57 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>>> On Wed, Nov 23, 2016 at 2:27 PM, Richard Biener
>>> <richard.guent...@gmail.com> wrote:
>>>> On Wed, Nov 23, 2016 at 2:54 PM, Bin Cheng <bin.ch...@arm.com> wrote:
>>>>> Hi,
>>>>> This is actually the review suggestion for patch 
>>>>> @https://gcc.gnu.org/ml/gcc-patches/2016-11/msg02341.html, but I forgot 
>>>>> to incorporate it when committing that patch.  Here comes this one doing 
>>>>> that, as well as adding a missing convert keyword.  Toolchain built 
>>>>> successfully, is it OK?
>>>>
>>>> As said you _do_ need the outermost (convert ...) on the (max .. and
>>>> (min ... expressions given @1 may not be of type 'type'.
>>> Sorry about the stupid mistake.  How about this one?  The from_type in
>>> the last branch looks like necessary to me.
>>
>> I think
>>
>>      (if (code == EQ_EXPR)
>>       (cond (cmp @1 (convert @3)) (convert @3) @2)))))))
>>
>> is better?  We want the outer expression of type 'type' and @2 is
>> already 'type',
>> only @3 may not be.  So the only change would be to dop the unnecessary
>> :from_type inside the cmp and the bogus :from_type on the true arg of the 
>> cond.
> Hi Richard,
> The idea of using from_type in EQ_EXPR case is to do cond_expr in
> narrow/from type for all its operands, then convert the result back to
> default type.
> -      (cond (cmp @1 (convert:from_type @3)) (convert:from_type @3) @2)))))))
> +      (convert (cond (cmp @1 (convert @3))
> +     (convert:from_type @3) (convert:from_type @2)))))))))
>
> Is it better than using different types for operand 0 and 1/2 in cond_expr?
> I updated the patch following your suggestion.  Note, in this way
> below range check on @2 should be redundant for EQ_EXPR case, but I
> didn't change that in this patch.
>
>      if (int_fits_type_p (@2, from_type)
>      && (types_match (c1_type, from_type)
>          || (TYPE_PRECISION (c1_type) > TYPE_PRECISION (from_type)
>          && (TYPE_UNSIGNED (from_type)
>              || TYPE_SIGN (c1_type) == TYPE_SIGN (from_type))))
>
> So which one should be preferred?
>
> Thanks,
> bin
>>
>> Richard.
>>
>>
>>> Thanks,
>>> bin
>>>>
>>>>> Thanks,
>>>>> bin
>>>>>
>>>>> 2016-11-23  Bin Cheng  <bin.ch...@arm.com>
>>>>>
>>>>>         * match.pd: Refine type conversion in result expressions for below
>>>>>         pattern:
>>>>>         (cond (cmp (convert1? x) c1) (convert2? x) c2) -> (minmax (x c)).
Index: gcc/match.pd
===================================================================
--- gcc/match.pd        (revision 242751)
+++ gcc/match.pd        (working copy)
@@ -2022,12 +2022,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        }
    }
    (if (code == MAX_EXPR)
-    (convert (max @1 (convert:from_type @2)))
+    (convert (max @1 (convert @2)))
     (if (code == MIN_EXPR)
-     (convert (min @1 (convert:from_type @2)))
+     (convert (min @1 (convert @2)))
      (if (code == EQ_EXPR)
-      (cond (cmp @1 (convert:from_type @3)) (convert:from_type @3) @2)))))))
+      (cond (cmp @1 (convert @3)) (convert @3) @2)))))))
 
+
 (for cnd (cond vec_cond)
  /* A ? B : (A ? X : C) -> A ? B : C.  */
  (simplify

Reply via email to