https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86816
Bug ID: 86816 Summary: [8 Regression] ICE: SIGSEGV in tree-ssa-pre / tail_merge_optimize Product: gcc Version: tree-ssa Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: janu.gorec at interia dot pl Target Milestone: --- Created attachment 44481 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44481&action=edit Source of minimal test case Environment: /home/local/gcc820/bin/g++ -v Using built-in specs. COLLECT_GCC=/home/local/gcc820/bin/g++ COLLECT_LTO_WRAPPER=/home/local/gcc820/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-8.2.0/configure --prefix=/home/local/gcc820 --with-gmp=/home/local --with-mpfr=/home/local --with-mpc=/home/local --enable-languages=c,c++ Thread model: posix gcc version 8.2.0 (GCC) Command line: /home/local/gcc820/bin/gcc -O2 -c -Wall -Wextra ice-test.cpp Compiler output: during GIMPLE pass: pre ice-test.cpp: In member function 'void Test::TestIce(Ctx&, Signal*)': ice-test.cpp:21:6: internal compiler error: Segmentation fault void Test::TestIce( Ctx& ctx, Signal* sig) ^~~~ 0xb372cf crash_signal ../../gcc-8.2.0/gcc/toplev.c:325 0xcd8a6e vn_valueize ../../gcc-8.2.0/gcc/tree-ssa-sccvn.h:258 0xcd8a6e gvn_uses_equal ../../gcc-8.2.0/gcc/tree-ssa-tail-merge.c:366 0xcdbb36 gimple_equal_p ../../gcc-8.2.0/gcc/tree-ssa-tail-merge.c:1087 0xcdbb36 find_duplicate ../../gcc-8.2.0/gcc/tree-ssa-tail-merge.c:1281 0xcdbb36 find_clusters_1 ../../gcc-8.2.0/gcc/tree-ssa-tail-merge.c:1487 0xcdbb36 find_clusters ../../gcc-8.2.0/gcc/tree-ssa-tail-merge.c:1508 0xcdbb36 tail_merge_optimize(unsigned int) ../../gcc-8.2.0/gcc/tree-ssa-tail-merge.c:1752 0xc8a515 execute ../../gcc-8.2.0/gcc/tree-ssa-pre.c:4209 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. Same for -O3 and gcc-8.1.0. gcc-7.3.0 (and 6, 5, 4.9, 4.7) is Ok. Minimal test case: (also in attachment) class Signal { public: int m_Mode; }; class Ctx { public: bool m_Invert; void DoSomething(); }; class Test { void TestIce( Ctx& ctx, Signal* sig); }; void Test::TestIce( Ctx& ctx, Signal* sig) { int invert = false; if( ! ctx.m_Invert) invert = ! invert; switch( sig->m_Mode) { case 1: invert = ! invert; break; case 2: invert = true; break; } if( invert) ctx.DoSomething(); }