https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66812
--- Comment #5 from David Malcolm <dmalcolm at gcc dot gnu.org> --- (In reply to David Malcolm from comment #4) > Created attachment 35946 [details] > Equivalent C code > > (generated using gcc_jit_context_dump_to_file and lightly editing until > valid C) Compiling this with trunk with -O3 *doesn't* show the fre1 issue exhibited by libgccjit; dump from cc1's fre1 looks like this: ;; Function test_pr66812 (test_pr66812, funcdef_no=0, decl_uid=1762, cgraph_uid=0, symbol_order=0) Setting value number of .MEM_3(D) to .MEM_3(D) (changed) Value numbering .MEM_4 stmt = MEM[(struct value *)arr_1(D) + 16B].union_field.i_field = 0; RHS 0 simplified to 0 No store match Value numbering store MEM[(struct value *)arr_1(D) + 16B].union_field.i_field to 0 Setting value number of .MEM_4 to .MEM_4 (changed) Value numbering .MEM_6 stmt = MEM[(struct value *)arr_1(D) + 16B].type_code = 0; RHS 0 simplified to 0 No store match Value numbering store MEM[(struct value *)arr_1(D) + 16B].type_code to 0 Setting value number of .MEM_6 to .MEM_6 (changed) Value numbering .MEM_8 stmt = MEM[(struct value *)arr_1(D) + 16B].union_field.ll_field = 10; RHS 10 simplified to 10 No store match Value numbering store MEM[(struct value *)arr_1(D) + 16B].union_field.ll_field to 10 Setting value number of .MEM_8 to .MEM_8 (changed) Value numbering .MEM_10 stmt = MEM[(struct value *)arr_1(D) + 16B].type_code = 19; RHS 19 simplified to 19 No store match Value numbering store MEM[(struct value *)arr_1(D) + 16B].type_code to 19 Setting value number of .MEM_10 to .MEM_10 (changed) Value numbering .MEM_12 stmt = MEM[(struct value *)arr_1(D) + 16B].union_field.i_field = 0; RHS 0 simplified to 0 No store match Value numbering store MEM[(struct value *)arr_1(D) + 16B].union_field.i_field to 0 Setting value number of .MEM_12 to .MEM_12 (changed) Value numbering .MEM_14 stmt = MEM[(struct value *)arr_1(D) + 16B].type_code = 0; RHS 0 simplified to 0 No store match Value numbering store MEM[(struct value *)arr_1(D) + 16B].type_code to 0 Setting value number of .MEM_14 to .MEM_14 (changed) Value numbers: test_pr66812 (struct value * arr) { <bb 2>: MEM[(struct value *)arr_1(D) + 16B].union_field.i_field = 0; MEM[(struct value *)arr_1(D) + 16B].type_code = 0; MEM[(struct value *)arr_1(D) + 16B].union_field.ll_field = 10; MEM[(struct value *)arr_1(D) + 16B].type_code = 19; MEM[(struct value *)arr_1(D) + 16B].union_field.i_field = 0; MEM[(struct value *)arr_1(D) + 16B].type_code = 0; return; } Note that the final: MEM[(struct value *)arr_1(D) + 16B].union_field.i_field = 0; is still present, and the lack of the: > Deleted redundant store MEM[(struct value *)arr_2(D) + > 16B].union_field.i_field = 0; from the TDF_DETAILS version of the dump. So for some reason fre1 is more aggressive on this with libgccjit than with cc1.