https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80443
Bug ID: 80443 Summary: ICE on valid code at -O2 on x86_64-linux-gnu: in set_value_range, at tree-vrp.c:367 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: su at cs dot ucdavis.edu Target Milestone: --- This appears to be a recent regression. $ gcc-trunk -v Using built-in specs. COLLECT_GCC=gcc-trunk COLLECT_LTO_WRAPPER=/usr/local/gcc-trunk/libexec/gcc/x86_64-pc-linux-gnu/7.0.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-source-trunk/configure --enable-languages=c,c++,lto --prefix=/usr/local/gcc-trunk --disable-bootstrap Thread model: posix gcc version 7.0.1 20170417 (experimental) [trunk revision 246948] (GCC) $ $ gcc-trunk -Os -c small.c $ $ gcc-trunk -O2 -c small.c small.c: In function ‘fn1’: small.c:8:6: internal compiler error: in set_value_range, at tree-vrp.c:367 void fn1 () ^~~ 0xebf2a0 set_value_range ../../gcc-source-trunk/gcc/tree-vrp.c:367 0xebfd7b vrp_intersect_ranges_1 ../../gcc-source-trunk/gcc/tree-vrp.c:8995 0xebfd7b vrp_intersect_ranges(value_range*, value_range*) ../../gcc-source-trunk/gcc/tree-vrp.c:9029 0xec31a3 update_value_range ../../gcc-source-trunk/gcc/tree-vrp.c:793 0xed5406 vrp_visit_phi_node ../../gcc-source-trunk/gcc/tree-vrp.c:9362 0xddaa28 simulate_stmt ../../gcc-source-trunk/gcc/tree-ssa-propagate.c:237 0xddc4f7 simulate_block ../../gcc-source-trunk/gcc/tree-ssa-propagate.c:363 0xddc4f7 ssa_propagate(ssa_prop_result (*)(gimple*, edge_def**, tree_node**), ssa_prop_result (*)(gphi*)) ../../gcc-source-trunk/gcc/tree-ssa-propagate.c:808 0xedddc1 execute_vrp ../../gcc-source-trunk/gcc/tree-vrp.c:11680 0xedddc1 execute ../../gcc-source-trunk/gcc/tree-vrp.c:11778 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. $ --------------------------------------- struct { int a:1; } b, c; char d, e, f; void fn1 () { while (f) { char g = b.a; if (g) b.a = ~(1 + (d || c.a)); if (b.a < g && b.a) g = 0; if (b.a > c.a) b.a = g; c.a = e; } }