https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99767
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|--- |9.4 Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed| |2021-03-25 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- OMP lowering makes the dead division conditional and we produce and want to expand ;; basic block 2, loop depth 0 ;; pred: ENTRY MEM <vector(2) int> [(int *)&mask.4] = mask.5_9(D); vect__5.21_31 = .MASK_LOAD (&mask.4, 32B, { -1, -1, 0, 0, ... }); _5 = mask.4[0]; mask__26.22_33 = vect__5.21_31 != { 0, ... }; _26 = _5 != 0; v_1 = .COND_DIV (_26, 1, 0, 1); vec_mask_and_37 = mask__26.22_33 & { -1, -1, 0, 0, ... }; .MASK_STORE (&retval.3, 32B, vec_mask_and_37, { 0, ... }); vectp_mask.19_29 = &mask.4 + POLY_INT_CST [16, 16]; vectp_retval.23_36 = &retval.3 + POLY_INT_CST [16, 16]; _6 = VIEW_CONVERT_EXPR<vector(2) int>(retval.3); return _6; ;; succ: EXIT but that's still scalar, so sth forgot to "vectorize" it? Indeed when returning 'v' we instead get _26 = _5 != 0; vec_mask_and_37 = mask__26.34_33 & { -1, -1, -1, -1, 0, 0, 0, 0, ... }; vect_v_1.35_38 = .COND_DIV (vec_mask_and_37, { 1, ... }, { 0, ... }, { 1, ... }); .MASK_STORE (&retval.9, 32B, vec_mask_and_37, vect_v_1.35_38); The .COND_DIV is generated by if-conversion which supposedly expects we will vectorize it (or throw it away) but it doesn't ignore (as the vectorizer) obviously dead stmts. So the bug is this disconnect between if-conversion and vectorization.