genmatch and cond vs "for (cnd cond vec_cond)" for gimple
Andrew Pinski
pinskia@gmail.com
Sun Jun 13 00:21:59 GMT 2021
On Sat, Jun 12, 2021 at 4:54 PM Andrew Pinski <pinskia@gmail.com> wrote:
>
> Hi all,
> While moving the simple A CMP 0 ? A : -A patterns from
> fold_cond_expr_with_comparison to match, I ran into an issue where
> using cond directly in the patterns work while "for cnd (cond
> vec_cond)" don't work.
> It looks like in the first case we are able to correctly handle the
> cond first operand being a comparison while with the for loop we are
> not.
>
> That is the following additional pattern works:
> /* A == 0? A : -A same as -A */
> (simplify
> (cond (eq @0 zerop) @0 (negate@1 @0))
> (if (!HONOR_SIGNED_ZEROS (element_mode (type)))
> @1))
> (simplify
> (cond (eq @0 zerop) zerop (negate@1 @0))
> (if (!HONOR_SIGNED_ZEROS (element_mode (type)))
> @1)))
>
> While this one does not work:
> (for cnd (cond vec_cond)
> /* A == 0? A : -A same as -A */
> (simplify
> (cnd (eq @0 zerop) @0 (negate@1 @0))
> (if (!HONOR_SIGNED_ZEROS (element_mode (type)))
> @1))
> (simplify
> (cnd (eq @0 zerop) zerop (negate@1 @0))
> (if (!HONOR_SIGNED_ZEROS (element_mode (type)))
> @1)))
>
> ---- CUT ---
> I will try to debug genmatch some but I wanted to get this email out
> to record what will need to be fixed to continue the movement of
> phiopt over to match.
So the problem is we lower for loops first and then cond. Though
swapping the order in genmatch's lower function causes invalid C++
code to be generated :(.
Still trying to figure out why though.
Thanks,
Andrew
>
> Thanks,
> Andrew Pinski
More information about the Gcc
mailing list