https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80072
--- Comment #4 from rguenther at suse dot de <rguenther at suse dot de> --- On Wed, 22 Mar 2017, jakub at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80072 > > --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > This is quite impossible to reduce, after 16 hours of creduce I've reduced 22% > from the original size. > I've tried to build a testcase based on what I see in the reassociation, but > void bar (int); > unsigned long int vx, vx2, vx3; > > unsigned long int > foo (unsigned long int _55062, unsigned long int _55063, > unsigned long int _55172, unsigned long int _55171, > int u, int v, int w, int x) > { > unsigned long int _55173 = _55171 * _55172; > _Bool t1, t2; > if (u == 35) > t1 = 1; > else if (u == 27) > t1 = 0; > else if (v == 12) > { > bar (4); > t1 = 1; > } > else if (v == 24) > { > bar (5); > t1 = 1; > } > else > { > bar (6); > t1 = 1; > } > unsigned long int _55001 = vx2; > unsigned long int _55053 = t1; > unsigned long int _55054 = _55001 * _55053; > unsigned long int _55064 = _55062 * _55063; > unsigned long int _55060 = vx; > unsigned long int _55065 = -_55064; > unsigned long int _55066 = _55060 * _55065; > unsigned long int _55067 = _55054 * _55066; > if (w == 35) > t2 = 1; > else if (w == 27) > t2 = 0; > else if (x == 12) > { > bar (4); > t2 = 1; > } > else if (x == 24) > { > bar (5); > t2 = 1; > } > else > { > bar (6); > t2 = 1; > } > unsigned long int _55119 = vx3; > unsigned long int _55225 = t2; > unsigned long int _55226 = _55173 * _55225; > unsigned long int _55227 = _55119 * _55226; > unsigned long int _55228 = _55067 * _55227; > unsigned long int _55229 = _55228 * 9323891652267032265ULL; > return _55229; > } > > has different ranks and so while it gives the same ops order after > linearize_expr_tree, the following sorting changes it. Did you try -fdump-<pass-before-reassoc>-gimple and create a gimple testcase out of the affected function IL?