[LLVMdev] Predicated Vector Operations
Arnold Schwaighofer
aschwaighofer at apple.com
Fri May 10 10:14:48 PDT 2013
On May 10, 2013, at 11:53 AM, dag at cray.com wrote:
> Jeff Bush <jeffbush001 at gmail.com> writes:
>
>> Ah, I think I get it now. This was mentioned earlier in the thread,
>> but it didn't click at the time. It sounds like I can do instruction
>> selection with a pattern like (omitting selection of the sources):
>>
>> let Constraints = "$dst = $oldvalue" in {
>> def MASKEDARITH : MyInstruction<
>> (outs VectorReg:$dst),
>> (ins MaskReg:$mask, VectorReg:$src1, VectorReg:$src2,
>> VectorReg:$oldvalue),
>> "add $dst {$mask}, $src1, $src2",
>> [(set v16i32:$dst, (vselect v16i1:$mask, (add v16i32:$src1,
>> v16i32:$src2), v16i32:$oldvalue))]>;
>> }
>
> Ok, but where does $oldvalue come from? That is the trickty part as far
> as I can see and is why this isn't quite the same as handling
> two-address instructions.
>From the semantics of your program?
%tx = select %mask, %x, <0.0, 0.0, 0.0 ...>
%ty = select %mask, %y, <0.0, 0.0, 0.0 ...>
%sum = fadd %tx, %ty
%newvalue = select %mask, %sum, %oldvalue << From here?
If you had a designated predicated instruction you would have the same issue. The %oldvalue has to come from somewhere (or be undefined).
%oldval = ... | undef
%newvalue = predicated_fadd %mask, %left, %right, %oldval
I guess, I don’t understand your question.
Instcombine might remove the select %mask, %sum, undef but that is another issue ...
More information about the llvm-dev
mailing list