[llvm-dev] LLVM IR intrinsics placeholder for strings [was Re: Back end with special loop instructions (using LLVM IR intrinsics)]
David Chisnall via llvm-dev
llvm-dev at lists.llvm.org
Tue Jun 14 02:12:58 PDT 2016
Hi,
Is there a reason that you can’t use inline assembly for this?
David
> On 13 Jun 2016, at 19:44, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> Hello.
> I come back to this thread. But I want to ask a slightly different question.
> Is there a way to have LLVM IR language intrinsics that are given at construction time a string that is written at assembly generation time as it is? (so, basically having placeholders of strings in LLVM that remain untouched until the end, including code generation time.)
>
> More exactly, I would like to give something LIKE this in a middle-tier pass (I haven't tried this code in LLVM):
> Value *instrinsicFunc = Intrinsic::getDeclaration(M,
> Intrinsic::my_intrinsic);
> myIRBuilder.CreateCall(repeatFunc,
> "string_that_llc_codegen_should_output_as_assembly");
> So my intrinsic would be accepting a general string which will be used at codegen to be output. I guess I would have to define it like this in a .td file:
> def int_my_intrinsic : Intrinsic<[], [string], []>;
>
>
> The other option that can work but is more complex without any benefit is to define several intrinsics in the .td files, one for EACH possible string:
> // To put in the Intrinsics_....td file:
> def int_my_intrinsic1 : Intrinsic<[], [], []>;
> ...
> def int_my_intrinsicN : Intrinsic<[], [], []>;
> // To put in the InstrInfo.td file something like:
> def STR_PLACEHOLDER1 : ImmediateInstruction< 0b111111,
> (outs),
> (ins),
> "string_that_llc_codegen_should_output_as_assembly1",
> [(int_my_intrinsic1)] >;
> def STR_PLACEHOLDER2 : ImmediateInstruction< 0b111110,
> (outs),
> (ins),
> "string_that_llc_codegen_should_output_as_assembly2",
> [(int_my_intrinsic2)] >;
>
>
> Best regards,
> Alex
>
> On 6/5/2016 5:21 PM, Alex Susu wrote:
>> Hello.
>> Hal, the source file you mention (lib/Target/PowerPC/PPCCTRLoops.cpp) makes use of
>> LLVM IR intrinsics, in this case defined at
>> [LLVM_repo]/llvm/include/llvm/IR/IntrinsicsPowerPC.td, such as:
>> // Intrinsics used to generate ctr-based loops. These should only be
>> // generated by the PowerPC backend!
>> def int_ppc_mtctr : Intrinsic<[], [llvm_anyint_ty], []>;
>> def int_ppc_is_decremented_ctr_nonzero : Intrinsic<[llvm_i1_ty], [], []>;
>>
>> And these intrinsics are instantiated in the LLVM program, for example with the
>> following code in PPCCTRLoops.cpp:
>> IRBuilder<> CountBuilder(Preheader->getTerminator());
>> Module *M = Preheader->getParent()->getParent();
>> Value *MTCTRFunc = Intrinsic::getDeclaration(M, Intrinsic::ppc_mtctr,CountType);
>> CountBuilder.CreateCall(MTCTRFunc, ECValue);
>>
>> I have defined also some intrinsics for my loop instructions in my file
>> Intrinsics_Connex.td: 1 intrinsic for REPEAT_X_TIMES and 1 for END_REPEAT.
>> /* following Intrinsics.td:
>> class Intrinsic<list<LLVMType> ret_types,
>> list<LLVMType> param_types = [],
>> list<IntrinsicProperty> properties = [],
>> string name = "">
>> */
>> def int_connex_repeat_x_times : Intrinsic<[], [], []>;
>> def int_connex_end_repeat : Intrinsic<[llvm_i1_ty], [], []>;
>> and added C++ code doing CreateCall() like the one above.
>>
>> I'm looking now at http://llvm.org/docs/ExtendingLLVM.html on how to specify the
>> instruction selection of this intrinsic. They write there:
>> "Once the intrinsic has been added to the system, you must add code generator
>> support for it. Generally you must do the following steps:
>> Add support to the .td file for the target(s) of your choice in lib/Target/*/*.td.
>> This is usually a matter of adding a pattern to the .td file that matches the
>> intrinsic, though it may obviously require adding the instructions you want to generate as
>> well. There are lots of examples in the PowerPC and X86 backend to follow."
>>
>> Then in my pass I create a call to the respective intrinsic:
>> /* See http://llvm.org/docs/doxygen/html/classllvm_1_1TargetIntrinsicInfo.html :
>> "Create or insert an LLVM Function declaration for an intrinsic, and return it."
>> * This creates a line in the LLVM program like: declare void
>> @llvm.connex.repeat.x.times() #2 .
>> * This line is required, otherwise llc will complain:
>> * <<error: use of undefined value '@llvm.connex.repeat.x.times'
>> call void @llvm.connex.repeat.x.times()>>
>> */
>> Value *repeatFunc = Intrinsic::getDeclaration(M,
>> Intrinsic::connex_repeat_x_times);
>>
>> // See http://llvm.org/docs/doxygen/html/classllvm_1_1IRBuilder.html
>> aB.CreateCall(repeatFunc); //, ECValue);
>>
>>
>> Then, in the back end, in InstrInfo.td I write:
>> let hasSideEffects = 1, isCodeGenOnly = 1 in {
>> //let Pattern = [(int_connex_repeat_x_times)] in
>> def REPEAT_X_TIMES : ImmediateInstruction< 0b111111,
>> (outs),
>> (ins),
>> "REPEAT_X_TIMES(1001)",
>> [(int_connex_repeat_x_times)] >;
>> }
>>
>>
>> Then, when I run opt and llc I obtain the expected behavior.
>>
>> Thank you,
>> Alex
>>
>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3719 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160614/6bf6fb9d/attachment-0001.bin>
More information about the llvm-dev
mailing list