https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108314
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- (gdb) p debug_gimple_stmt (stmt) t_5 = .FOLD_EXTRACT_LAST (t_14, _41, ); there's a missing call argument, the call is built here: #0 vectorizable_condition (vinfo=0x3b67200, stmt_info=0x3c3d160, gsi=0x7fffffffcad0, vec_stmt=0x7fffffffc8a8, slp_node=0x0, cost_vec=0x0) at /home/rguenther/src/trunk/gcc/tree-vect-stmts.cc:10763 10763 new_stmt = gimple_build_call_internal (gdb) l 10758 gimple *new_stmt; 10759 if (reduction_type == EXTRACT_LAST_REDUCTION) 10760 { 10761 gimple *old_stmt = vect_orig_stmt (stmt_info)->stmt; 10762 tree lhs = gimple_get_lhs (old_stmt); 10763 new_stmt = gimple_build_call_internal 10764 (IFN_FOLD_EXTRACT_LAST, 3, else_clause, vec_compare, 10765 vec_then_clause); 10766 gimple_call_set_lhs (new_stmt, lhs); 10767 SSA_NAME_DEF_STMT (lhs) = new_stmt; (gdb) p vec_then_clause $13 = <tree 0x0> which is because we run into else if (bitop2 == BIT_NOT_EXPR) { /* Instead of doing ~x ? y : z do x ? z : y. */ vec_compare = new_temp; std::swap (vec_then_clause, vec_else_clause); but vec_else_clause isn't initialized for EXTRACT_LAST_REDUCTION. Instead we should swap with else_clause here? It seems to me I've seen this before ... Note that if we swap we fail to expand the internal function which seems to want the scalar/vector args in specific places and _not_ support this inversion. So instead avoid doing this optimization.