On Wed, 20 Nov 2024, Jakub Jelinek wrote: > Hi! > > When working on the PR117612 fix, I've noticed a pasto in > tree-ssa-phiopt.cc (spaceship_replacement). > The code is > if (absu_hwi (tree_to_shwi (arg2)) != 1) > return false; > if (e1->flags & EDGE_TRUE_VALUE) > { > if (tree_to_shwi (arg0) != 2 > || absu_hwi (tree_to_shwi (arg1)) != 1 > || wi::to_widest (arg1) == wi::to_widest (arg2)) > return false; > } > else if (tree_to_shwi (arg1) != 2 > || absu_hwi (tree_to_shwi (arg0)) != 1 > || wi::to_widest (arg0) == wi::to_widest (arg1)) > return false; > where arg{0,1,2,3} are PHI args and wants to ensure that if e1 is a > true edge, then arg0 is 2 and one of arg{1,2} is -1 and one is 1, > otherwise arg1 is 2 and one of arg{0,2} is -1 and one is 1. > But due to pasto in the latte case doesn't verify that arg0 > is different from arg2, it could be both -1 or both 1 and we wouldn't > punt. The wi::to_widest (arg0) == wi::to_widest (arg1) test > is always false when we've made sure in the earlier conditions that > arg1 is 2 and arg0 is -1 or 1, so never 2. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. > 2024-11-20 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/94589 > PR tree-optimization/117612 > * tree-ssa-phiopt.cc (spaceship_replacement): Fix up > a pasto in check when arg1 is 2. > > --- gcc/tree-ssa-phiopt.cc.jj 2024-11-19 20:30:56.311541135 +0100 > +++ gcc/tree-ssa-phiopt.cc 2024-11-20 12:37:41.594315207 +0100 > @@ -2690,7 +2692,7 @@ spaceship_replacement (basic_block cond_ > } > else if (tree_to_shwi (arg1) != 2 > || absu_hwi (tree_to_shwi (arg0)) != 1 > - || wi::to_widest (arg0) == wi::to_widest (arg1)) > + || wi::to_widest (arg0) == wi::to_widest (arg2)) > return false; > switch (cmp2) > { > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)