Technically I don't need C/C++ code for it. I'm not really very good at writing LLVM assembly code by hand (but I should be - lol ). I'm working on fast-isel and I want to have executable tests for all of this and not just make check tests. It's easier for me to do that in C/C++ and then save the .ll and morph it into a make check test. I'm going through the fast-isel tests for x86 now and adapting them for Mips. (will do the same for AArch64 and other ports). I want an executable variant for all of them. On 09/29/2014 03:11 PM, Duncan P. N. Exon Smith wrote:>> On Sep 29, 2014, at 2:29 PM, reed kotler <rkotler at mips.com> wrote: >> >> Thanks. >> >> So what about a fragment like this: (taken from fast-isel.ll in X86 ) >> >> define void @ptrtoint_i1(i8* %p, i1* %q) nounwind { >> %t = ptrtoint i8* %p to i1 >> store i1 %t, i1* %q >> ret void >> } > Intuitively, this looks like: > > void ptrtoint_i1(char *p, bool *q) { *q = (bool)p; } > > However, `q` needs to be addressable in C/C++, so it's left as an `i8`. > > `git log` suggests this particular testcase evolved incrementally out > of hand-written IR. > > Why do you need C/C++ code for it? Just interested? > >> TIA. >> >> On 09/29/2014 02:16 PM, Duncan P. N. Exon Smith wrote: >>>> On Sep 29, 2014, at 1:51 PM, reed kotler <rkotler at mips.com> wrote: >>>> >>>> What kind of C or C++ code will emit a "ptrtoint" op? >>> This C code: >>> >>> long ptrtoint(void *p) { return (long)p; } >>> >>> gives: >>> >>> define i64 @ptrtoint(i8* %p) { >>> %1 = ptrtoint i8* %p to i64 >>> ret i64 %1 >>> } >>> >>> >>>> Also, what causes i1 to be emitted? >>> This C++ code: >>> >>> bool i1() { return false; } >>> >>> gives: >>> >>> define zeroext i1 @_Z2i1v() { >>> ret i1 false >>> } >>> >>> >>>> Tia. >>>> >>>> Reed >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
If I wanted to call this function that they generated by hand, from C or C+ code, how would that be done? if have seen cases where a real boolean gets generated but it was something fairly involved. is a boolean and a char supposed to occupy the same amount of storage? is this prototype going to work in general: void ptrtoint_i1(char *p, bool *q) TIA. Reed On 09/29/2014 03:15 PM, reed kotler wrote:> Technically I don't need C/C++ code for it. > > I'm not really very good at writing LLVM assembly code by hand > (but I should be - lol ). > > I'm working on fast-isel and I want to have executable tests for all of > this > and not just make check tests. > > It's easier for me to do that in C/C++ and then save the .ll and morph > it into > a make check test. > > I'm going through the fast-isel tests for x86 now and adapting them for > Mips. > (will do the same for AArch64 and other ports). > > I want an executable variant for all of them. > > On 09/29/2014 03:11 PM, Duncan P. N. Exon Smith wrote: >>> On Sep 29, 2014, at 2:29 PM, reed kotler <rkotler at mips.com> wrote: >>> >>> Thanks. >>> >>> So what about a fragment like this: (taken from fast-isel.ll in X86 ) >>> >>> define void @ptrtoint_i1(i8* %p, i1* %q) nounwind { >>> %t = ptrtoint i8* %p to i1 >>> store i1 %t, i1* %q >>> ret void >>> } >> Intuitively, this looks like: >> >> void ptrtoint_i1(char *p, bool *q) { *q = (bool)p; } >> >> However, `q` needs to be addressable in C/C++, so it's left as an `i8`. >> >> `git log` suggests this particular testcase evolved incrementally out >> of hand-written IR. >> >> Why do you need C/C++ code for it? Just interested? >> >>> TIA. >>> >>> On 09/29/2014 02:16 PM, Duncan P. N. Exon Smith wrote: >>>>> On Sep 29, 2014, at 1:51 PM, reed kotler <rkotler at mips.com> wrote: >>>>> >>>>> What kind of C or C++ code will emit a "ptrtoint" op? >>>> This C code: >>>> >>>> long ptrtoint(void *p) { return (long)p; } >>>> >>>> gives: >>>> >>>> define i64 @ptrtoint(i8* %p) { >>>> %1 = ptrtoint i8* %p to i64 >>>> ret i64 %1 >>>> } >>>> >>>> >>>>> Also, what causes i1 to be emitted? >>>> This C++ code: >>>> >>>> bool i1() { return false; } >>>> >>>> gives: >>>> >>>> define zeroext i1 @_Z2i1v() { >>>> ret i1 false >>>> } >>>> >>>> >>>>> Tia. >>>>> >>>>> Reed >>>>> _______________________________________________ >>>>> LLVM Developers mailing list >>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
If you can't make an executable test from C or C++ code then how do you know something works. Just by examination of the .s? On 09/30/2014 03:18 PM, Reed Kotler wrote:> If I wanted to call this function that they generated by hand, from C or > C+ code, how would that be done? > > if have seen cases where a real boolean gets generated but it was > something fairly involved. > > is a boolean and a char supposed to occupy the same amount of storage? > > is this prototype going to work in general: > > void ptrtoint_i1(char *p, bool *q) > > TIA. > > Reed > > On 09/29/2014 03:15 PM, reed kotler wrote: >> Technically I don't need C/C++ code for it. >> >> I'm not really very good at writing LLVM assembly code by hand >> (but I should be - lol ). >> >> I'm working on fast-isel and I want to have executable tests for all of >> this >> and not just make check tests. >> >> It's easier for me to do that in C/C++ and then save the .ll and morph >> it into >> a make check test. >> >> I'm going through the fast-isel tests for x86 now and adapting them for >> Mips. >> (will do the same for AArch64 and other ports). >> >> I want an executable variant for all of them. >> >> On 09/29/2014 03:11 PM, Duncan P. N. Exon Smith wrote: >>>> On Sep 29, 2014, at 2:29 PM, reed kotler <rkotler at mips.com> wrote: >>>> >>>> Thanks. >>>> >>>> So what about a fragment like this: (taken from fast-isel.ll in X86 ) >>>> >>>> define void @ptrtoint_i1(i8* %p, i1* %q) nounwind { >>>> %t = ptrtoint i8* %p to i1 >>>> store i1 %t, i1* %q >>>> ret void >>>> } >>> Intuitively, this looks like: >>> >>> void ptrtoint_i1(char *p, bool *q) { *q = (bool)p; } >>> >>> However, `q` needs to be addressable in C/C++, so it's left as an `i8`. >>> >>> `git log` suggests this particular testcase evolved incrementally out >>> of hand-written IR. >>> >>> Why do you need C/C++ code for it? Just interested? >>> >>>> TIA. >>>> >>>> On 09/29/2014 02:16 PM, Duncan P. N. Exon Smith wrote: >>>>>> On Sep 29, 2014, at 1:51 PM, reed kotler <rkotler at mips.com> wrote: >>>>>> >>>>>> What kind of C or C++ code will emit a "ptrtoint" op? >>>>> This C code: >>>>> >>>>> long ptrtoint(void *p) { return (long)p; } >>>>> >>>>> gives: >>>>> >>>>> define i64 @ptrtoint(i8* %p) { >>>>> %1 = ptrtoint i8* %p to i64 >>>>> ret i64 %1 >>>>> } >>>>> >>>>> >>>>>> Also, what causes i1 to be emitted? >>>>> This C++ code: >>>>> >>>>> bool i1() { return false; } >>>>> >>>>> gives: >>>>> >>>>> define zeroext i1 @_Z2i1v() { >>>>> ret i1 false >>>>> } >>>>> >>>>> >>>>>> Tia. >>>>>> >>>>>> Reed >>>>>> _______________________________________________ >>>>>> LLVM Developers mailing list >>>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev