Handle cmp(and(x, y), 0)
authorMike Danes <onemihaid@hotmail.com>
Mon, 19 Dec 2016 21:15:01 +0000 (23:15 +0200)
committerMike Danes <onemihaid@hotmail.com>
Tue, 17 Jan 2017 18:26:27 +0000 (20:26 +0200)
commitced5156816df1ae68bca23a847fb2d9d544515fa
tree229e1e8972cbf4b3c206c595e86ce39239d24529
parent5b9e6b24f1e9fd24552ca887a65a404459ec76da
Handle cmp(and(x, y), 0)

There's no need to require y to be a constant. This restriction was an artifact of the old implementation using containment in lower/codegen to recognize this pattern.

This results in a couple of hundred AND instructions being converted to TEST. This is preferable as TEST can be macro-fused with the conditional branch that may follow it.

Occasionally this also saves a MOV because TEST doesn't update its first operand like AND does.

FX diff shows a 118 bytes improvement without any regressions.

Commit migrated from https://github.com/dotnet/coreclr/commit/811ce7e6dea304bfc71df468f3ebbb3ecef30f08
src/coreclr/src/jit/lower.cpp
src/coreclr/src/jit/lowerxarch.cpp