[llvm] r232943 - Fix sign extension for MIPS64 in makeLibCall function
Daniel Sanders
Daniel.Sanders at imgtec.com
Tue Apr 28 07:48:01 PDT 2015
Thanks. I committed both this morning (r235973 and r235972).
> -----Original Message-----
> From: Tom Stellard [mailto:tom at stellard.net]
> Sent: 28 April 2015 14:55
> To: Owen Anderson
> Cc: Daniel Sanders; Petar Jovanovic; llvm-commits at cs.uiuc.edu
> Subject: Re: [llvm] r232943 - Fix sign extension for MIPS64 in makeLibCall
> function
>
> Hi Daniel,
>
> Go ahead and commit if you haven't already.
>
> -Tom
>
> On Mon, Apr 27, 2015 at 10:21:25AM -0700, Owen Anderson wrote:
> > The target independent part looks fine to me.
> >
> > —Owen
> >
> > > On Apr 25, 2015, at 4:20 AM, Daniel Sanders
> <daniel.sanders at imgtec.com> wrote:
> > >
> > > Hi Owen,
> > >
> > > I'd like to merge this patch into the LLVM 3.6.1 release but it touches
> common code in your area. Is the merge ok with you?
> > >
> > > I'd also like to merge 'r228765 - Fix makeLibCall argument (signed) in
> SoftenFloatRes_XINT_TO_FP function' if that's ok too.
> > > ________________________________________
> > > From: llvm-commits-bounces at cs.uiuc.edu [llvm-commits-
> bounces at cs.uiuc.edu] on behalf of Petar Jovanovic
> > > Sent: 23 March 2015 12:28
> > > To: llvm-commits at cs.uiuc.edu
> > > Subject: [llvm] r232943 - Fix sign extension for MIPS64 in makeLibCall
> function
> > >
> > > Author: petarj
> > > Date: Mon Mar 23 07:28:13 2015
> > > New Revision: 232943
> > >
> > > URL: http://llvm.org/viewvc/llvm-project?rev=232943&view=rev
> > > Log:
> > > Fix sign extension for MIPS64 in makeLibCall function
> > >
> > > Fixing sign extension in makeLibCall for MIPS64. In MIPS64 architecture all
> > > 32 bit arguments (int, unsigned int, float 32 (soft float)) must be sign
> > > extended. This fixes test "MultiSource/Applications/oggenc/".
> > >
> > > Patch by Strahinja Petrovic.
> > >
> > > Differential Revision: http://reviews.llvm.org/D7791
> > >
> > > Added:
> > > llvm/trunk/test/CodeGen/Mips/mips64signextendsesf.ll
> > > Modified:
> > > llvm/trunk/include/llvm/Target/TargetLowering.h
> > > llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
> > > llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp
> > > llvm/trunk/lib/Target/Mips/MipsISelLowering.h
> > > llvm/trunk/test/CodeGen/Mips/mips64-f128.ll
> > >
> > > Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
> > > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=232943&r1=2
> 32942&r2=232943&view=diff
> > >
> ==========================================================
> ====================
> > > --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
> > > +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Mar 23
> 07:28:13 2015
> > > @@ -1080,6 +1080,11 @@ public:
> > > return false;
> > > }
> > >
> > > + /// Returns true if arguments should be sign-extended in lib calls.
> > > + virtual bool shouldSignExtendTypeInLibCall(EVT Type, bool IsSigned)
> const {
> > > + return IsSigned;
> > > + }
> > > +
> > > /// Returns true if the given (atomic) load should be expanded by the
> > > /// IR-level AtomicExpand pass into a load-linked instruction
> > > /// (through emitLoadLinked()).
> > >
> > > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
> > > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=23
> 2943&r1=232942&r2=232943&view=diff
> > >
> ==========================================================
> ====================
> > > --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
> > > +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon
> Mar 23 07:28:13 2015
> > > @@ -96,18 +96,19 @@ TargetLowering::makeLibCall(SelectionDAG
> > > for (unsigned i = 0; i != NumOps; ++i) {
> > > Entry.Node = Ops[i];
> > > Entry.Ty =
> Entry.Node.getValueType().getTypeForEVT(*DAG.getContext());
> > > - Entry.isSExt = isSigned;
> > > - Entry.isZExt = !isSigned;
> > > + Entry.isSExt = shouldSignExtendTypeInLibCall(Ops[i].getValueType(),
> isSigned);
> > > + Entry.isZExt = !shouldSignExtendTypeInLibCall(Ops[i].getValueType(),
> isSigned);
> > > Args.push_back(Entry);
> > > }
> > > SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
> getPointerTy());
> > >
> > > Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
> > > TargetLowering::CallLoweringInfo CLI(DAG);
> > > + bool signExtend = shouldSignExtendTypeInLibCall(RetVT, isSigned);
> > > CLI.setDebugLoc(dl).setChain(DAG.getEntryNode())
> > > .setCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args), 0)
> > > .setNoReturn(doesNotReturn).setDiscardResult(!isReturnValueUsed)
> > > - .setSExtResult(isSigned).setZExtResult(!isSigned);
> > > + .setSExtResult(signExtend).setZExtResult(!signExtend);
> > > return LowerCallTo(CLI);
> > > }
> > >
> > >
> > > Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp
> > > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp?rev=232943&r1=2
> 32942&r2=232943&view=diff
> > >
> ==========================================================
> ====================
> > > --- llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp (original)
> > > +++ llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp Mon Mar 23
> 07:28:13 2015
> > > @@ -3032,6 +3032,15 @@ MipsTargetLowering::CanLowerReturn(Calli
> > > return CCInfo.CheckReturn(Outs, RetCC_Mips);
> > > }
> > >
> > > +bool
> > > +MipsTargetLowering::shouldSignExtendTypeInLibCall(EVT Type, bool
> IsSigned) const {
> > > + if (Subtarget.hasMips3() && Subtarget.abiUsesSoftFloat()) {
> > > + if (Type == MVT::i32)
> > > + return true;
> > > + }
> > > + return IsSigned;
> > > +}
> > > +
> > > SDValue
> > > MipsTargetLowering::LowerReturn(SDValue Chain,
> > > CallingConv::ID CallConv, bool IsVarArg,
> > >
> > > Modified: llvm/trunk/lib/Target/Mips/MipsISelLowering.h
> > > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Target/Mips/MipsISelLowering.h?rev=232943&r1=232
> 942&r2=232943&view=diff
> > >
> ==========================================================
> ====================
> > > --- llvm/trunk/lib/Target/Mips/MipsISelLowering.h (original)
> > > +++ llvm/trunk/lib/Target/Mips/MipsISelLowering.h Mon Mar 23 07:28:13
> 2015
> > > @@ -475,6 +475,8 @@ namespace llvm {
> > > const SmallVectorImpl<SDValue> &OutVals,
> > > SDLoc dl, SelectionDAG &DAG) const override;
> > >
> > > + bool shouldSignExtendTypeInLibCall(EVT Type, bool IsSigned) const
> override;
> > > +
> > > // Inline asm support
> > > ConstraintType
> > > getConstraintType(const std::string &Constraint) const override;
> > >
> > > Modified: llvm/trunk/test/CodeGen/Mips/mips64-f128.ll
> > > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/CodeGen/Mips/mips64-
> f128.ll?rev=232943&r1=232942&r2=232943&view=diff
> > >
> ==========================================================
> ====================
> > > --- llvm/trunk/test/CodeGen/Mips/mips64-f128.ll (original)
> > > +++ llvm/trunk/test/CodeGen/Mips/mips64-f128.ll Mon Mar 23 07:28:13
> 2015
> > > @@ -545,7 +545,7 @@ entry:
> > >
> > > ; ALL-LABEL: load_LD_float:
> > > ; ALL: ld $[[R0:[0-9]+]], %got_disp(gf1)
> > > -; ALL: lwu $4, 0($[[R0]])
> > > +; ALL: lw $4, 0($[[R0]])
> > > ; ALL: ld $25, %call16(__extendsftf2)
> > > ; ALL: jalr $25
> > >
> > >
> > > Added: llvm/trunk/test/CodeGen/Mips/mips64signextendsesf.ll
> > > URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/CodeGen/Mips/mips64signextendsesf.ll?rev=23294
> 3&view=auto
> > >
> ==========================================================
> ====================
> > > --- llvm/trunk/test/CodeGen/Mips/mips64signextendsesf.ll (added)
> > > +++ llvm/trunk/test/CodeGen/Mips/mips64signextendsesf.ll Mon Mar
> 23 07:28:13 2015
> > > @@ -0,0 +1,214 @@
> > > +; RUN: llc -march=mips64 -mcpu=mips64r2 -soft-float -O2 < %s |
> FileCheck %s
> > > +
> > > +define void @foosf() #0 {
> > > +entry:
> > > + %in = alloca float, align 4
> > > + %out = alloca float, align 4
> > > + store volatile float 0xBFD59E1380000000, float* %in, align 4
> > > + %in.0.in.0. = load volatile float, float* %in, align 4
> > > + %rintf = tail call float @rintf(float %in.0.in.0.) #1
> > > + store volatile float %rintf, float* %out, align 4
> > > + ret void
> > > +
> > > +; CHECK-LABEL: foosf
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @rintf(float)
> > > +
> > > +define float @foosf1(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %call = tail call float @roundf(float %0) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf1
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @roundf(float) #1
> > > +
> > > +define float @foosf2(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %call = tail call float @truncf(float %0) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf2
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @truncf(float) #1
> > > +
> > > +define float @foosf3(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %call = tail call float @floorf(float %0) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf3
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @floorf(float) #1
> > > +
> > > +define float @foosf4(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %call = tail call float @nearbyintf(float %0) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf4
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @nearbyintf(float) #1
> > > +
> > > +define float @foosf5(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %mul = fmul float %0, undef
> > > + ret float %mul
> > > +
> > > +; CHECK-LABEL: foosf5
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +define float @foosf6(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %sub = fsub float %0, undef
> > > + ret float %sub
> > > +
> > > +; CHECK-LABEL: foosf6
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +define float @foosf7(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %0 = load float, float* %a, align 4
> > > + %add = fadd float %0, undef
> > > + ret float %add
> > > +
> > > +; CHECK-LABEL: foosf7
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +define float @foosf8(float* nocapture readonly %a) #0 {
> > > +entry:
> > > + %b = alloca float, align 4
> > > + %b.0.b.0. = load volatile float, float* %b, align 4
> > > + %0 = load float, float* %a, align 4
> > > + %div = fdiv float %b.0.b.0., %0
> > > + ret float %div
> > > +
> > > +; CHECK-LABEL: foosf8
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +define float @foosf9() #0 {
> > > +entry:
> > > + %b = alloca float, align 4
> > > + %b.0.b.0. = load volatile float, float* %b, align 4
> > > + %conv = fpext float %b.0.b.0. to double
> > > + %b.0.b.0.3 = load volatile float, float* %b, align 4
> > > + %conv1 = fpext float %b.0.b.0.3 to double
> > > + %call = tail call double @pow(double %conv, double %conv1) #1
> > > + %conv2 = fptrunc double %call to float
> > > + ret float %conv2
> > > +
> > > +; CHECK-LABEL: foosf9
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare double @pow(double, double) #0
> > > +
> > > +define float @foosf10() #0 {
> > > +entry:
> > > + %a = alloca float, align 4
> > > + %a.0.a.0. = load volatile float, float* %a, align 4
> > > + %conv = fpext float %a.0.a.0. to double
> > > + %call = tail call double @sin(double %conv) #1
> > > + %conv1 = fptrunc double %call to float
> > > + ret float %conv1
> > > +
> > > +; CHECK-LABEL: foosf10
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare double @sin(double) #0
> > > +
> > > +define float @foosf11() #0 {
> > > +entry:
> > > + %b = alloca float, align 4
> > > + %b.0.b.0. = load volatile float, float* %b, align 4
> > > + %call = tail call float @ceilf(float %b.0.b.0.) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf11
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @ceilf(float) #1
> > > +
> > > +define float @foosf12() #0 {
> > > +entry:
> > > + %b = alloca float, align 4
> > > + %a = alloca float, align 4
> > > + %b.0.b.0. = load volatile float, float* %b, align 4
> > > + %a.0.a.0. = load volatile float, float* %a, align 4
> > > + %call = tail call float @fmaxf(float %b.0.b.0., float %a.0.a.0.) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf12
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @fmaxf(float, float) #1
> > > +
> > > +define float @foosf13() #0 {
> > > +entry:
> > > + %b = alloca float, align 4
> > > + %a = alloca float, align 4
> > > + %b.0.b.0. = load volatile float, float* %b, align 4
> > > + %a.0.a.0. = load volatile float, float* %a, align 4
> > > + %call = tail call float @fminf(float %b.0.b.0., float %a.0.a.0.) #2
> > > + ret float %call
> > > +
> > > +; CHECK-LABEL: foosf13
> > > +; CHECK-NOT: dsll
> > > +; CHECK-NOT: dsrl
> > > +; CHECK-NOT: lwu
> > > +}
> > > +
> > > +declare float @fminf(float, float) #1
> > > +
> > > +
> > > +attributes #0 = { nounwind "use-soft-float"="true" }
> > > +attributes #1 = { nounwind readnone "use-soft-float"="true" }
> > > \ No newline at end of file
> > >
> > >
> > > _______________________________________________
> > > llvm-commits mailing list
> > > llvm-commits at cs.uiuc.edu
> > > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >
More information about the llvm-commits
mailing list