https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88971
Bug ID: 88971 Summary: Branch optimization inconsistency (missed optimization) Product: gcc Version: 8.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: maratrus at mail dot ru Target Milestone: --- Created attachment 45490 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45490&action=edit A code that demonstrates different patterns in optimization technique In the code attached I expect the compiler not to generate any code between two `mfence` instructions in the method `CheckAndPrint()`. Indeed, it does the good job if I call `PrintGood<false>()` method and no code is generated. But if I out-comment `PrintBad<false>()` or even simple return the compiler generates a code for the if-expression `if (t.j > 0)`. In all three cases there seems to be no reason to generate any code. The code attached is compiled as: `g++ -std=c++11 -Ofast opt_template.cc -o opt_template` I must be missing something but is there a good reason why the compiler managed to optimize the code in one case but non in the other two?