[X86] Take advantage of the lzcnt instruction on btver2 architectures when ORing...
authorPierre Gousseau <pierregousseau14@gmail.com>
Fri, 14 Oct 2016 16:41:38 +0000 (16:41 +0000)
committerPierre Gousseau <pierregousseau14@gmail.com>
Fri, 14 Oct 2016 16:41:38 +0000 (16:41 +0000)
commitb6d652adb5b12b7d1fc7e973a5afc019875cb547
treea8196cccb70b3ebb8eba63d17f04efa2f7f31fde
parent6d6eca5cdc995fdb8850fd5c79d1018893a44988
[X86] Take advantage of the lzcnt instruction on btver2 architectures when ORing comparisons to zero.

This change adds transformations such as:
  zext(or(setcc(eq, (cmp x, 0)), setcc(eq, (cmp y, 0))))
  To:
  srl(or(ctlz(x), ctlz(y)), log2(bitsize(x))
This optimisation is beneficial on Jaguar architecture only, where lzcnt has a good reciprocal throughput.
Other architectures such as Intel's Haswell/Broadwell or AMD's Bulldozer/PileDriver do not benefit from it.
For this reason the change also adds a "HasFastLZCNT" feature which gets enabled for Jaguar.

Differential Revision: https://reviews.llvm.org/D23446

llvm-svn: 284248
llvm/lib/Target/X86/X86.td
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/lib/Target/X86/X86ISelLowering.h
llvm/lib/Target/X86/X86InstrInfo.td
llvm/lib/Target/X86/X86Subtarget.cpp
llvm/lib/Target/X86/X86Subtarget.h
llvm/test/CodeGen/X86/lzcnt-zext-cmp.ll [new file with mode: 0644]