[CodeGenPrepare] Improved logic to speculate calls to cttz/ctlz.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Tue, 6 Jan 2015 17:41:18 +0000 (17:41 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Tue, 6 Jan 2015 17:41:18 +0000 (17:41 +0000)
commite46783d5b76964667f836ee6bc0315927b9ed7fd
tree971785870dff887113ece13dd7b0f2bfc419a3f0
parent46cb54c0fb39dd03fb30e3a1c36bdf88b31bca1e
[CodeGenPrepare] Improved logic to speculate calls to cttz/ctlz.

This patch improves the logic added at revision 224899 (see review D6728) that
teaches the backend when it is profitable to speculate calls to cttz/ctlz.

The original algorithm conservatively avoided speculating more than one
instruction from a basic block in a control flow grap modelling an if-statement.
In particular, the only allowed instruction (excluding the terminator) was a
call to cttz/ctlz. However, there are cases where we could be less conservative
and still be able to speculate a call to cttz/ctlz.

With this patch, CodeGenPrepare now tries to speculate a cttz/ctlz if the
result is zero extended/truncated in the same basic block, and the zext/trunc
instruction is "free" for the target.

Added new test cases to CodeGen/X86/cttz-ctlz.ll

Differential Revision: http://reviews.llvm.org/D6853

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225274 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/CodeGenPrepare.cpp
test/CodeGen/X86/cttz-ctlz.ll