https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90402
Bug ID: 90402 Summary: [9/10 Regression] ICE in slpeel_duplicate_current_defs_from_edges Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: ice-on-valid-code Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: asolokha at gmx dot com Target Milestone: --- Target: x86_64-unknown-linux-gnu-gcc 1. gcc-10.0.0-alpha20190505 snapshot (r270883) ICEs when compiling the following testcase w/ -mavx -O3: int kn, ha; int c7 (void) { } void ul (int w3) { kn = c7 (); while (w3 < 1) { ha += !!kn ? 1 : w3; for (kn = 0; kn < 2; ++kn) { } ++w3; } } % x86_64-unknown-linux-gnu-gcc-10.0.0-alpha20190505 -mavx -O3 -c mmoxyagz.c during GIMPLE pass: vect mmoxyagz.c: In function 'ul': mmoxyagz.c:9:1: internal compiler error: in slpeel_duplicate_current_defs_from_edges, at tree-vect-loop-manip.c:979 9 | ul (int w3) | ^~ 0x6eeeed slpeel_duplicate_current_defs_from_edges /var/tmp/portage/sys-devel/gcc-10.0.0_alpha20190505/work/gcc-10-20190505/gcc/tree-vect-loop-manip.c:979 0xf70004 slpeel_tree_duplicate_loop_to_edge_cfg(loop*, loop*, edge_def*) /var/tmp/portage/sys-devel/gcc-10.0.0_alpha20190505/work/gcc-10-20190505/gcc/tree-vect-loop-manip.c:1077 0xf73d4b vect_do_peeling(_loop_vec_info*, tree_node*, tree_node*, tree_node**, tree_node**, tree_node**, int, bool, bool) /var/tmp/portage/sys-devel/gcc-10.0.0_alpha20190505/work/gcc-10-20190505/gcc/tree-vect-loop-manip.c:2609 0xf5952b vect_transform_loop(_loop_vec_info*) /var/tmp/portage/sys-devel/gcc-10.0.0_alpha20190505/work/gcc-10-20190505/gcc/tree-vect-loop.c:8370 0xf8668b try_vectorize_loop_1 /var/tmp/portage/sys-devel/gcc-10.0.0_alpha20190505/work/gcc-10-20190505/gcc/tree-vectorizer.c:979 0xf870dd vectorize_loops() /var/tmp/portage/sys-devel/gcc-10.0.0_alpha20190505/work/gcc-10-20190505/gcc/tree-vectorizer.c:1111 2. When compiling the following testcase w/ -O3 -fopenmp -fno-code-hoisting -fno-tree-copy-prop -fno-tree-dce -fno-tree-pre, gcc ICEs at tree-vect-loop-manip.c:985 instead: struct fq { int cg; }; struct fq jr; int p8 (struct fq *yo, struct fq *ab) { return !!yo->cg || !!ab->cg; } void k6 (void) { int py; int v3[6]; for (py = 0; py < 6; ++py) v3[py] = (py % 3 != 1) + 1; #pragma omp declare reduction (* : struct fq : p8 (&omp_out, &omp_in)) #pragma omp parallel reduction (task, * : jr) if (!!py) { } }