Defer some shl transforms to DAGCombine.

The shl instruction is used to represent multiplication by a constant

power of two as well as bitwise left shifts. Some InstCombine

transformations would turn an shl instruction into a bit mask operation,

making it difficult for later analysis passes to recognize the

constsnt multiplication.

Disable those shl transformations, deferring them to DAGCombine time.

An 'shl X, C' instruction is now treated mostly the same was as 'mul X, C'.

These transformations are deferred:

(X >>? C) << C --> X & (-1 << C) (When X >> C has multiple uses) (X >>? C1) << C2 --> X << (C2-C1) & (-1 << C2) (When C2 > C1) (X >>? C1) << C2 --> X >>? (C1-C2) & (-1 << C2) (When C1 > C2)

The corresponding exact transformations are preserved, just like

div-exact + mul:

(X >>?,exact C) << C --> X (X >>?,exact C1) << C2 --> X << (C2-C1) (X >>?,exact C1) << C2 --> X >>?,exact (C1-C2)

The disabled transformations could also prevent the instruction selector

from recognizing rotate patterns in hash functions and cryptographic

primitives. I have a test case for that, but it is too fragile.