This is an archive of the discontinued LLVM Phabricator instance.

Convert some X86 blendv* intrinsics into IR.
ClosedPublic

Authored by filcab on May 21 2014, 12:19 AM.

Details

Summary

Implemented an InstCombine transformation that takes a blendv* intrinsic
call and translates it into an IR select, if the mask is constant.

This will eventually get lowered into blends with immediates if possible,
or pblendvb (with an option to further optimize if we can transform the
pblendvb into a blend+immediate instruction, depending on the selector).
It will also enable optimizations by the IR passes, which give up on
sight of the intrinsic.

Both the transformation and the lowering of its result to asm got shiny
new tests.

The transformation is a bit convoluted because of blendvp[sd]'s
definition:

Its mask is a floating point value! This forces us to convert it and get
the highest bit. I suppose this happened because the mask has type
__m128 in Intel's intrinsic and v4sf (for blendps) in gcc's builtin.

I will send an email to llvm-dev to discuss if we want to change this or
not.

Diff Detail

Repository
rL LLVM

Event Timeline

filcab updated this revision to Diff 9652.May 21 2014, 12:19 AM
filcab retitled this revision from to Convert some X86 blendv* intrinsics into IR..
filcab updated this object.
filcab edited the test plan for this revision. (Show Details)
filcab added reviewers: grosbach, delena, nadav.

+llvm-commits

filcab added a subscriber: Unknown Object (MLST).May 21 2014, 12:29 AM

Actually add llvm-commits.

filcab closed this revision.May 26 2014, 8:50 PM
filcab updated this revision to Diff 9819.

Closed by commit rL209643 (authored by @filcab).

nadav edited edge metadata.May 27 2014, 9:46 AM

Please commit the patch with the fix to the commuted argument order and a fix to the typo in the docs.

Thanks Filipe!