[PATCH] ARM FastISel integer sext/zext improvements
Eric Christopher
echristo at gmail.com
Wed Jun 5 11:29:26 PDT 2013
This will work, some comments on the patch itself:
+ using namespace ARM;
We don't really do this anywhere else...
+ static const uint8_t isSingleInstrTbl[3][2][2][2] = {
+ static const TargetRegisterClass *RCTbl[2][2] = {
+ static const struct {
Large explanatory block comments before each of these tables please.
+ unsigned SrcBits = SrcVT.getSizeInBits();
+ unsigned DestBits = DestVT.getSizeInBits();
+ assert(SrcBits < DestBits);
+ assert(DestBits == 32 || DestBits == 16 || DestBits == 8);
+ assert(SrcBits == 16 || SrcBits == 8 || SrcBits == 1);
+ unsigned Bitness = countTrailingZeros(SrcBits) >> 1; // {1,8,16}=>{0,1,2}
+ assert(Bitness < 3);
+ bool hasV6Ops = Subtarget->hasV6Ops();
+ bool isSingleInstr = isSingleInstrTbl[Bitness][isThumb2][hasV6Ops][isZExt];
+ const TargetRegisterClass *RC = RCTbl[isThumb2][isSingleInstr];
+ unsigned Opc = OpcTbl[isSingleInstr][isThumb2][Bitness].Opc[isZExt];
+ assert(KILL != Opc && "Invalid table entry");
+ unsigned Imm = OpcTbl[isSingleInstr][isThumb2][Bitness].Imm[isZExt];
+ unsigned hasS = OpcTbl[isSingleInstr][isThumb2][Bitness].hasS[isZExt];
+ bool setsCPSR = &tGPRRegClass == RC; // Always on 16-bit Thumb instructions.
+ unsigned LSLOpc = isThumb2 ? tLSLri : LSLi;
+ unsigned ResultReg;
Is your return key broken? ;)
Anyhow, some spacing here would be nice along with with a comment on
each of the asserts (or even text in the assert that says what it's
checking for ala the other asserts in llvm).
+ for (unsigned Instr = 0; Instr != (isSingleInstr ? 1 : 2); ++Instr) {
Brief comment here as well.
Thanks!
-eric
On Tue, Jun 4, 2013 at 6:06 PM, JF Bastien <jfb at google.com> wrote:
> My recent ARM FastISel patch exposed this bug:
> http://llvm.org/bugs/show_bug.cgi?id=16178
> The root cause is that it can't select integer sext/zext pre-ARMv6 and
> asserts out.
>
> The current integer sext/zext code doesn't handle other cases gracefully
> either, so this patch makes it handle all sext and zext from i1/i8/i16 to
> i8/i16/i32, with and without ARMv6, both in Thumb and ARM mode. This should
> fix the bug as well as make FastISel faster because it bails to SelectionDAG
> less often. See fastisel-ext.patch for this.
>
> fastisel-ext-tests.patch changes current tests to always use reg-imm AND for
> 8-bit zext instead of UXTB. This simplifies code since it is supported on
> ARMv4t and later, and at least on A15 both should perform exactly the same
> (both have exec 1 uop 1, type I).
>
> 2013-05-31-char-shift-crash.ll is a bitcode version of the above bug 16178
> repro.
>
> fast-isel-ext.ll tests all sext/zext combinations that ARM FastISel should
> now handle.
>
> Note that my ARM FastISel enabling patch was reverted due to a separate
> failure when dealing with MCJIT, I'll fix this second failure and then turn
> FastISel on again for non-iOS ARM targets.
>
> I've tested "make check-all" on my x86 box, and "lnt test-suite" on A15
> hardware.
More information about the llvm-commits
mailing list