https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70916
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #2)
> For the ICE the fix is easy:
> --- tree-vect-patterns.c.jj1 2016-03-23 10:51:23.000000000 +0100
> +++ tree-vect-patterns.c 2016-05-03 08:39:17.779229143 +0200
> @@ -3673,8 +3673,10 @@ vect_recog_mask_conversion_pattern (vec<
> if (!rhs1_type)
> return NULL;
> }
> - else
> + else if (COMPARISON_CLASS_P (rhs1))
> rhs1_type = TREE_TYPE (TREE_OPERAND (rhs1, 0));
> + else
> + return NULL;
>
> vectype2 = get_mask_type_for_scalar_type (rhs1_type);
>
> now to figure out why tree-if-conv.c actually emitted something = 1 ? op2 :
> op3;
I supoose its fold_build_cond_expr doesn't work reliably anymore for some
reason.
Ah, constant_or_ssa_name fails to handle invariant ADDR_EXPRs.
Index: gcc/tree-if-conv.c
===================================================================
--- gcc/tree-if-conv.c (revision 235738)
+++ gcc/tree-if-conv.c (working copy)
@@ -413,17 +413,9 @@ fold_or_predicates (location_t loc, tree
static bool
constant_or_ssa_name (tree n)
{
- switch (TREE_CODE (n))
- {
- case SSA_NAME:
- case INTEGER_CST:
- case REAL_CST:
- case COMPLEX_CST:
- case VECTOR_CST:
- return true;
- default:
- return false;
- }
+ if (TREE_CODE (n) == SSA_NAME
+ || is_gimple_min_invariant (n))
+ return true;
}
/* Returns either a COND_EXPR or the folded expression if the folded