[PATCH] Add bulk of returning of values to Mips fast-isel

reed kotler rkotler at mips.com
Tue Jan 13 14:03:39 PST 2015


I think that the 8/16 return values are dealt with in a later patch.

I will take a look though. This patch is old and I'm 10 patches ahead 
now so i have to remember
the issues.

Reed


On 01/13/2015 12:43 PM, Daniel Sanders wrote:
> Sorry for being so slow to review this one. I think this patch is heading in the right direction but there's something strange about the i8/i16 cases that I'd like you to explain. Details inline.
>
> It also rejects quite a lot of the cases (including some easy ones like any-extend) but we can expand on it in follow up patches.
>
>
> ================
> Comment at: lib/Target/Mips/MipsFastISel.cpp:994-996
> @@ +993,5 @@
> +
> +  if (F.isVarArg())
> +      return false;
> +
> +  // Build a list of return value registers.
> ----------------
> Why is this needed? Variable argument lists don't have any effect on the handling of return values.
>
> ================
> Comment at: lib/Target/Mips/MipsFastISel.cpp:1006
> @@ +1005,3 @@
> +    SmallVector<CCValAssign, 16> ValLocs;
> +    CCState CCInfo(CC, F.isVarArg(), *FuncInfo.MF, ValLocs, I->getContext());
> +    CCAssignFn *RetCC = RetCC_Mips;
> ----------------
> This ought to be a MipsCCState object
>
> ================
> Comment at: lib/Target/Mips/MipsFastISel.cpp:1017-1020
> @@ +1016,6 @@
> +
> +    // Don't bother handling odd stuff for now.
> +    if ((VA.getLocInfo() != CCValAssign::Full) &&
> +        (VA.getLocInfo() != CCValAssign::BCvt))
> +      return false;
> +
> ----------------
> Something seems odd here. This condition should be rejecting the rets() and retc() cases from the test case since they should have CCValAssign::SExt. However, the test case is using -fast-isel-abort.
>
> I see that RetCC_O32 doesn't have a CCPromoteToType like the others do which might explain why it isn't SExt but then the question is how does a function guarantee an i16/i8 result is sign extended (and conversely, how does the caller know it doesn't need to do it itself).
>
> Could you explain how the rets() and retc() cases are passing? Are they using CCValAssign::Full here?
>
> ================
> Comment at: lib/Target/Mips/MipsFastISel.cpp:1186-1198
> @@ -1107,14 +1185,15 @@
>   
>   bool MipsFastISel::emitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
>                                 unsigned DestReg, bool IsZExt) {
>     if (IsZExt)
>       return emitIntZExt(SrcVT, SrcReg, DestVT, DestReg);
>     return emitIntSExt(SrcVT, SrcReg, DestVT, DestReg);
>   }
>   
>   unsigned MipsFastISel::emitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
>                                     bool isZExt) {
>     unsigned DestReg = createResultReg(&Mips::GPR32RegClass);
> -  return emitIntExt(SrcVT, SrcReg, DestVT, DestReg, isZExt);
> +  bool Success = emitIntExt(SrcVT, SrcReg, DestVT, DestReg, isZExt);
> +  return Success? DestReg: 0;
>   }
>   
> ----------------
> The inconsistency between the return types of these two overloaded functions is going to really confuse someone when they accidentally get boolean 1 instead of a register number. Going by the change in the patch, I suspect it already has.
>
> It doesn't have to be in this patch but please make them consistent ASAP. My preference is to settle on returning the result register since that's usable as a boolean and a register number.
>
> ================
> Comment at: lib/Target/Mips/MipsFastISel.cpp:1197
> @@ -1119,1 +1196,3 @@
> +  bool Success = emitIntExt(SrcVT, SrcReg, DestVT, DestReg, isZExt);
> +  return Success? DestReg: 0;
>   }
> ----------------
> Nit: Space before '?'
>
> ================
> Comment at: test/CodeGen/Mips/Fast-ISel/retabi.ll:13
> @@ +12,3 @@
> +entry:
> +; CHECK-LABEL: reti
> +  %0 = load i32* @i, align 4
> ----------------
> Nit: For consistency with other tests we should probably include the colon following the label name.
>
> ================
> Comment at: test/CodeGen/Mips/Fast-ISel/retabi.ll:16
> @@ +15,3 @@
> +  ret i32 %0
> +; CHECK:    	lui	$[[REG_GPa:[0-9]+]], %hi(_gp_disp)
> +; CHECK:	addiu	$[[REG_GPb:[0-9]+]], $[[REG_GPa]], %lo(_gp_disp)
> ----------------
> Nit: indentation
>
> Likewise for all the lui lines below
>
> ================
> Comment at: test/CodeGen/Mips/Fast-ISel/retabi.ll:34-35
> @@ +33,4 @@
> +; CHECK:	lw	$[[REG_S_ADDR:[0-9]+]], %got(s)($[[REG_GP]])
> +; CHECK:	lhu	$[[REG_S:[0-9]+]], 0($[[REG_S_ADDR]])
> +; CHECK:	seh	$2, $[[REG_S]]
> +; CHECK:	jr	$ra
> ----------------
> I think I already know the answer to this question but why not use lh instead of lhu+seh?
>
> ================
> Comment at: test/CodeGen/Mips/Fast-ISel/retabi.ll:49-50
> @@ +48,4 @@
> +; CHECK:	lw	$[[REG_C_ADDR:[0-9]+]], %got(c)($[[REG_GP]])
> +; CHECK:	lbu	$[[REG_C:[0-9]+]], 0($[[REG_C_ADDR]])
> +; CHECK:	seb	$2, $[[REG_C]]
> +; CHECK:	jr	$ra
> ----------------
> I think I already know the answer to this question but why not use lb instead of lbu+seb?
>
> ================
> Comment at: test/CodeGen/Mips/Fast-ISel/retabi.ll:81-82
> @@ +80,3 @@
> +}
> +
> +
> ----------------
> Nit: blank lines at EOF
>
> http://reviews.llvm.org/D5920
>
> EMAIL PREFERENCES
>    http://reviews.llvm.org/settings/panel/emailpreferences/
>
>




More information about the llvm-commits mailing list