[llvm-dev] Instruction selection pattern for intrinsic returning llvm_any_ty
Mikael Holmén via llvm-dev
llvm-dev at lists.llvm.org
Wed Mar 30 02:58:32 PDT 2016
On 03/30/2016 11:51 AM, Matt Arsenault wrote:
>
>> On Mar 30, 2016, at 11:43, Mikael Holmén <mikael.holmen at ericsson.com> wrote:
>>
>> Hi,
>>
>> On 03/30/2016 11:38 AM, Matt Arsenault wrote:
>>>
>>>> On Mar 30, 2016, at 11:35, Mikael Holmén <mikael.holmen at ericsson.com
>>>> <mailto:mikael.holmen at ericsson.com>> wrote:
>>>>
>>>> i16 (divm16_pseudo …)
>>>>
>>>> stuff?
>>>>
>>>> I've tried
>>>> (i16, i16 (divm16_pseudo i16:$src1, i16:$src2)
>>>> and
>>>> ((i16, i16) (divm16_pseudo i16:$src1, i16:$src2)
>>>> and a few other variants without managing to get it through.
>>>>
>>>> Thanks again,
>>>> Mikael
>>>
>>> Are you trying to return multiple values?
>>
>> Yes, the intrisic returns a record
>>
>> %rec6 = type { i16, i16 }
>>
>> so at instructions selection the original call
>>
>> %_tmp3 = call %rec6 @llvm.phx.divm.u16.rec6(i16 %_tmp1, i16 %_tmp2)
>>
>> has been lowered to
>>
>> t6: i16,i16 = llvm.phx.divm.u16 TargetConstant:i16<3778>, t2, t4
>>
>> and the instruction I want to select also returns two values
>>
>> def divm16_pseudo : MyPseudoInst<
>> (outs aNh_0_7:$dst, aNh_0_7:$dst2),
>> (ins aNh_0_7:$src1, aNh_0_7:$src2)>;
>>
>> Both outs are i16.
>>
>> /Mikael
>>
>
> The intrinsic itself should define multiple IR outputs rather than using any ty.
But the intrinsic returns a record so in the input ll-file it is one result
%_tmp3 = call %rec6 @llvm.phx.divm.u16.rec6(i16 %_tmp1, i16 %_tmp2)
and then the return value struct is lowered to two i16:s by
SelectionDAGISel::SelectBasicBlock:
// Lower the instructions. If a call is emitted as a tail call, cease
emitting
// nodes for this block.
for (BasicBlock::const_iterator I = Begin; I != End &&
!SDB->HasTailCall; ++I)
SDB->visit(*I);
just prior to the selection.
> I’m also not sure if tablegen currently supports patterns with multiple results
Yes, me neither...
/Mikael
>
> -Matt
>
More information about the llvm-dev
mailing list