On Thu, Apr 13, 2017 at 11:16:08AM +0000, Wilco Dijkstra wrote: > >On Wed, Apr 12, 2017 at 09:29:55AM +0000, Sudi Das wrote: > > > Hi all > > > > > > 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? > > Yes assuming left and right shift have the same performance. > > > 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. > > Most targets can create the constant cheaply. Targets that can't would need 2
No. Some constants sometimes even 7 instructions (e.g. sparc64; not talking in particular about 1ULL << 63 constant), or have one instruction that is more expensive than normal small constant load. Compare say x86_64 movl/movq vs. movabsq, I think the latter has 3 times longer latency on many CPUs. So no, I think it isn't an unconditional win. Jakub