Hi, On Wed, Apr 12, 2017 at 07:06:38PM +0200, Jakub Jelinek wrote: > On Wed, Apr 12, 2017 at 09:29:55AM +0000, Sudi Das wrote: > > This is a fix for PR 80131 > > Currently the code A << (B - C) is not simplified. > > However at least a more specific case of 1U << (C -x) where C = > > precision(type) - 1 can be simplified to (1 << C) >> x. > > Is that always a win though? > Some constants have higher costs than others on various targets, some > significantly higher. This change might be beneficial only > if if C is as expensive as 1, then you get rid of a one (typically cheap) > operation. > Which makes me wonder whether this should be done at GIMPLE time and not > at RTL time (expansion or combine etc.) when one can compare the RTX costs.
Yeah, either combine or simplify-rtx I'd say. The transform A << (B - C) ---> (A << B) >> C only works if A << B does not overflow but A << (B + 1) does (and then always does work afaics). Or if we know C is non-negative and A << B does not overflow. So realistically A and B need to be constant. > Or do this at match.pd as canonicalization and then have RTL transformation > to rewrite such (1U << C) >> X as 1U << (C - X) if the latter is faster (or > shorter). The inverse transform only works for A=1, not for the more general case. Segher