On Wed, May 05, 2021 at 01:45:29PM +0200, Marc Glisse wrote: > On Tue, 4 May 2021, Jakub Jelinek via Gcc-patches wrote: > > > 2) the pr94589-2.C testcase should be matching just 12 times each, but runs > > into operator>=(strong_ordering, unspecified) being defined as > > (_M_value&1)==_M_value > > rather than _M_value>=0. When not honoring NaNs, the 2 case should be > > unreachable and so (_M_value&1)==_M_value is then equivalent to _M_value>=0, > > but is not a single use but two uses. I'll need to pattern match that case > > specially. > > Somewhere in RTL (_M_value&1)==_M_value is turned into (_M_value&-2)==0, > that could be worth doing already in GIMPLE.
Apparently it is /* Simplify eq/ne (and/ior x y) x/y) for targets with a BICS instruction or constant folding if x/y is a constant. */ if ((code == EQ || code == NE) && (op0code == AND || op0code == IOR) && !side_effects_p (op1) && op1 != CONST0_RTX (cmp_mode)) { /* Both (eq/ne (and x y) x) and (eq/ne (ior x y) y) simplify to (eq/ne (and (not y) x) 0). */ ... /* Both (eq/ne (and x y) y) and (eq/ne (ior x y) x) simplify to (eq/ne (and (not x) y) 0). */ Yes, doing that on GIMPLE for the case where the not argument is constant would simplify the phiopt follow-up (it would be single imm use then). Jakub