113 using namespace llvm;
116 #define DEBUG_TYPE "isel" 121 cl::desc(
"Sink local values in FastISel"));
123 STATISTIC(NumFastIselSuccessIndependent,
"Number of insts selected by " 124 "target-independent selector");
125 STATISTIC(NumFastIselSuccessTarget,
"Number of insts selected by " 126 "target-specific selector");
127 STATISTIC(NumFastIselDead,
"Number of dead insts removed on failure");
132 assert(LocalValueMap.empty() &&
133 "local values should be cleared after finishing a BB");
138 EmitStartPt =
nullptr;
139 if (!FuncInfo.MBB->empty())
140 EmitStartPt = &FuncInfo.MBB->back();
141 LastLocalValue = EmitStartPt;
148 if (!FuncInfo.CanLowerReturn)
153 if (!fastLowerArguments())
158 E = FuncInfo.Fn->arg_end();
161 assert(VI != LocalValueMap.
end() &&
"Missed an argument?");
162 FuncInfo.ValueMap[&*
I] = VI->second;
177 RegDef = MO.getReg();
186 void FastISel::flushLocalValueMap() {
196 : FuncInfo.MBB->rend();
197 MachineBasicBlock::reverse_iterator RI(LastLocalValue);
199 InstOrderMap OrderMap;
210 sinkLocalValueMaterialization(LocalMI, DefReg, OrderMap);
214 LocalValueMap.clear();
215 LastLocalValue = EmitStartPt;
217 SavedInsertPt = FuncInfo.InsertPt;
218 LastFlushPoint = FuncInfo.InsertPt;
224 if (
P.second == DefReg)
236 if (!FirstTerminator &&
237 (
I.isTerminator() || (
I.isEHLabel() && &
I != &MBB->front()))) {
238 FirstTerminator = &
I;
239 FirstTerminatorOrder = Order;
241 Orders[&
I] = Order++;
244 if (
I.getIterator() == LastFlushPoint)
249 void FastISel::sinkLocalValueMaterialization(
MachineInstr &LocalMI,
251 InstOrderMap &OrderMap) {
257 if (FuncInfo.RegsWithFixups.count(DefReg))
263 if (!UsedByPHI &&
MRI.use_nodbg_empty(DefReg)) {
264 if (EmitStartPt == &LocalMI)
265 EmitStartPt = EmitStartPt->getPrevNode();
268 OrderMap.Orders.erase(&LocalMI);
275 if (OrderMap.Orders.empty())
276 OrderMap.initialize(FuncInfo.MBB, LastFlushPoint);
282 auto I = OrderMap.Orders.find(&UseInst);
283 assert(
I != OrderMap.Orders.end() &&
284 "local value used by instruction outside local region");
285 unsigned UseOrder =
I->second;
286 if (UseOrder < FirstOrder) {
287 FirstOrder = UseOrder;
288 FirstUser = &UseInst;
296 if (UsedByPHI && OrderMap.FirstTerminatorOrder < FirstOrder) {
297 FirstOrder = OrderMap.FirstTerminatorOrder;
298 SinkPos = OrderMap.FirstTerminator->getIterator();
299 }
else if (FirstUser) {
302 assert(UsedByPHI &&
"must be users if not used by a phi");
303 SinkPos = FuncInfo.MBB->instr_end();
310 if (!DbgVal.isDebugValue())
312 unsigned UseOrder = OrderMap.Orders[&DbgVal];
313 if (UseOrder < FirstOrder)
318 LLVM_DEBUG(
dbgs() <<
"sinking local value to first use " << LocalMI);
319 FuncInfo.MBB->remove(&LocalMI);
320 FuncInfo.MBB->insert(SinkPos, &LocalMI);
321 if (SinkPos != FuncInfo.MBB->end())
326 FuncInfo.MBB->remove(DI);
327 FuncInfo.MBB->insert(SinkPos, DI);
338 if (
const auto *Cast = dyn_cast<CastInst>(I))
339 if (Cast->isNoopCast(DL) && !hasTrivialKill(Cast->getOperand(0)))
345 unsigned Reg = lookUpRegForValue(V);
346 if (Reg && !
MRI.use_empty(Reg))
350 if (
const auto *
GEP = dyn_cast<GetElementPtrInst>(I))
351 if (
GEP->hasAllZeroIndices() && !hasTrivialKill(
GEP->getOperand(0)))
357 !(I->
getOpcode() == Instruction::BitCast ||
358 I->
getOpcode() == Instruction::PtrToInt ||
359 I->
getOpcode() == Instruction::IntToPtr) &&
364 EVT RealVT = TLI.getValueType(DL, V->
getType(),
true);
373 if (!TLI.isTypeLegal(VT)) {
376 VT = TLI.getTypeToTransformTo(V->
getContext(), VT).getSimpleVT();
382 unsigned Reg = lookUpRegForValue(V);
388 if (isa<Instruction>(V) &&
389 (!isa<AllocaInst>(V) ||
390 !FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(V))))
391 return FuncInfo.InitializeRegForValue(V);
393 SavePoint SaveInsertPt = enterLocalValueArea();
397 Reg = materializeRegForValue(V, VT);
399 leaveLocalValueArea(SaveInsertPt);
404 unsigned FastISel::materializeConstant(
const Value *V,
MVT VT) {
406 if (
const auto *CI = dyn_cast<ConstantInt>(V)) {
407 if (CI->getValue().getActiveBits() <= 64)
409 }
else if (isa<AllocaInst>(V))
410 Reg = fastMaterializeAlloca(cast<AllocaInst>(V));
411 else if (isa<ConstantPointerNull>(V))
414 Reg = getRegForValue(
416 else if (
const auto *CF = dyn_cast<ConstantFP>(V)) {
417 if (CF->isNullValue())
418 Reg = fastMaterializeFloatZero(CF);
425 const APFloat &Flt = CF->getValueAPF();
426 EVT IntVT = TLI.getPointerTy(DL);
428 APSInt SIntVal(IntBitWidth,
false);
432 unsigned IntegerReg =
439 }
else if (
const auto *
Op = dyn_cast<Operator>(V)) {
440 if (!selectOperator(
Op,
Op->getOpcode()))
441 if (!isa<Instruction>(
Op) ||
442 !fastSelectInstruction(cast<Instruction>(
Op)))
444 Reg = lookUpRegForValue(
Op);
445 }
else if (isa<UndefValue>(V)) {
446 Reg = createResultReg(TLI.getRegClassFor(VT));
447 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
448 TII.get(TargetOpcode::IMPLICIT_DEF),
Reg);
456 unsigned FastISel::materializeRegForValue(
const Value *V,
MVT VT) {
459 if (isa<Constant>(V))
460 Reg = fastMaterializeConstant(cast<Constant>(V));
465 Reg = materializeConstant(V, VT);
470 LocalValueMap[V] =
Reg;
471 LastLocalValue =
MRI.getVRegDef(Reg);
482 if (I != FuncInfo.ValueMap.
end())
484 return LocalValueMap[V];
488 if (!isa<Instruction>(I)) {
489 LocalValueMap[
I] =
Reg;
493 unsigned &AssignedReg = FuncInfo.ValueMap[
I];
494 if (AssignedReg == 0)
497 else if (Reg != AssignedReg) {
499 for (
unsigned i = 0; i < NumRegs; i++) {
500 FuncInfo.RegFixups[AssignedReg + i] = Reg + i;
501 FuncInfo.RegsWithFixups.insert(Reg + i);
509 unsigned IdxN = getRegForValue(Idx);
512 return std::pair<unsigned, bool>(0,
false);
514 bool IdxNIsKill = hasTrivialKill(Idx);
517 MVT PtrVT = TLI.getPointerTy(DL);
519 if (IdxVT.
bitsLT(PtrVT)) {
523 }
else if (IdxVT.
bitsGT(PtrVT)) {
528 return std::pair<unsigned, bool>(IdxN, IdxNIsKill);
532 if (getLastLocalValue()) {
533 FuncInfo.InsertPt = getLastLocalValue();
534 FuncInfo.MBB = FuncInfo.InsertPt->getParent();
537 FuncInfo.InsertPt = FuncInfo.MBB->getFirstNonPHI();
540 while (FuncInfo.InsertPt != FuncInfo.MBB->end() &&
548 "Invalid iterator!");
550 if (LastFlushPoint == I)
552 if (SavedInsertPt == I)
554 if (EmitStartPt == I)
555 EmitStartPt = E.
isValid() ? &*
E :
nullptr;
556 if (LastLocalValue == I)
557 LastLocalValue = E.
isValid() ? &*
E :
nullptr;
577 if (FuncInfo.InsertPt != FuncInfo.MBB->begin())
578 LastLocalValue = &*std::prev(FuncInfo.InsertPt);
581 FuncInfo.InsertPt = OldInsertPt.
InsertPt;
582 DbgLoc = OldInsertPt.
DL;
595 if (!TLI.isTypeLegal(VT)) {
600 VT = TLI.getTypeToTransformTo(I->
getContext(), VT);
607 if (
const auto *CI = dyn_cast<ConstantInt>(I->
getOperand(0)))
608 if (isa<Instruction>(I) && cast<Instruction>(
I)->isCommutative()) {
609 unsigned Op1 = getRegForValue(I->
getOperand(1));
612 bool Op1IsKill = hasTrivialKill(I->
getOperand(1));
615 fastEmit_ri_(VT.
getSimpleVT(), ISDOpcode, Op1, Op1IsKill,
621 updateValueMap(I, ResultReg);
625 unsigned Op0 = getRegForValue(I->
getOperand(0));
628 bool Op0IsKill = hasTrivialKill(I->
getOperand(0));
631 if (
const auto *CI = dyn_cast<ConstantInt>(I->
getOperand(1))) {
632 uint64_t Imm = CI->getSExtValue();
635 if (ISDOpcode ==
ISD::SDIV && isa<BinaryOperator>(I) &&
642 if (ISDOpcode ==
ISD::UREM && isa<BinaryOperator>(I) &&
648 unsigned ResultReg = fastEmit_ri_(VT.
getSimpleVT(), ISDOpcode, Op0,
654 updateValueMap(I, ResultReg);
658 unsigned Op1 = getRegForValue(I->
getOperand(1));
661 bool Op1IsKill = hasTrivialKill(I->
getOperand(1));
665 ISDOpcode, Op0, Op0IsKill, Op1, Op1IsKill);
672 updateValueMap(I, ResultReg);
680 bool NIsKill = hasTrivialKill(I->
getOperand(0));
684 uint64_t TotalOffs = 0;
686 uint64_t MaxOffs = 2048;
687 MVT VT = TLI.getPointerTy(DL);
690 const Value *Idx = GTI.getOperand();
691 if (
StructType *StTy = GTI.getStructTypeOrNull()) {
692 uint64_t
Field = cast<ConstantInt>(Idx)->getZExtValue();
695 TotalOffs += DL.getStructLayout(StTy)->getElementOffset(Field);
696 if (TotalOffs >= MaxOffs) {
697 N = fastEmit_ri_(VT,
ISD::ADD, N, NIsKill, TotalOffs, VT);
705 Type *Ty = GTI.getIndexedType();
708 if (
const auto *CI = dyn_cast<ConstantInt>(Idx)) {
712 uint64_t IdxN = CI->getValue().sextOrTrunc(64).getSExtValue();
713 TotalOffs += DL.getTypeAllocSize(Ty) * IdxN;
714 if (TotalOffs >= MaxOffs) {
715 N = fastEmit_ri_(VT,
ISD::ADD, N, NIsKill, TotalOffs, VT);
724 N = fastEmit_ri_(VT,
ISD::ADD, N, NIsKill, TotalOffs, VT);
732 uint64_t ElementSize = DL.getTypeAllocSize(Ty);
733 std::pair<unsigned, bool> Pair = getRegForGEPIndex(Idx);
734 unsigned IdxN = Pair.first;
735 bool IdxNIsKill = Pair.second;
739 if (ElementSize != 1) {
740 IdxN = fastEmit_ri_(VT,
ISD::MUL, IdxN, IdxNIsKill, ElementSize, VT);
745 N = fastEmit_rr(VT, VT,
ISD::ADD, N, NIsKill, IdxN, IdxNIsKill);
751 N = fastEmit_ri_(VT,
ISD::ADD, N, NIsKill, TotalOffs, VT);
757 updateValueMap(I, N);
762 const CallInst *CI,
unsigned StartIdx) {
766 if (
const auto *
C = dyn_cast<ConstantInt>(Val)) {
769 }
else if (isa<ConstantPointerNull>(Val)) {
772 }
else if (
auto *AI = dyn_cast<AllocaInst>(Val)) {
776 auto SI = FuncInfo.StaticAllocaMap.find(AI);
777 if (
SI != FuncInfo.StaticAllocaMap.end())
782 unsigned Reg = getRegForValue(Val);
795 "Stackmap cannot return a value.");
811 "Expected a constant integer.");
816 "Expected a constant integer.");
817 const auto *NumBytes =
831 const MCPhysReg *ScratchRegs = TLI.getScratchRegisters(CC);
832 for (
unsigned i = 0; ScratchRegs[i]; ++i)
834 ScratchRegs[i],
true,
true,
false,
835 false,
false,
true));
838 unsigned AdjStackDown =
TII.getCallFrameSetupOpcode();
840 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
TII.get(AdjStackDown));
841 const MCInstrDesc &MCID = Builder.getInstr()->getDesc();
842 for (
unsigned I = 0,
E = MCID.getNumOperands(); I <
E; ++
I)
847 TII.get(TargetOpcode::STACKMAP));
848 for (
auto const &MO : Ops)
852 unsigned AdjStackUp =
TII.getCallFrameDestroyOpcode();
853 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
TII.get(AdjStackUp))
868 bool FastISel::lowerCallOperands(
const CallInst *CI,
unsigned ArgIdx,
872 Args.reserve(NumArgs);
876 for (
unsigned ArgI = ArgIdx, ArgE = ArgIdx + NumArgs; ArgI != ArgE; ++ArgI) {
884 Entry.setAttributes(&CS, ArgI);
885 Args.push_back(Entry);
892 return lowerCallTo(CLI);
901 return setCallee(CC, ResultTy, Sym, std::move(ArgsList), FixedArgs);
918 "Expected a constant integer.");
919 const auto *NumArgsVal =
921 unsigned NumArgs = NumArgsVal->getZExtValue();
927 "Not enough arguments provided to the patchpoint intrinsic");
930 unsigned NumCallArgs = IsAnyRegCC ? 0 : NumArgs;
933 if (!lowerCallOperands(I, NumMetaOpers, NumCallArgs, Callee, IsAnyRegCC, CLI))
936 assert(CLI.
Call &&
"No call instruction specified.");
941 if (IsAnyRegCC && HasDef) {
950 "Expected a constant integer.");
955 "Expected a constant integer.");
956 const auto *NumBytes =
961 if (
const auto *
C = dyn_cast<IntToPtrInst>(Callee)) {
962 uint64_t CalleeConstAddr =
963 cast<ConstantInt>(
C->
getOperand(0))->getZExtValue();
965 }
else if (
const auto *
C = dyn_cast<ConstantExpr>(Callee)) {
966 if (
C->
getOpcode() == Instruction::IntToPtr) {
967 uint64_t CalleeConstAddr =
968 cast<ConstantInt>(
C->
getOperand(0))->getZExtValue();
972 }
else if (
const auto *GV = dyn_cast<GlobalValue>(Callee)) {
974 }
else if (isa<ConstantPointerNull>(Callee))
981 unsigned NumCallRegArgs = IsAnyRegCC ? NumArgs : CLI.
OutRegs.
size();
990 for (
unsigned i = NumMetaOpers, e = NumMetaOpers + NumArgs; i != e; ++i) {
1008 TRI.getCallPreservedMask(*FuncInfo.MF, CC)));
1011 const MCPhysReg *ScratchRegs = TLI.getScratchRegisters(CC);
1012 for (
unsigned i = 0; ScratchRegs[i]; ++i)
1014 ScratchRegs[i],
true,
true,
false,
1015 false,
false,
true));
1024 TII.get(TargetOpcode::PATCHPOINT));
1026 for (
auto &MO : Ops)
1035 FuncInfo.MF->getFrameInfo().setHasPatchPoint();
1043 const auto &
Triple =
TM.getTargetTriple();
1052 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
1053 TII.get(TargetOpcode::PATCHABLE_EVENT_CALL));
1054 for (
auto &MO : Ops)
1062 const auto &
Triple =
TM.getTargetTriple();
1073 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
1074 TII.get(TargetOpcode::PATCHABLE_TYPED_EVENT_CALL));
1075 for (
auto &MO : Ops)
1103 return lowerCallTo(CI, Sym, NumArgs);
1114 Args.reserve(NumArgs);
1118 for (
unsigned ArgI = 0; ArgI != NumArgs; ++ArgI) {
1126 Entry.setAttributes(&CS, ArgI);
1127 Args.push_back(Entry);
1132 CLI.
setCallee(RetTy, FTy, Symbol, std::move(Args), CS, NumArgs);
1134 return lowerCallTo(CLI);
1146 bool CanLowerReturn = TLI.CanLowerReturn(
1150 if (!CanLowerReturn)
1153 for (
unsigned I = 0,
E = RetTys.
size();
I !=
E; ++
I) {
1157 for (
unsigned i = 0; i != NumRegs; ++i) {
1159 MyFlags.
VT = RegisterVT;
1168 CLI.
Ins.push_back(MyFlags);
1177 FinalType = cast<PointerType>(
Arg.Ty)->getElementType();
1178 bool NeedsRegBlock = TLI.functionArgumentNeedsConsecutiveRegisters(
1190 if (
Arg.IsSwiftSelf)
1192 if (
Arg.IsSwiftError)
1196 if (
Arg.IsInAlloca) {
1205 if (
Arg.IsByVal ||
Arg.IsInAlloca) {
1208 unsigned FrameSize = DL.getTypeAllocSize(ElementTy);
1211 unsigned FrameAlign =
Arg.Alignment;
1213 FrameAlign = TLI.getByValTypeAlignment(ElementTy, DL);
1221 unsigned OriginalAlignment = DL.getABITypeAlignment(
Arg.Ty);
1228 if (!fastLowerCall(CLI))
1232 assert(CLI.
Call &&
"No call instruction specified.");
1264 Args.push_back(Entry);
1275 .setTailCall(IsTailCall);
1277 return lowerCallTo(CLI);
1281 const CallInst *Call = cast<CallInst>(
I);
1287 if (IA->hasSideEffects())
1288 flushLocalValueMap();
1291 if (!IA->getConstraintString().empty())
1294 unsigned ExtraInfo = 0;
1295 if (IA->hasSideEffects())
1297 if (IA->isAlignStack())
1300 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
1302 .addExternalSymbol(IA->getAsmString().c_str())
1311 if (
const auto *II = dyn_cast<IntrinsicInst>(Call))
1312 return selectIntrinsicCall(II);
1321 flushLocalValueMap();
1323 return lowerCall(Call);
1343 if (!FuncInfo.MF->getMMI().hasDebugInfo()) {
1349 if (!Address || isa<UndefValue>(Address)) {
1358 if (
Arg && FuncInfo.getArgumentFrameIndex(
Arg) != INT_MAX)
1362 if (
unsigned Reg = lookUpRegForValue(Address))
1376 if (!Op && !Address->
use_empty() && isa<Instruction>(Address) &&
1377 (!isa<AllocaInst>(Address) ||
1378 !FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(Address))))
1384 "Expected inlined-at fields to agree");
1387 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
1388 TII.get(TargetOpcode::DBG_VALUE),
true,
1403 "Expected inlined-at fields to agree");
1407 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II,
false, 0U,
1409 }
else if (
const auto *CI = dyn_cast<ConstantInt>(V)) {
1410 if (CI->getBitWidth() > 64)
1411 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)
1417 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)
1418 .
addImm(CI->getZExtValue())
1422 }
else if (
const auto *CF = dyn_cast<ConstantFP>(V)) {
1423 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)
1428 }
else if (
unsigned Reg = lookUpRegForValue(V)) {
1430 bool IsIndirect =
false;
1431 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, IsIndirect,
Reg,
1443 if (!FuncInfo.MF->getMMI().hasDebugInfo()) {
1448 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
1449 TII.get(TargetOpcode::DBG_LABEL)).addMetadata(DI->
getLabel());
1454 unsigned long long Res = CI->
isZero() ? -1ULL : 0;
1456 unsigned ResultReg = getRegForValue(ResCI);
1459 updateValueMap(II, ResultReg);
1464 unsigned ResultReg = getRegForValue(ResCI);
1467 updateValueMap(II, ResultReg);
1476 updateValueMap(II, ResultReg);
1480 return selectStackmap(II);
1483 return selectPatchpoint(II);
1486 return selectXRayCustomEvent(II);
1488 return selectXRayTypedEvent(II);
1491 return fastLowerIntrinsicCall(II);
1496 EVT DstVT = TLI.getValueType(DL, I->
getType());
1504 if (!TLI.isTypeLegal(DstVT))
1508 if (!TLI.isTypeLegal(SrcVT))
1511 unsigned InputReg = getRegForValue(I->
getOperand(0));
1516 bool InputRegIsKill = hasTrivialKill(I->
getOperand(0));
1519 Opcode, InputReg, InputRegIsKill);
1523 updateValueMap(I, ResultReg);
1533 updateValueMap(I, Reg);
1539 EVT DstEVT = TLI.getValueType(DL, I->
getType());
1541 !TLI.isTypeLegal(SrcEVT) || !TLI.isTypeLegal(DstEVT))
1547 unsigned Op0 = getRegForValue(I->
getOperand(0));
1550 bool Op0IsKill = hasTrivialKill(I->
getOperand(0));
1553 unsigned ResultReg = 0;
1554 if (SrcVT == DstVT) {
1558 if (SrcClass == DstClass) {
1559 ResultReg = createResultReg(DstClass);
1560 BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
1561 TII.get(TargetOpcode::COPY), ResultReg).addReg(Op0);
1567 ResultReg = fastEmit_r(SrcVT, DstVT,
ISD::BITCAST, Op0, Op0IsKill);
1572 updateValueMap(I, ResultReg);
1578 void FastISel::removeDeadLocalValueCode(
MachineInstr *SavedLastLocalValue)
1581 if (CurLastLocalValue != SavedLastLocalValue) {
1586 if (SavedLastLocalValue)
1589 FirstDeadInst = FuncInfo.MBB->getFirstNonPHI();
1590 setLastLocalValue(SavedLastLocalValue);
1591 removeDeadCode(FirstDeadInst, FuncInfo.InsertPt);
1596 MachineInstr *SavedLastLocalValue = getLastLocalValue();
1600 if (!handlePHINodesInSuccessorBlocks(I->
getParent())) {
1605 removeDeadLocalValueCode(SavedLastLocalValue);
1612 for (
unsigned i = 0, e = CS.getNumOperandBundles(); i != e; ++i)
1618 SavedInsertPt = FuncInfo.InsertPt;
1620 if (
const auto *Call = dyn_cast<CallInst>(I)) {
1621 const Function *
F = Call->getCalledFunction();
1627 LibInfo->getLibFunc(F->
getName(), Func) &&
1628 LibInfo->hasOptimizedCodeGen(Func))
1633 Call->hasFnAttr(
"trap-func-name"))
1638 if (!SkipTargetIndependentISel) {
1639 if (selectOperator(I, I->
getOpcode())) {
1640 ++NumFastIselSuccessIndependent;
1645 recomputeInsertPt();
1646 if (SavedInsertPt != FuncInfo.InsertPt)
1647 removeDeadCode(FuncInfo.InsertPt, SavedInsertPt);
1648 SavedInsertPt = FuncInfo.InsertPt;
1651 if (fastSelectInstruction(I)) {
1652 ++NumFastIselSuccessTarget;
1657 recomputeInsertPt();
1658 if (SavedInsertPt != FuncInfo.InsertPt)
1659 removeDeadCode(FuncInfo.InsertPt, SavedInsertPt);
1666 removeDeadLocalValueCode(SavedLastLocalValue);
1667 FuncInfo.PHINodesToUpdate.resize(FuncInfo.OrigNumPHINodesToUpdate);
1676 if (FuncInfo.MBB->getBasicBlock()->size() > 1 &&
1677 FuncInfo.MBB->isLayoutSuccessor(MSucc)) {
1691 FuncInfo.MBB->addSuccessorWithoutProb(MSucc);
1700 if (TrueMBB != FalseMBB) {
1703 FuncInfo.BPI->getEdgeProbability(BranchBB, TrueMBB->
getBasicBlock());
1706 FuncInfo.MBB->addSuccessorWithoutProb(TrueMBB);
1709 fastEmitBranch(FalseMBB, DbgLoc);
1717 unsigned OpReg = getRegForValue(X);
1720 bool OpRegIsKill = hasTrivialKill(I);
1725 OpReg, OpRegIsKill);
1727 updateValueMap(I, ResultReg);
1736 if (!TLI.isTypeLegal(IntVT))
1744 unsigned IntResultReg = fastEmit_ri_(
1751 IntResultReg,
true);
1755 updateValueMap(I, ResultReg);
1766 EVT RealVT = TLI.getValueType(DL, EVI->
getType(),
true);
1770 if (!TLI.isTypeLegal(VT) && VT !=
MVT::i1)
1779 if (I != FuncInfo.ValueMap.
end())
1780 ResultReg = I->second;
1781 else if (isa<Instruction>(Op0))
1782 ResultReg = FuncInfo.InitializeRegForValue(Op0);
1792 for (
unsigned i = 0; i < VTIndex; i++)
1793 ResultReg += TLI.getNumRegisters(FuncInfo.Fn->getContext(), AggValueVTs[i]);
1795 updateValueMap(EVI, ResultReg);
1803 case Instruction::FAdd:
1805 case Instruction::Sub:
1807 case Instruction::FSub:
1810 case Instruction::Mul:
1812 case Instruction::FMul:
1814 case Instruction::SDiv:
1816 case Instruction::UDiv:
1818 case Instruction::FDiv:
1820 case Instruction::SRem:
1822 case Instruction::URem:
1824 case Instruction::FRem:
1826 case Instruction::Shl:
1828 case Instruction::LShr:
1830 case Instruction::AShr:
1832 case Instruction::And:
1834 case Instruction::Or:
1836 case Instruction::Xor:
1839 case Instruction::GetElementPtr:
1840 return selectGetElementPtr(I);
1842 case Instruction::Br: {
1857 case Instruction::Unreachable:
1858 if (
TM.Options.TrapUnreachable)
1863 case Instruction::Alloca:
1865 if (FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(I)))
1872 return selectCall(I);
1874 case Instruction::BitCast:
1875 return selectBitCast(I);
1877 case Instruction::FPToSI:
1879 case Instruction::ZExt:
1881 case Instruction::SExt:
1883 case Instruction::Trunc:
1885 case Instruction::SIToFP:
1888 case Instruction::IntToPtr:
1889 case Instruction::PtrToInt: {
1891 EVT DstVT = TLI.getValueType(DL, I->
getType());
1899 updateValueMap(I, Reg);
1903 case Instruction::ExtractValue:
1904 return selectExtractValue(I);
1906 case Instruction::PHI:
1917 bool SkipTargetIndependentISel)
1918 : FuncInfo(FuncInfo), MF(FuncInfo.MF),
MRI(FuncInfo.MF->getRegInfo()),
1919 MFI(FuncInfo.MF->getFrameInfo()), MCP(*FuncInfo.MF->getConstantPool()),
1920 TM(FuncInfo.MF->getTarget()), DL(MF->getDataLayout()),
1921 TII(*MF->getSubtarget().getInstrInfo()),
1922 TLI(*MF->getSubtarget().getTargetLowering()),
1923 TRI(*MF->getSubtarget().getRegisterInfo()), LibInfo(LibInfo),
1924 SkipTargetIndependentISel(SkipTargetIndependentISel) {}
1968 bool Op0IsKill, uint64_t Imm,
MVT ImmType) {
1986 unsigned ResultReg =
fastEmit_ri(VT, VT, Opcode, Op0, Op0IsKill, Imm);
1990 bool IsImmKill =
true;
2007 return fastEmit_rr(VT, VT, Opcode, Op0, Op0IsKill, MaterialReg, IsImmKill);
2024 TII.
get(TargetOpcode::COPY), NewOp).addReg(Op);
2063 bool Op0IsKill,
unsigned Op1,
2087 bool Op0IsKill,
unsigned Op1,
2088 bool Op1IsKill,
unsigned Op2,
2115 bool Op0IsKill, uint64_t Imm) {
2137 bool Op0IsKill, uint64_t Imm1,
2181 bool Op0IsKill,
unsigned Op1,
2182 bool Op1IsKill, uint64_t Imm) {
2225 "Cannot yet extract from physregs");
2245 bool FastISel::handlePHINodesInSuccessorBlocks(
const BasicBlock *LLVMBB) {
2255 if (!isa<PHINode>(SuccBB->
begin()))
2261 if (!SuccsHandled.
insert(SuccMBB).second)
2289 const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
2293 DbgLoc = PN.getDebugLoc();
2294 if (
const auto *Inst = dyn_cast<Instruction>(PHIOp))
2295 DbgLoc = Inst->getDebugLoc();
2312 "tryToFoldLoad expected a LoadInst with a single use");
2316 unsigned MaxUsers = 6;
2319 while (TheUser != FoldInst &&
2332 if (TheUser != FoldInst)
2368 if (!isa<AddOperator>(Add))
2375 if (isa<Instruction>(Add) &&
2379 return isa<ConstantInt>(cast<AddOperator>(
Add)->getOperand(1));
2390 if (
const auto *LI = dyn_cast<LoadInst>(I)) {
2391 Alignment = LI->getAlignment();
2392 IsVolatile = LI->isVolatile();
2394 Ptr = LI->getPointerOperand();
2395 ValTy = LI->getType();
2396 }
else if (
const auto *
SI = dyn_cast<StoreInst>(I)) {
2397 Alignment =
SI->getAlignment();
2398 IsVolatile =
SI->isVolatile();
2400 Ptr =
SI->getPointerOperand();
2401 ValTy =
SI->getValueOperand()->getType();
2407 bool IsDereferenceable =
2423 if (IsDereferenceable)
2429 Alignment, AAInfo, Ranges);
2438 switch (Predicate) {
void setHasStackMap(bool s=true)
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
unsigned fastEmitInst_rrr(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill, unsigned Op2, bool Op2IsKill)
Emit a MachineInstr with three register operands and a result register in the given register class...
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
void setByValAlign(unsigned A)
const MachineInstrBuilder & add(const MachineOperand &MO) const
A parsed version of the target data layout string in and methods for querying it. ...
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
This class is the base class for the comparison instructions.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
unsigned fastEmitZExtFromI1(MVT VT, unsigned Op0, bool Op0IsKill)
Emit MachineInstrs to compute the value of Op with all but the least significant bit set to zero...
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
bool hasLocalLinkage() const
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
This class represents an incoming formal argument to a Function.
bool lowerCall(const CallInst *I)
unsigned arg_size() const
CallingConv::ID getCallingConv() const
Get the calling convention of the call.
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
This represents the llvm.dbg.label instruction.
This class represents lattice values for constants.
unsigned OrigNumPHINodesToUpdate
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
BasicBlock * getSuccessor(unsigned Idx) const
Return the specified successor. This instruction must be a terminator.
constexpr char IsVolatile[]
Key for Kernel::Arg::Metadata::mIsVolatile.
bool selectXRayTypedEvent(const CallInst *II)
bool selectGetElementPtr(const User *I)
void leaveLocalValueArea(SavePoint Old)
Reset InsertPt to the given old insert position.
void push_back(const T &Elt)
Describe properties that are true of each instruction in the target description file.
static bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
bool selectStackmap(const CallInst *I)
This class represents a function call, abstracting a target machine's calling convention.
virtual bool tryToFoldLoadIntoMI(MachineInstr *, unsigned, const LoadInst *)
The specified machine instr operand is a vreg, and that vreg is being provided by the specified load ...
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
gep_type_iterator gep_type_end(const User *GEP)
0 1 0 0 True if ordered and less than
MachineMemOperand * createMachineMemOperandFor(const Instruction *I) const
Create a machine mem operand from the given instruction.
LLVMContext & getContext() const
All values hold a context through their type.
bool isTerminator() const
1 1 1 0 True if unordered or not equal
virtual unsigned fastEmit_(MVT VT, MVT RetVT, unsigned Opcode)
This method is called by target-independent code to request that an instruction with the given type a...
BasicBlock * getSuccessor(unsigned i) const
void setInConsecutiveRegs()
virtual const TargetRegisterClass * getRegClassFor(MVT VT) const
Return the register class that should be used for the specified value type.
STATISTIC(NumFunctions, "Total number of functions")
unsigned const TargetRegisterInfo * TRI
SmallVector< unsigned, 4 > InRegs
An instruction for reading from memory.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
virtual unsigned fastEmit_i(MVT VT, MVT RetVT, unsigned Opcode, uint64_t Imm)
This method is called by target-independent code to request that an instruction with the given type...
iterator_range< mop_iterator > operands()
void setPhysRegsDeadExcept(ArrayRef< unsigned > UsedRegs, const TargetRegisterInfo &TRI)
Mark every physreg used by this instruction as dead except those in the UsedRegs list.
static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
void computeUsesVAFloatArgument(const CallInst &I, MachineModuleInfo &MMI)
Determine if any floating-point values are being passed to this variadic function, and set the MachineModuleInfo's usesVAFloatArgument flag if so.
virtual bool fastLowerCall(CallLoweringInfo &CLI)
This method is called by target-independent code to do target- specific call lowering.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
iterator begin()
Instruction iterator methods.
bool selectInstruction(const Instruction *I)
Do "fast" instruction selection for the given LLVM IR instruction and append the generated machine in...
Value * getArgOperand(unsigned i) const
unsigned fastEmitInst_rii(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, uint64_t Imm1, uint64_t Imm2)
Emit a MachineInstr with one register operand and two immediate operands.
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
1 0 0 1 True if unordered or equal
bool match(Val *V, const Pattern &P)
unsigned fastEmitInst_ri(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, uint64_t Imm)
Emit a MachineInstr with a register operand, an immediate, and a result register in the given registe...
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
unsigned fastEmitInst_rri(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill, uint64_t Imm)
Emit a MachineInstr with two register operands, an immediate, and a result register in the given regi...
CmpInst::Predicate optimizeCmpPredicate(const CmpInst *CI) const
bool isVolatile() const
Return true if this is a load from a volatile memory location.
A description of a memory reference used in the backend.
const HexagonInstrInfo * TII
TargetLoweringBase::ArgListTy ArgListTy
Shift and rotation operations.
const TargetRegisterClass * getRegClass(const MCInstrDesc &MCID, unsigned OpNum, const TargetRegisterInfo *TRI, const MachineFunction &MF) const
Given a machine instruction descriptor, returns the register class constraint for OpNum...
Class to represent struct types.
A Use represents the edge between a Value definition and its users.
DILabel * getLabel() const
bool canFoldAddIntoGEP(const User *GEP, const Value *Add)
Check if Add is an add that can be safely folded into GEP.
MachineBasicBlock iterator that automatically skips over MIs that are inside bundles (i...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
unsigned fastEmitInst_r(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill)
Emit a MachineInstr with one register operand and a result register in the given register class...
0 1 0 1 True if ordered and less than or equal
This file contains the simple types necessary to represent the attributes associated with functions a...
InstrTy * getInstruction() const
The memory access is dereferenceable (i.e., doesn't trap).
static MachineOperand CreateRegMask(const uint32_t *Mask)
CreateRegMask - Creates a register mask operand referencing Mask.
virtual const TargetRegisterClass * getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const
Returns the largest legal sub-class of RC that supports the sub-register index Idx.
void setByValSize(unsigned S)
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, uint64_t s, unsigned base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
INLINEASM - Represents an inline asm block.
bool selectIntrinsicCall(const IntrinsicInst *II)
bool selectCast(const User *I, unsigned Opcode)
unsigned getSizeInBits() const
Context object for machine code objects.
Class to represent function types.
unsigned getSizeInBits() const
Return the size of the specified value type in bits.
SmallVector< ISD::InputArg, 4 > Ins
Type * getType() const
All values are typed, get the type of this value.
unsigned constrainOperandRegClass(const MCInstrDesc &II, unsigned Op, unsigned OpNum)
Try to constrain Op so that it is usable by argument OpNum of the provided MCInstrDesc.
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
bool selectOperator(const User *I, unsigned Opcode)
Do "fast" instruction selection for the given LLVM IR operator (Instruction or ConstantExpr), and append generated machine instructions to the current block.
ArchType getArch() const
getArch - Get the parsed architecture type of this triple.
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
bool selectExtractValue(const User *U)
unsigned getRegForValue(const Value *V)
Create a virtual register and arrange for it to be assigned the value for the given LLVM value...
Simple integer binary arithmetic operators.
unsigned fastEmitInst_(unsigned MachineInstOpcode, const TargetRegisterClass *RC)
Emit a MachineInstr with no operands and a result register in the given register class.
const MachineInstrBuilder & addFPImm(const ConstantFP *Val) const
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool hasTrivialKill(const Value *V)
Test whether the given value has exactly one use.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
void setOrigAlign(unsigned A)
amdgpu Simplify well known AMD library false Value * Callee
void ComputeValueVTs(const TargetLowering &TLI, const DataLayout &DL, Type *Ty, SmallVectorImpl< EVT > &ValueVTs, SmallVectorImpl< uint64_t > *Offsets=nullptr, uint64_t StartingOffset=0)
ComputeValueVTs - Given an LLVM IR type, compute a sequence of EVTs that represent all the individual...
const TargetRegisterClass * constrainRegClass(unsigned Reg, const TargetRegisterClass *RC, unsigned MinNumRegs=0)
constrainRegClass - Constrain the register class of the specified virtual register to be a common sub...
unsigned getNumSuccessors() const
Return the number of successors that this instruction has.
Value * getOperand(unsigned i) const
Class to represent pointers.
unsigned getKillRegState(bool B)
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
unsigned lookUpRegForValue(const Value *V)
Look up the value to see if its value is already cached in a register.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
void finishBasicBlock()
Flush the local value map and sink local values if possible.
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
void setAttributes(ImmutableCallSite *CS, unsigned ArgIdx)
Set CallLoweringInfo attribute flags based on a call instruction and called function attributes...
bool isVoidTy() const
Return true if this is 'void'.
The memory access is volatile.
static unsigned selectBinaryOp(unsigned GenericOpc, unsigned RegBankID, unsigned OpSize)
Select the AArch64 opcode for the basic binary operation GenericOpc (such as G_OR or G_SDIV)...
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
void getAAMetadata(AAMDNodes &N, bool Merge=false) const
Fills the AAMDNodes structure with AA metadata from this instruction.
initializer< Ty > init(const Ty &Val)
Type * getReturnType() const
Returns the type of the ret val.
* if(!EatIfPresent(lltok::kw_thread_local)) return false
ParseOptionalThreadLocal := /*empty.
std::vector< std::pair< MachineInstr *, unsigned > > PHINodesToUpdate
PHINodesToUpdate - A list of phi instructions whose operand list will be updated after processing the...
unsigned const MachineRegisterInfo * MRI
CallLoweringInfo & setCallee(Type *ResultTy, FunctionType *FuncTy, const Value *Target, ArgListTy &&ArgsList, ImmutableCallSite &Call)
Value * getCalledValue() const
LLVM Basic Block Representation.
const MachineInstrBuilder & addCImm(const ConstantInt *Val) const
The instances of the Type class are immutable: once they are created, they are never changed...
Simple binary floating point operators.
Conditional or Unconditional Branch instruction.
Value * getAddress() const
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This is an important base class in LLVM.
void removeDeadCode(MachineBasicBlock::iterator I, MachineBasicBlock::iterator E)
Remove all dead instructions between the I and E.
SmallVector< ISD::ArgFlagsTy, 16 > OutFlags
This file contains the declarations for the subclasses of Constant, which represent the different fla...
ConstantFP - Floating Point Values [float, double].
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
const MCPhysReg * ImplicitDefs
DIExpression * getExpression() const
virtual unsigned fastEmit_r(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill)
This method is called by target-independent code to request that an instruction with the given type...
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this variable.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
static Type * getVoidTy(LLVMContext &C)
bool tryToFoldLoad(const LoadInst *LI, const Instruction *FoldInst)
We're checking to see if we can fold LI into FoldInst.
bool lowerArguments()
Do "fast" instruction selection for function arguments and append the machine instructions to the cur...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
std::pair< unsigned, bool > getRegForGEPIndex(const Value *Idx)
This is a wrapper around getRegForValue that also takes care of truncating or sign-extending the give...
static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, unsigned char TargetFlags=0)
TRAP - Trapping instruction.
bool isValid() const
Check for null.
0 1 1 1 True if ordered (no nans)
self_iterator getIterator()
The memory access is non-temporal.
Class to represent integer types.
bool selectXRayCustomEvent(const CallInst *II)
const TargetRegisterInfo & TRI
1 1 1 1 Always true (always folded)
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function. ...
static unsigned findSinkableLocalRegDef(MachineInstr &MI)
Return the defined register if this instruction defines exactly one virtual register and uses no othe...
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs, and aliases.
bool selectFNeg(const User *I)
Emit an FNeg operation.
This class contains a discriminated union of information about pointers in memory operands...
1 1 0 1 True if unordered, less than, or equal
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
SmallVector< Value *, 16 > OutVals
static AttributeList getReturnAttrs(FastISel::CallLoweringInfo &CLI)
Returns an AttributeList representing the attributes applied to the return value of the given call...
const TargetInstrInfo & TII
MachineBasicBlock * MBB
MBB - The current block.
bool isInTailCallPosition(ImmutableCallSite CS, const TargetMachine &TM)
Test if the given instruction is in a position to be optimized with a tail-call.
Triple - Helper class for working with autoconf configuration names.
EH_LABEL - Represents a label in mid basic block used to track locations needed for debug and excepti...
void recomputeInsertPt()
Reset InsertPt to prepare for inserting instructions into the current block.
The memory access writes data.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags...
0 0 1 0 True if ordered and greater than
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
virtual unsigned fastEmit_rr(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill)
This method is called by target-independent code to request that an instruction with the given type...
Iterator for intrusive lists based on ilist_node.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements...
This is the shared class of boolean and integer constants.
virtual unsigned fastEmit_ri(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0, bool Op0IsKill, uint64_t Imm)
This method is called by target-independent code to request that an instruction with the given type...
MachineOperand class - Representation of each machine instruction operand.
1 1 0 0 True if unordered or less than
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
bool selectCall(const User *I)
Instruction * user_back()
Specialize the methods defined in Value, as we know that an instruction can only be used by other ins...
Provides information about what library functions are available for the current target.
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
void finishCondBranch(const BasicBlock *BranchBB, MachineBasicBlock *TrueMBB, MachineBasicBlock *FalseMBB)
Emit an unconditional branch to FalseMBB, obtains the branch weight and adds TrueMBB and FalseMBB to ...
unsigned getABITypeAlignment(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
bool isOSLinux() const
Tests whether the OS is Linux.
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
reg_iterator reg_begin(unsigned RegNo) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
Insert branch code into the end of the specified MachineBasicBlock.
unsigned fastEmitInst_rr(unsigned MachineInstOpcode, const TargetRegisterClass *RC, unsigned Op0, bool Op0IsKill, unsigned Op1, bool Op1IsKill)
Emit a MachineInstr with two register operands and a result register in the given register class...
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
void updateValueMap(const Value *I, unsigned Reg, unsigned NumRegs=1)
Update the value map to include the new mapping for this instruction, or insert an extra copy to get ...
unsigned getNumDefs() const
Return the number of MachineOperands that are register definitions.
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
void startNewBlock()
Set the current block to which generated machine instructions will be appended.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool selectBitCast(const User *I)
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
Target - Wrapper for Target specific information.
virtual unsigned fastEmit_f(MVT VT, MVT RetVT, unsigned Opcode, const ConstantFP *FPImm)
This method is called by target-independent code to request that an instruction with the given type...
SmallVector< unsigned, 16 > OutRegs
bool selectBinaryOp(const User *I, unsigned ISDOpcode)
Select and emit code for a binary operator instruction, which has an opcode which directly correspond...
void setDebugLoc(DebugLoc dl)
Replace current source information with new such.
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringRef > StandardNames)
Initialize the set of available library functions based on the specified target triple.
This file defines the FastISel class.
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Flags
Flags values. These may be or'd together.
amdgpu Simplify well known AMD library false Value Value * Arg
const MachineBasicBlock * getParent() const
The memory access reads data.
uint64_t getTypeSizeInBits(Type *Ty) const
Size examples:
SavePoint enterLocalValueArea()
Prepare InsertPt to begin inserting instructions into the local value area and return the old insert ...
Representation of each machine instruction.
Predicate getPredicate() const
Return the predicate for this instruction.
virtual bool fastLowerIntrinsicCall(const IntrinsicInst *II)
This method is called by target-independent code to do target- specific intrinsic lowering...
unsigned getOperandNo() const
getOperandNo - Return the operand # of this MachineOperand in its MachineInstr.
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
bool selectPatchpoint(const CallInst *I)
unsigned getNumArgOperands() const
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Bitwise operators - logical and, logical or, logical xor.
MachineRegisterInfo & MRI
bool hasOneUse(unsigned RegNo) const
hasOneUse - Return true if there is exactly one instruction using the specified register.
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
unsigned greater or equal
This represents the llvm.dbg.value instruction.
CallingConv::ID getCallingConv() const
bool lowerCallTo(const CallInst *CI, MCSymbol *Symbol, unsigned NumArgs)
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode...
StringRef getName() const
Return a constant reference to the value's name.
Establish a view to a call site for examination.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation.
unsigned fastEmitInst_i(unsigned MachineInstOpcode, const TargetRegisterClass *RC, uint64_t Imm)
Emit a MachineInstr with a single immediate operand, and a result register in the given register clas...
static MachineOperand CreateImm(int64_t Val)
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
static void addStackMapLiveVars(ImmutableCallSite CS, unsigned StartIdx, const SDLoc &DL, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's ope...
The memory access always returns the same value (or traps).
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
static bool isRegUsedByPhiNodes(unsigned DefReg, FunctionLoweringInfo &FuncInfo)
0 1 1 0 True if ordered and operands are unequal
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
MachineBasicBlock::iterator InsertPt
MBB - The current insert position inside the current block.
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
DILocalVariable * getVariable() const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
bool isUnconditional() const
1 0 1 0 True if unordered or greater than
static EVT getEVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
Type * getType() const
Return the type of the instruction that generated this call site.
const TargetLowering & TLI
unsigned createResultReg(const TargetRegisterClass *RC)
CallLoweringInfo & setIsPatchPoint(bool Value=true)
unsigned fastEmit_ri_(MVT VT, unsigned Opcode, unsigned Op0, bool Op0IsKill, uint64_t Imm, MVT ImmType)
This method is a wrapper of fastEmit_ri.
unsigned fastEmitInst_extractsubreg(MVT RetVT, unsigned Op0, bool Op0IsKill, uint32_t Idx)
Emit a MachineInstr for an extract_subreg from a specified index of a superregister to a specified ty...
MachineBasicBlock::iterator InsertPt
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
user_iterator user_begin()
FastISel(FunctionLoweringInfo &FuncInfo, const TargetLibraryInfo *LibInfo, bool SkipTargetIndependentISel=false)
virtual bool fastLowerArguments()
This method is called by target-independent code to do target- specific argument lowering.
0 0 0 1 True if ordered and equal
LLVM Value Representation.
1 0 1 1 True if unordered, greater than, or equal
uint64_t getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type...
FunctionType * getFunctionType() const
static const Function * getParent(const Value *V)
void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
DenseMap< const BasicBlock *, MachineBasicBlock * > MBBMap
MBBMap - A mapping from LLVM basic blocks to their machine code entry.
bool hasOneUse() const
Return true if there is exactly one user of this value.
void fastEmitBranch(MachineBasicBlock *MSucc, const DebugLoc &DbgLoc)
Emit an unconditional branch to the given block, unless it is the immediate (fall-through) successor...
StringRef - Represent a constant reference to a string, i.e.
static cl::opt< bool > SinkLocalValues("fast-isel-sink-local-values", cl::init(true), cl::Hidden, cl::desc("Sink local values in FastISel"))
unsigned fastEmitInst_f(unsigned MachineInstOpcode, const TargetRegisterClass *RC, const ConstantFP *FPImm)
Emit a MachineInstr with a floating point immediate, and a result register in the given register clas...
bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty...
FunctionLoweringInfo & FuncInfo
const Value * stripInBoundsConstantOffsets() const
Strip off pointer casts and all-constant inbounds GEPs.
TRUNCATE - Completely drop the high bits.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
0 0 1 1 True if ordered and greater than or equal
unsigned ComputeLinearIndex(Type *Ty, const unsigned *Indices, const unsigned *IndicesEnd, unsigned CurIndex=0)
Compute the linearized index of a member in a nested aggregate/struct/array.
reg_begin/reg_end - Provide iteration support to walk over all definitions and uses of a register wit...
This represents the llvm.dbg.declare instruction.
Perform various unary floating-point operations inspired by libm.
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
static MachineOperand CreateFI(int Idx)
bool isSafeToMove(AliasAnalysis *AA, bool &SawStore) const
Return true if it is safe to move this instruction.
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
Type * getElementType() const
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
static AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute >> Attrs)
Create an AttributeList with the specified parameters in it.
0 0 0 0 Always false (always folded)
A wrapper class for inspecting calls to intrinsic functions.
This class contains meta information specific to a module.
This file describes how to lower LLVM code to machine code.
const BasicBlock * getParent() const
gep_type_iterator gep_type_begin(const User *GEP)