From: Nicklas Bo J. <nbj...@gm...> - 2012-06-23 23:00:53
|
No, regular calls/and/xor/or works fine with 3335977107. On Sun, Jun 24, 2012 at 12:45 AM, Borja Ferrer <bor...@gm...>wrote: > This is very weird. Do you get this problem with other code when you use > this particular number (3335977107) like with a regular call or with an > and/xor/or? > > > 2012/6/24 Nicklas Bo Jensen <nbj...@gm...> > >> I also get the wrong result compiling that snippet... >> >> I have tried to revert the last patches, those that not needed for >> syncing with the llvm repo, same result. I have also updated llvm. Same >> result. >> >> Please let me know if you have any ideas what it could be :) >> >> On Sat, Jun 23, 2012 at 8:15 PM, Borja Ferrer <bor...@gm...>wrote: >> >>> Thanks for the patch there! >>> Very interesting because I'm not getting that error in icall at all, I'm >>> getting the second code snippet you pasted. >>> >>> With this code: >>> long icall(long (*x)(long)) >>> { >>> return x(0xC6D6F893)+5; >>> } >>> >>> I get: >>> movw r19:r18, r25:r24 >>> >>> ldi r22, 147 >>> ldi r23, 248 >>> ldi r24, 214 >>> ldi r25, 198 >>> movw r31:r30, r19:r18 >>> icall >>> subi r22, 251 >>> sbci r23, 255 >>> sbci r24, 255 >>> sbci r25, 255 >>> ret >>> >>> Can you re check to see what's going on? >>> >>> The comments in zext.ll and sext.ll are there for reference, they cover >>> the cases implemented in the pseudo instruction expander, that way we're >>> able to know what test covers each case. >>> Yes i have comments for the memory tests, I'll write them in the next >>> email. We should continue with memory operations, there are many more >>> things to test there that i'll list next time. For now we have to see >>> what's going on with that failing test. >>> >>> >>> >>> 2012/6/23 Nicklas Bo Jensen <nbj...@gm...> >>> >>>> I've committed the small change in Targets.cpp as you described. >>>> >>>> We are breaking a test now. In call.s, icall is loading arguments >>>> incorrectly now. >>>> >>>> The instruction %1 = call i32 %foo(i32 3335977107) >>>> gives: >>>> ldi r24, 147 >>>> ldi r25, 248 >>>> ldi r22, 214 >>>> ldi r23, 198 >>>> but should give: >>>> ldi r22, 147 >>>> ldi r23, 248 >>>> ldi r24, 214 >>>> ldi r25, 198 >>>> >>>> Also in your new sext.ll and zext.ll tests there are some comments >>>> above each function, should these be deleted? >>>> >>>> Last did you have any comments above the memory tests? >>>> >>>> Any preferences for what I should continue on? >>>> >>>> Thanks! >>>> >>>> >>>> On Tue, Jun 19, 2012 at 1:47 PM, Borja Ferrer <bor...@gm...>wrote: >>>> >>>>> Nicklas, in the meantime while the patch gets fixed you can manually >>>>> fix the error by adding that virtual BuiltinVaListKind >>>>> getBuiltinVaListKind() const function in the AVR class, in the above link >>>>> you have an example on how to do it. >>>>> >>>>> >>>>> 2012/6/19 Borja Ferrer <bor...@gm...> >>>>> >>>>>> John can you fix this issue, i have a different local copy of >>>>>> Targets.cpp that i don't want to change now with the patch in SVN. The fix >>>>>> is in this commit >>>>>> >>>>>> >>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?r1=158334&r2=158592&sortby=date&diff_format=h >>>>>> >>>>>> so updating the patch file will do it. >>>>>> >>>>>> >>>>>> 2012/6/18 Borja Ferrer <bor...@gm...> >>>>>> >>>>>>> You've done it right, the problem is here: >>>>>>> >>>>>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?r1=158334&r2=158592&sortby=date&diff_format=h >>>>>>> >>>>>>> it's caused by a recent API change that has broken out of tree >>>>>>> targets, i'll fix it soon. >>>>>>> >>>>>>> >>>>>>> 2012/6/18 Nicklas Bo Jensen <nbj...@gm...> >>>>>>> >>>>>>>> Yes of course. >>>>>>>> >>>>>>>> I'm having some problems compiling getting the following error: >>>>>>>> >>>>>>>> /avr-llvm/llvm/tools/clang/lib/Basic/Targets.cpp:4172:16: error: >>>>>>>> allocating an object of >>>>>>>> abstract class type 'AVRTargetInfo' >>>>>>>> return new AVRTargetInfo(T); >>>>>>>> ^ >>>>>>>> /avr-llvm/llvm/tools/clang/lib/Basic/../../include/clang/Basic/TargetInfo.h:406:29: >>>>>>>> note: >>>>>>>> unimplemented pure virtual method 'getBuiltinVaListKind' in >>>>>>>> 'AVRTargetInfo' >>>>>>>> virtual BuiltinVaListKind getBuiltinVaListKind() const = 0; >>>>>>>> ^ >>>>>>>> 1 error generated. >>>>>>>> >>>>>>>> I think I have applied the patches from svn correctly, at least did >>>>>>>> it a few times. I'm not stuck, but any ideas would be nice. >>>>>>>> >>>>>>>> On Mon, Jun 18, 2012 at 1:46 PM, Borja Ferrer < >>>>>>>> bor...@gm...> wrote: >>>>>>>> >>>>>>>>> Ok great! >>>>>>>>> >>>>>>>>> One more thing about the icall test, it can be further reduced >>>>>>>>> because: >>>>>>>>> %1 = alloca i32 (i32)* >>>>>>>>> store i32 (i32)* %foo, i32 (i32)** %1 >>>>>>>>> %2 = load i32 (i32)** %1 >>>>>>>>> >>>>>>>>> all that code is redundant, you're getting it because you've ran >>>>>>>>> it with -O0. If you think about it, you've allocated an i32 var in the >>>>>>>>> stack just to copy the value of foo but then it's not used at all. This >>>>>>>>> code is typical from unoptimized builds, so you can reduce it to something >>>>>>>>> like: >>>>>>>>> %3 = call i32 %foo(i32 3335977107) >>>>>>>>> %4 = add nsw i32 %3, 5 >>>>>>>>> >>>>>>>>> here you're using the foo incoming arg directly. >>>>>>>>> So as a recommendation, I would also run clang with -03 to get >>>>>>>>> optimized outputs that are usually clean of redundant allocas. >>>>>>>>> >>>>>>>>> >>>>>>>>> 2012/6/18 Nicklas Bo Jensen <nbj...@gm...> >>>>>>>>> >>>>>>>>>> I've committed the updated tests, excluding mem.ll awaiting your >>>>>>>>>> feedback on it (Besides not using immediate 0). >>>>>>>>>> >>>>>>>>>> On Mon, Jun 18, 2012 at 1:10 AM, Borja Ferrer < >>>>>>>>>> bor...@gm...> wrote: >>>>>>>>>> >>>>>>>>>>> return test: >>>>>>>>>>> 1) you can remove the @return8_reg() test since it's completely >>>>>>>>>>> commented out. >>>>>>>>>>> 2) in return64_arg2 you're always going to push r29:r28 as we >>>>>>>>>>> disccused in a previous email, so you can remove the SPLOW/HI vars, also SP >>>>>>>>>>> is going to be always the Y reg pair. Using Z here would be a bug. >>>>>>>>>>> 3) in return64_trunc same as in point 2. >>>>>>>>>>> 4) add a :TODO: test returning byval structs. >>>>>>>>>>> >>>>>>>>>>> call test: >>>>>>>>>>> 1) in the icall test, the code you're testing is a bit fragile. >>>>>>>>>>> Basically if you run it with -O3 it will get optimized away and you wont >>>>>>>>>>> get an icall. Instead, generate the icall using a function pointer from an >>>>>>>>>>> incoming argument. >>>>>>>>>>> 2) do the same as in 1 but passing an argument to the icall (any >>>>>>>>>>> data type will do). (remember i had to fix this last week, so testing it is >>>>>>>>>>> imporant in case it breaks again in the future) >>>>>>>>>>> 3) do the same as in 1 using the return value of the icall (any >>>>>>>>>>> data type will do). >>>>>>>>>>> >>>>>>>>>>> One general thing concerning all written tests up to now, can >>>>>>>>>>> you change all imm values (including the ones already commited), so that >>>>>>>>>>> you don't test things like "ldi reg, 0". So for a 16bit type instead of >>>>>>>>>>> using a 5 use a value were none of the registers are zero like 0xABCD >>>>>>>>>>> instead of 0x0005 where the hi part is 0. In the future we'll add an >>>>>>>>>>> optimization that relies on r0 having a 0, so many tests will break because >>>>>>>>>>> of this since we could get a mov reg, r0 instead of an ldi. >>>>>>>>>>> >>>>>>>>>>> I'll reply tomorrow with comments about the memory tests. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 2012/6/17 Borja Ferrer <bor...@gm...> >>>>>>>>>>> >>>>>>>>>>>> Thanks, I'm reviewing them now >>>>>>>>>>>> >>>>>>>>>>>> El viernes, 15 de junio de 2012, Nicklas Bo Jensen escribió: >>>>>>>>>>>> >>>>>>>>>>>> Hi, >>>>>>>>>>>>> >>>>>>>>>>>>> Please review these tests. >>>>>>>>>>>>> >>>>>>>>>>>>> Any comments? >>>>>>>>>>>>> >>>>>>>>>>>>> On Wed, Jun 6, 2012 at 2:46 AM, Borja Ferrer < >>>>>>>>>>>>> bor...@gm...> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Fixed in SVN, let me know any other issues. Thanks for >>>>>>>>>>>>> reporting it! >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2012/6/5 Borja Ferrer <bor...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>>> Something has changed in llvm or maybe it never worked, can't >>>>>>>>>>>>> remember, but I'm unable to pass arguments through an icall, I'm >>>>>>>>>>>>> investigating for a fix. In the meantime you can disable that assertion >>>>>>>>>>>>> until I come with a proper fix. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2012/6/4 Borja Ferrer <bor...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>>> I'll take a look to it shortly. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2012/6/3 Nicklas Bo Jensen <nbj...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>>> Ok. Sure your explanations are really clear :) Thanks! >>>>>>>>>>>>> >>>>>>>>>>>>> I'm having some trouble testing icall, which i'm doing using a >>>>>>>>>>>>> function pointer. I've attached a small C example, the corresponding >>>>>>>>>>>>> cleaned up llvm code and the output of running llc on it. There is a failed >>>>>>>>>>>>> assertion. >>>>>>>>>>>>> >>>>>>>>>>>>> Any thoughts? >>>>>>>>>>>>> >>>>>>>>>>>>> On Fri, Jun 1, 2012 at 7:04 PM, Borja Ferrer < >>>>>>>>>>>>> bor...@gm...> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Just checking for the sub instructions that allocate and >>>>>>>>>>>>> restore the stack should be enough, also check that the allocated size is >>>>>>>>>>>>> correct, the rest of stuff can be omitted. I would also check the whole >>>>>>>>>>>>> sequence including the interrupt instructions in a single test, no need to >>>>>>>>>>>>> do it everywhere. When we get to test allocas we'll have to test for >>>>>>>>>>>>> prologue and epilogue code, which is very similar to the one you're seeing >>>>>>>>>>>>> here. >>>>>>>>>>>>> About testing push and pops: no need to test that, it's part >>>>>>>>>>>>> of the prologue/epilogue of the function, so it's not related to calls, >>>>>>>>>>>>> also, that is handled by llvm so I wouldn't test that at all. Remember to >>>>>>>>>>>>> test the icall instruction, as far as I remember it needs to be tweaked >>>>>>>>>>>>> because for now it doesn't save the registers between calls like regular >>>>>>>>>>>>> calls do. >>>>>>>>>>>>> >>>>>>>>>>>>> Ok, memory instructions, most of the instructions you see in >>>>>>>>>>>>> that file that end up with a "w" are pseudo instructions (excluding >>>>>>>>>>>>> sbiw/adiw, movw or other real ones that work with 16bit data) meaning that >>>>>>>>>>>>> they dont get into the final assembly since they don't exist in the >>>>>>>>>>>>> instruction set. It's a trick to make llvm think they're supported >>>>>>>>>>>>> instructions that way, movws and the real 16bit insts get generated, >>>>>>>>>>>>> however these pseudo ops get expanded into 8bit ops, that's why you wont >>>>>>>>>>>>> never see those in the final assembly, and if you ever see one then it's a >>>>>>>>>>>>> bug. So if you do an and with 16bit types, llvm selects the andw pseudo op, >>>>>>>>>>>>> and a later pass expands it into two real 8bit and insts that are supported >>>>>>>>>>>>> by the avr inst set, dont' know if this makes things clear. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 2012/5/31 Nicklas Bo Jensen <nbj...@gm...> >>>>>>>>>>>>> >>>>>>>>>>>>> Checking for stack allocation and restore could be something >>>>>>>>>>>>> like: >>>>>>>>>>>>> >>>>>>>>>>>>> ; CHECK: in [[REG1:r[0-9]+]], 61 >>>>>>>>>>>>> ; CHECK: in [[REG2:r[0-9]+]], 62 >>>>>>>>>>>>> ; CHECK: sbiw [[REG2]]:[[REG1]], 4 >>>>>>>>>>>>> ; CHECK: out 62, [[REG2]] >>>>>>>>>>>>> ; CHECK: out 61, [[REG1]] >>>>>>>>>>>>> ; ... other tests >>>>>>>>>>>>> ; CHECK: in [[REG1:r[0-9]+]], 61 >>>>>>>>>>>>> ; CHECK: in [[REG2:r[0-9]+]], 62 >>>>>>>>>>>>> ; CHECK: subi [[REG1]], 254 >>>>>>>>>>>>> ; CHECK: sbci [[REG2]], 255 >>>>>>>>>>>>> ; CHECK: out 62, [[REG2]] >>>>>>>>>>>>> ; CHECK: out 61, [[REG1]] >>>>>>>>>>>>> >>>>>>>>>>>>> Is it something like that you have in mind? Should disabling >>>>>>>>>>>>> and enabling interupts (cli+writeback of SREG) also be tested? >>>>>>>>>>>>> >>>>>>>>>>>>> Checkin >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> > |