https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122443
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I should note fold is not recusive.
```
tree inner_expr = build2 (inner_op,
result_type->as_tree (),
node_a,
node_b);
/* Try to fold the expression. */
inner_expr = fold (inner_expr);
```
Really uses way too much memory if fold does something too.
Just use fold_build2 here.
Likewise here too:
```
if (VECTOR_TYPE_P (a_type))
{
/* Build a vector comparison. See build_vec_cmp in c-typeck.cc for
reference. */
tree t_vec_result_type = vec_result_type->as_tree ();
tree zero_vec = build_zero_cst (t_vec_result_type);
tree minus_one_vec = build_minus_one_cst (t_vec_result_type);
tree cmp_type = truth_type_for (a_type);
tree cmp = build2 (inner_op, cmp_type, node_a, node_b);
inner_expr = build3 (VEC_COND_EXPR, t_vec_result_type, cmp, minus_one_vec,
zero_vec);
}
else
{
inner_expr = build2 (inner_op,
boolean_type_node,
node_a,
node_b);
}
/* Try to fold. */
inner_expr = fold (inner_expr);
```