From: Stepan D. <stp...@na...> - 2013-07-17 12:13:55
|
Hi Borja. It should work for all other constraints as well. I don't like idea of fixing clang too. So we can just update getRegForInlineAsmConstraint method. I'd tried to compile avr-libc. Currently clang doesn't want to compile everything with -O0. While configure script tests everything with -O0. Do you have any ideas how to fix -O0 ? -Stepan. Borja Ferrer wrote: > Also, I guess doing only this for r is not enough, you can use > multibytes with other register constraints. > > > 2013/7/16 Borja Ferrer <bor...@gm... > <mailto:bor...@gm...>> > > What are you suggesting to do in clang? > > > 2013/7/16 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...>> > > Back to multibyte referenced. > > I've attached patch with this feature + unit-test. There is some > question though. > Currently, .c code: > int a; > void f() { > asm("instr %A0 %B0": : "r"(a)); > } > is transformed into IR below: > define void @f(i16 %a) { > entry: > call void asm sideeffect "instr ${0:A} ${0:B}", "r"(i16 %a) > ret void > } > To prevent the crash I had to fix getRegForInlineAsmConstraint, > I set it to return DREGS when it see i16 type or bigger. Though, > may be you want to fix clang and replace "r" constraint with > another one. > > -Stepan. > > Borja Ferrer wrote: > > Just remembered after hitting resend that this has to be > done always, > similarly like in SelectAddr(). However in this case it can > be done > unconditionally since imm is guaranteed to fit in 6bits, so > even if it > comes in a constant node of type i64 it's safe to truncate > it to i8. > > > 2013/7/15 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>> > > Hi Borja, > > > > + CanHandleRegImmOpt &= ImmNode != 0; > > + CanHandleRegImmOpt &= > ImmNode->getAPIntValue().____getZExtValue() < 64; > > You absolutely right here. Thanks. > > > > There's a piece of code i initially removed because > i found it > redundant: > > + if (ImmNode->getValueType(0) != MVT::i8) > > + { > > + Disp = CurDAG->getTargetConstant( > > + > ImmNode->getAPIntValue().____getZExtValue(), MVT::i8); > > + } > > + else > > + { > > + Disp = ImmOp; > > + } > > Initially did the same: just "Disp = ImmOp", and got > the crash. I > don't remember what crash says exactly. Currently, I'm > not able to > compile anything. What I had found out is that Disp (aka > displacement) should be i8 only. Our back-end just > don't expect > other types of displacements. > > -Stepan. > > Borja Ferrer wrote: > > Thanks! > > I've been cleaning a bit the code, and fixed a > possible crash here: > > + CanHandleRegImmOpt &= ImmNode != 0; > + CanHandleRegImmOpt &= > ImmNode->getAPIntValue().____getZExtValue() < 64; > > Since ImmNode comes from a dyncast, if it's NULL > the second line > would crash. > > > > There's a piece of code i initially removed because > i found it > redundant: > + if (ImmNode->getValueType(0) != MVT::i8) > + { > + Disp = CurDAG->getTargetConstant( > + > ImmNode->getAPIntValue().____getZExtValue(), MVT::i8); > + } > + else > + { > + Disp = ImmOp; > + } > > but without im getting crashes. Can you explain why > this happens > and is needed? > > > > 2013/7/15 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...> > <mailto:stp...@na... > <mailto:stp...@na...>> <mailto:stp...@na... > <mailto:stp...@na...> > <mailto:stp...@na... <mailto:stp...@na...>>>> > > > r269 > -Stepan > Borja Ferrer wrote: > > Ohhh this is a lot better, atleast fixing > patches > iteratively > brought us > to a nice solution :) > > If this patch passes all tests with the > machine > verifier enabled > then > feel free to commit it. I'll take a look > at the glue > operands > after this. > > > 2013/7/12 Stepan Dyatkovskiy > <stp...@na... <mailto:stp...@na...> > <mailto:stp...@na... <mailto:stp...@na...>> > <mailto:stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>> > <mailto:stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>> > > <mailto:stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>>>> > > > Hello Borja. > Seems I've made things much simpler. > Can't > understand why I > didn't > it in beginning. > > I moved everything into > SelectInlineAsmMemoryOperand hook. > #1: We don't need 'for' at all. Since it > implemented in > hook caller. > #2: This problem disappeared, see #1. > #4: The same. > #6: Still not sure about glues. I > just tried to > keep all > chains in > proper order. But you rather look at new > SelectInlineAsmMemoryOperand. > > > > One last thing, when you run the > regression tests, > enable locally the > > machine verifier to catch any > additional errors. To > enable it > > unconditionally search for the > command object > (i think it's > declared in > > codegen/passes.cpp as a cl::opt) > and turn it on by > default. When > you're > > doing your own tests you can > enable it passing > -verify-machineisntrs or > > something like that to llc. > OK. > > -Stepan. > > > Borja Ferrer wrote: > > Hello Stepan, > > 1) Wow, those are really big > conditions xD. > You could > split them > into > single conditions and use continues: > if (cond 1) continue; > if (cond 2) continue; > etc... > > instead of having a huge if() > that is quite > hard to read. > > 2) Yes I thought about that > aswell, that not all > constant nodes > are asm > flags, but the ARM backend does > this, so > either they > have a bug > there or > it's safe? > I prefer if you could move the > big condition > inside the > for() > into the > top of the loop, it makes the > for() quite > unreadable. > And adjust > there > the i variable as needed for each > suboperand > as you > mentioned > before. > > 4) Why do you say they handle > everything in the > SelectInlineAsm > method? > As far as i can see they only > handle one > specific case, > otherwise they > return NULL and let the default > behaviour do > the work. > > 6) Yes glues are a bit tricky, > dont worry > about them, I > will fix > them > when this gets commited. > > One last thing, when you run the > regression > tests, enable > locally the > machine verifier to catch any > additional > errors. To > enable it > unconditionally search for the > command object > (i think it's > declared in > codegen/passes.cpp as a cl::opt) > and turn it on by > default. When > you're > doing your own tests you can > enable it passing > -verify-machineisntrs or > something like that to llc. > > > > > > > > > > |