[PATCH][X86] Improved tablegen patters for matching TZCNT/LZCNT.
Nadav Rotem
nrotem at apple.com
Mon Dec 8 09:38:03 PST 2014
LGTM! Thanks Andrea.
> On Dec 8, 2014, at 9:36 AM, Andrea Di Biagio <andrea.dibiagio at gmail.com> wrote:
>
> Hi Nadav, Quentin (and all).
>
> This patch teaches ISel how to match a TZCNT/LZCNT from a conditional
> move if the condition code is equal to X86_COND_NE.
>
> Existing tablegen patterns only allowed to match a TZCNT/LZCNT from a
> X86cond with condition code equal to X86_COND_E. To avoid introducing
> extra rules, I added an 'ImmLeaf' definition to check if the condition
> code is COND_E or COND_NE.
>
> Example:
> ///
> unsigned foo(unsigned A) {
> unsigned bar = __builtin_clz(A);
> return !A ? 32 : bar;
> }
> ///
>
> Before, (on targets that feature LZCNT), we generated the following
> sub-optimal assembly:
> lzcntl %edi, %ecx
> movl $32, %eax
> cmovael %ecx, %eax
> retq
>
> Now we simply generate:
> lzcntl %edi, %eax
> retq
>
> Please let me know if ok to submit.
>
> Thanks,
> Andrea
> <patch-lzcnt-tzcnt.diff>
More information about the llvm-commits
mailing list