https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70053
--- Comment #9 from luoxhu at gcc dot gnu.org --- (In reply to Segher Boessenkool from comment #8) > I see no conversion there? > > But, why does it it store to memory at all? Yes, no conversion for this case, only adjust_address to TImode. mem/c:TD means a MEM cannot trap. Reason of store to memory: D.2914 is a local struct variable here, seems we need do some optimization to sink the D.2914.td0 and D.2914.td1 from BB3&BB4 to BB5 to avoid store/load on stack? Or if there already exists some pass in Gimple? Or should this be optimized after expander by some new pass like store sink? O2/pr70053.c.234t.optimized: D256_add_finite (_Decimal128 a, _Decimal128 b, _Decimal128 c) { struct TDx2_t D.2914; <bb 2> [local count: 1073741824]: if (b_4(D) == c_5(D)) goto <bb 3>; [34.00%] else goto <bb 4>; [66.00%] <bb 3> [local count: 365072224]: D.2914.td0 = c_5(D); D.2914.td1 = c_5(D); goto <bb 5>; [100.00%] <bb 4> [local count: 708669601]: D.2914.td0 = a_3(D); D.2914.td1 = b_4(D); <bb 5> [local count: 1073741824]: return D.2914; }