https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63302
--- Comment #10 from Zhenqiang Chen <zhenqiang.chen at arm dot com> --- (In reply to dave.anglin from comment #8) > On 28-Sep-14, at 10:34 AM, dave.anglin at bell dot net wrote: > > > This is what I see on the trunk, but 4.9 is wrong. Possibly, there is > > a transformation > > after optimize_range_tests_diff where things go wrong on 4.9. > > It seems the difference actually occurs in reassoc1. > > 4.9: > > <bb 2>: > x_2 = ival_1(D) & -2147481601; > _3 = x_2 == 0; > _8 = x_2 & 2147483647; > _9 = _8 == 0; > _4 = x_2 == -2147483648; > _5 = _9; > _6 = (int) _5; > return _6; This is not optimized by my patch: optimize_range_tests_diff > trunk: > > <bb 2>: > x_2 = ival_1(D) & -2147481601; > _3 = x_2 == 0; > _8 = x_2 + 2147483648; > _9 = _8 & -2147483649; > _10 = _9 == 0; > _4 = x_2 == -2147483648; > _5 = _10; > _6 = (int) _5; > return _6; This is optimized by the patch. optimize_range_tests_diff is the only change I added for the patch. Others were just reorganization. Can you show more detail dumps with -fdump-tree-reassoc1-details? Thanks! -Zhenqiang