@@ -149,7 +149,8 @@ LegalizerHelper::legalizeInstrStep(MachineInstr &MI,
149
149
return moreElementsVector (MI, Step.TypeIdx , Step.NewType );
150
150
case Custom:
151
151
LLVM_DEBUG (dbgs () << " .. Custom legalization\n " );
152
- return LI.legalizeCustom (*this , MI) ? Legalized : UnableToLegalize;
152
+ return LI.legalizeCustom (*this , MI, LocObserver) ? Legalized
153
+ : UnableToLegalize;
153
154
default :
154
155
LLVM_DEBUG (dbgs () << " .. Unable to legalize\n " );
155
156
return UnableToLegalize;
@@ -567,7 +568,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
567
568
568
569
// / True if an instruction is in tail position in its caller. Intended for
569
570
// / legalizing libcalls as tail calls when possible.
570
- static bool isLibCallInTailPosition (MachineInstr &MI,
571
+ static bool isLibCallInTailPosition (const CallLowering::ArgInfo &Result,
572
+ MachineInstr &MI,
571
573
const TargetInstrInfo &TII,
572
574
MachineRegisterInfo &MRI) {
573
575
MachineBasicBlock &MBB = *MI.getParent ();
@@ -596,17 +598,12 @@ static bool isLibCallInTailPosition(MachineInstr &MI,
596
598
// RET_ReallyLR implicit $x0
597
599
auto Next = next_nodbg (MI.getIterator (), MBB.instr_end ());
598
600
if (Next != MBB.instr_end () && Next->isCopy ()) {
599
- switch (MI.getOpcode ()) {
600
- default :
601
- llvm_unreachable (" unsupported opcode" );
602
- case TargetOpcode::G_BZERO:
601
+ if (MI.getOpcode () == TargetOpcode::G_BZERO)
603
602
return false ;
604
- case TargetOpcode::G_MEMCPY:
605
- case TargetOpcode::G_MEMMOVE:
606
- case TargetOpcode::G_MEMSET:
607
- break ;
608
- }
609
603
604
+ // For MEMCPY/MOMMOVE/MEMSET these will be the first use (the dst), as the
605
+ // mempy/etc routines return the same parameter. For other it will be the
606
+ // returned value.
610
607
Register VReg = MI.getOperand (0 ).getReg ();
611
608
if (!VReg.isVirtual () || VReg != Next->getOperand (1 ).getReg ())
612
609
return false ;
@@ -622,7 +619,7 @@ static bool isLibCallInTailPosition(MachineInstr &MI,
622
619
if (Ret->getNumImplicitOperands () != 1 )
623
620
return false ;
624
621
625
- if (PReg != Ret->getOperand (0 ).getReg ())
622
+ if (!Ret-> getOperand ( 0 ). isReg () || PReg != Ret->getOperand (0 ).getReg ())
626
623
return false ;
627
624
628
625
// Skip over the COPY that we just validated.
@@ -639,42 +636,73 @@ LegalizerHelper::LegalizeResult
639
636
llvm::createLibcall (MachineIRBuilder &MIRBuilder, const char *Name,
640
637
const CallLowering::ArgInfo &Result,
641
638
ArrayRef<CallLowering::ArgInfo> Args,
642
- const CallingConv::ID CC) {
639
+ const CallingConv::ID CC, LostDebugLocObserver &LocObserver,
640
+ MachineInstr *MI) {
643
641
auto &CLI = *MIRBuilder.getMF ().getSubtarget ().getCallLowering ();
644
642
645
643
CallLowering::CallLoweringInfo Info;
646
644
Info.CallConv = CC;
647
645
Info.Callee = MachineOperand::CreateES (Name);
648
646
Info.OrigRet = Result;
647
+ if (MI)
648
+ Info.IsTailCall =
649
+ (Result.Ty ->isVoidTy () ||
650
+ Result.Ty == MIRBuilder.getMF ().getFunction ().getReturnType ()) &&
651
+ isLibCallInTailPosition (Result, *MI, MIRBuilder.getTII (),
652
+ *MIRBuilder.getMRI ());
653
+
649
654
std::copy (Args.begin (), Args.end (), std::back_inserter (Info.OrigArgs ));
650
655
if (!CLI.lowerCall (MIRBuilder, Info))
651
656
return LegalizerHelper::UnableToLegalize;
652
657
658
+ if (MI && Info.LoweredTailCall ) {
659
+ assert (Info.IsTailCall && " Lowered tail call when it wasn't a tail call?" );
660
+
661
+ // Check debug locations before removing the return.
662
+ LocObserver.checkpoint (true );
663
+
664
+ // We must have a return following the call (or debug insts) to get past
665
+ // isLibCallInTailPosition.
666
+ do {
667
+ MachineInstr *Next = MI->getNextNode ();
668
+ assert (Next &&
669
+ (Next->isCopy () || Next->isReturn () || Next->isDebugInstr ()) &&
670
+ " Expected instr following MI to be return or debug inst?" );
671
+ // We lowered a tail call, so the call is now the return from the block.
672
+ // Delete the old return.
673
+ Next->eraseFromParent ();
674
+ } while (MI->getNextNode ());
675
+
676
+ // We expect to lose the debug location from the return.
677
+ LocObserver.checkpoint (false );
678
+ }
653
679
return LegalizerHelper::Legalized;
654
680
}
655
681
656
682
LegalizerHelper::LegalizeResult
657
683
llvm::createLibcall (MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
658
684
const CallLowering::ArgInfo &Result,
659
- ArrayRef<CallLowering::ArgInfo> Args) {
685
+ ArrayRef<CallLowering::ArgInfo> Args,
686
+ LostDebugLocObserver &LocObserver, MachineInstr *MI) {
660
687
auto &TLI = *MIRBuilder.getMF ().getSubtarget ().getTargetLowering ();
661
688
const char *Name = TLI.getLibcallName (Libcall);
662
689
const CallingConv::ID CC = TLI.getLibcallCallingConv (Libcall);
663
- return createLibcall (MIRBuilder, Name, Result, Args, CC);
690
+ return createLibcall (MIRBuilder, Name, Result, Args, CC, LocObserver, MI );
664
691
}
665
692
666
693
// Useful for libcalls where all operands have the same type.
667
694
static LegalizerHelper::LegalizeResult
668
695
simpleLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, unsigned Size,
669
- Type *OpType) {
696
+ Type *OpType, LostDebugLocObserver &LocObserver ) {
670
697
auto Libcall = getRTLibDesc (MI.getOpcode (), Size);
671
698
672
699
// FIXME: What does the original arg index mean here?
673
700
SmallVector<CallLowering::ArgInfo, 3 > Args;
674
701
for (const MachineOperand &MO : llvm::drop_begin (MI.operands ()))
675
702
Args.push_back ({MO.getReg (), OpType, 0 });
676
703
return createLibcall (MIRBuilder, Libcall,
677
- {MI.getOperand (0 ).getReg (), OpType, 0 }, Args);
704
+ {MI.getOperand (0 ).getReg (), OpType, 0 }, Args,
705
+ LocObserver, &MI);
678
706
}
679
707
680
708
LegalizerHelper::LegalizeResult
@@ -733,8 +761,9 @@ llvm::createMemLibcall(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
733
761
Info.CallConv = TLI.getLibcallCallingConv (RTLibcall);
734
762
Info.Callee = MachineOperand::CreateES (Name);
735
763
Info.OrigRet = CallLowering::ArgInfo ({0 }, Type::getVoidTy (Ctx), 0 );
736
- Info.IsTailCall = MI.getOperand (MI.getNumOperands () - 1 ).getImm () &&
737
- isLibCallInTailPosition (MI, MIRBuilder.getTII (), MRI);
764
+ Info.IsTailCall =
765
+ MI.getOperand (MI.getNumOperands () - 1 ).getImm () &&
766
+ isLibCallInTailPosition (Info.OrigRet , MI, MIRBuilder.getTII (), MRI);
738
767
739
768
std::copy (Args.begin (), Args.end (), std::back_inserter (Info.OrigArgs ));
740
769
if (!CLI.lowerCall (MIRBuilder, Info))
@@ -789,11 +818,11 @@ static RTLIB::Libcall getConvRTLibDesc(unsigned Opcode, Type *ToType,
789
818
790
819
static LegalizerHelper::LegalizeResult
791
820
conversionLibcall (MachineInstr &MI, MachineIRBuilder &MIRBuilder, Type *ToType,
792
- Type *FromType) {
821
+ Type *FromType, LostDebugLocObserver &LocObserver ) {
793
822
RTLIB::Libcall Libcall = getConvRTLibDesc (MI.getOpcode (), ToType, FromType);
794
- return createLibcall (MIRBuilder, Libcall,
795
- {MI.getOperand (0 ).getReg (), ToType, 0 },
796
- {{MI.getOperand (1 ).getReg (), FromType, 0 }});
823
+ return createLibcall (
824
+ MIRBuilder, Libcall, {MI.getOperand (0 ).getReg (), ToType, 0 },
825
+ {{MI.getOperand (1 ).getReg (), FromType, 0 }}, LocObserver, &MI );
797
826
}
798
827
799
828
static RTLIB::Libcall
@@ -829,7 +858,8 @@ getStateLibraryFunctionFor(MachineInstr &MI, const TargetLowering &TLI) {
829
858
//
830
859
LegalizerHelper::LegalizeResult
831
860
LegalizerHelper::createGetStateLibcall (MachineIRBuilder &MIRBuilder,
832
- MachineInstr &MI) {
861
+ MachineInstr &MI,
862
+ LostDebugLocObserver &LocObserver) {
833
863
const DataLayout &DL = MIRBuilder.getDataLayout ();
834
864
auto &MF = MIRBuilder.getMF ();
835
865
auto &MRI = *MIRBuilder.getMRI ();
@@ -850,7 +880,8 @@ LegalizerHelper::createGetStateLibcall(MachineIRBuilder &MIRBuilder,
850
880
auto Res =
851
881
createLibcall (MIRBuilder, RTLibcall,
852
882
CallLowering::ArgInfo ({0 }, Type::getVoidTy (Ctx), 0 ),
853
- CallLowering::ArgInfo ({Temp.getReg (0 ), StatePtrTy, 0 }));
883
+ CallLowering::ArgInfo ({Temp.getReg (0 ), StatePtrTy, 0 }),
884
+ LocObserver, nullptr );
854
885
if (Res != LegalizerHelper::Legalized)
855
886
return Res;
856
887
@@ -867,7 +898,8 @@ LegalizerHelper::createGetStateLibcall(MachineIRBuilder &MIRBuilder,
867
898
// content of memory region.
868
899
LegalizerHelper::LegalizeResult
869
900
LegalizerHelper::createSetStateLibcall (MachineIRBuilder &MIRBuilder,
870
- MachineInstr &MI) {
901
+ MachineInstr &MI,
902
+ LostDebugLocObserver &LocObserver) {
871
903
const DataLayout &DL = MIRBuilder.getDataLayout ();
872
904
auto &MF = MIRBuilder.getMF ();
873
905
auto &MRI = *MIRBuilder.getMRI ();
@@ -892,7 +924,8 @@ LegalizerHelper::createSetStateLibcall(MachineIRBuilder &MIRBuilder,
892
924
RTLIB::Libcall RTLibcall = getStateLibraryFunctionFor (MI, TLI);
893
925
return createLibcall (MIRBuilder, RTLibcall,
894
926
CallLowering::ArgInfo ({0 }, Type::getVoidTy (Ctx), 0 ),
895
- CallLowering::ArgInfo ({Temp.getReg (0 ), StatePtrTy, 0 }));
927
+ CallLowering::ArgInfo ({Temp.getReg (0 ), StatePtrTy, 0 }),
928
+ LocObserver, nullptr );
896
929
}
897
930
898
931
// The function is used to legalize operations that set default environment
@@ -902,7 +935,8 @@ LegalizerHelper::createSetStateLibcall(MachineIRBuilder &MIRBuilder,
902
935
// it is not true, the target must provide custom lowering.
903
936
LegalizerHelper::LegalizeResult
904
937
LegalizerHelper::createResetStateLibcall (MachineIRBuilder &MIRBuilder,
905
- MachineInstr &MI) {
938
+ MachineInstr &MI,
939
+ LostDebugLocObserver &LocObserver) {
906
940
const DataLayout &DL = MIRBuilder.getDataLayout ();
907
941
auto &MF = MIRBuilder.getMF ();
908
942
auto &Ctx = MF.getFunction ().getContext ();
@@ -919,7 +953,8 @@ LegalizerHelper::createResetStateLibcall(MachineIRBuilder &MIRBuilder,
919
953
RTLIB::Libcall RTLibcall = getStateLibraryFunctionFor (MI, TLI);
920
954
return createLibcall (MIRBuilder, RTLibcall,
921
955
CallLowering::ArgInfo ({0 }, Type::getVoidTy (Ctx), 0 ),
922
- CallLowering::ArgInfo ({ Dest.getReg (), StatePtrTy, 0 }));
956
+ CallLowering::ArgInfo ({Dest.getReg (), StatePtrTy, 0 }),
957
+ LocObserver, &MI);
923
958
}
924
959
925
960
LegalizerHelper::LegalizeResult
@@ -938,7 +973,7 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
938
973
LLT LLTy = MRI.getType (MI.getOperand (0 ).getReg ());
939
974
unsigned Size = LLTy.getSizeInBits ();
940
975
Type *HLTy = IntegerType::get (Ctx, Size);
941
- auto Status = simpleLibcall (MI, MIRBuilder, Size, HLTy);
976
+ auto Status = simpleLibcall (MI, MIRBuilder, Size, HLTy, LocObserver );
942
977
if (Status != Legalized)
943
978
return Status;
944
979
break ;
@@ -974,7 +1009,7 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
974
1009
LLVM_DEBUG (dbgs () << " No libcall available for type " << LLTy << " .\n " );
975
1010
return UnableToLegalize;
976
1011
}
977
- auto Status = simpleLibcall (MI, MIRBuilder, Size, HLTy);
1012
+ auto Status = simpleLibcall (MI, MIRBuilder, Size, HLTy, LocObserver );
978
1013
if (Status != Legalized)
979
1014
return Status;
980
1015
break ;
@@ -985,7 +1020,8 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
985
1020
Type *ToTy = getFloatTypeForLLT (Ctx, MRI.getType (MI.getOperand (0 ).getReg ()));
986
1021
if (!FromTy || !ToTy)
987
1022
return UnableToLegalize;
988
- LegalizeResult Status = conversionLibcall (MI, MIRBuilder, ToTy, FromTy );
1023
+ LegalizeResult Status =
1024
+ conversionLibcall (MI, MIRBuilder, ToTy, FromTy, LocObserver);
989
1025
if (Status != Legalized)
990
1026
return Status;
991
1027
break ;
@@ -1000,7 +1036,8 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
1000
1036
LegalizeResult Status = conversionLibcall (
1001
1037
MI, MIRBuilder,
1002
1038
ToSize == 32 ? Type::getInt32Ty (Ctx) : Type::getInt64Ty (Ctx),
1003
- FromSize == 64 ? Type::getDoubleTy (Ctx) : Type::getFloatTy (Ctx));
1039
+ FromSize == 64 ? Type::getDoubleTy (Ctx) : Type::getFloatTy (Ctx),
1040
+ LocObserver);
1004
1041
if (Status != Legalized)
1005
1042
return Status;
1006
1043
break ;
@@ -1015,7 +1052,8 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
1015
1052
LegalizeResult Status = conversionLibcall (
1016
1053
MI, MIRBuilder,
1017
1054
ToSize == 64 ? Type::getDoubleTy (Ctx) : Type::getFloatTy (Ctx),
1018
- FromSize == 32 ? Type::getInt32Ty (Ctx) : Type::getInt64Ty (Ctx));
1055
+ FromSize == 32 ? Type::getInt32Ty (Ctx) : Type::getInt64Ty (Ctx),
1056
+ LocObserver);
1019
1057
if (Status != Legalized)
1020
1058
return Status;
1021
1059
break ;
@@ -1032,19 +1070,20 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
1032
1070
return Result;
1033
1071
}
1034
1072
case TargetOpcode::G_GET_FPMODE: {
1035
- LegalizeResult Result = createGetStateLibcall (MIRBuilder, MI);
1073
+ LegalizeResult Result = createGetStateLibcall (MIRBuilder, MI, LocObserver );
1036
1074
if (Result != Legalized)
1037
1075
return Result;
1038
1076
break ;
1039
1077
}
1040
1078
case TargetOpcode::G_SET_FPMODE: {
1041
- LegalizeResult Result = createSetStateLibcall (MIRBuilder, MI);
1079
+ LegalizeResult Result = createSetStateLibcall (MIRBuilder, MI, LocObserver );
1042
1080
if (Result != Legalized)
1043
1081
return Result;
1044
1082
break ;
1045
1083
}
1046
1084
case TargetOpcode::G_RESET_FPMODE: {
1047
- LegalizeResult Result = createResetStateLibcall (MIRBuilder, MI);
1085
+ LegalizeResult Result =
1086
+ createResetStateLibcall (MIRBuilder, MI, LocObserver);
1048
1087
if (Result != Legalized)
1049
1088
return Result;
1050
1089
break ;
0 commit comments