LLVM 22.0.0git
IRTranslator.cpp
Go to the documentation of this file.
1//===- llvm/CodeGen/GlobalISel/IRTranslator.cpp - IRTranslator ---*- C++ -*-==//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This file implements the IRTranslator class.
10//===----------------------------------------------------------------------===//
11
14#include "llvm/ADT/STLExtras.h"
15#include "llvm/ADT/ScopeExit.h"
20#include "llvm/Analysis/Loads.h"
50#include "llvm/IR/BasicBlock.h"
51#include "llvm/IR/CFG.h"
52#include "llvm/IR/Constant.h"
53#include "llvm/IR/Constants.h"
54#include "llvm/IR/DataLayout.h"
57#include "llvm/IR/Function.h"
59#include "llvm/IR/InlineAsm.h"
60#include "llvm/IR/InstrTypes.h"
63#include "llvm/IR/Intrinsics.h"
64#include "llvm/IR/IntrinsicsAMDGPU.h"
65#include "llvm/IR/LLVMContext.h"
66#include "llvm/IR/Metadata.h"
68#include "llvm/IR/Statepoint.h"
69#include "llvm/IR/Type.h"
70#include "llvm/IR/User.h"
71#include "llvm/IR/Value.h"
73#include "llvm/MC/MCContext.h"
74#include "llvm/Pass.h"
77#include "llvm/Support/Debug.h"
84#include <algorithm>
85#include <cassert>
86#include <cstdint>
87#include <iterator>
88#include <optional>
89#include <string>
90#include <utility>
91#include <vector>
92
93#define DEBUG_TYPE "irtranslator"
94
95using namespace llvm;
96
97static cl::opt<bool>
98 EnableCSEInIRTranslator("enable-cse-in-irtranslator",
99 cl::desc("Should enable CSE in irtranslator"),
100 cl::Optional, cl::init(false));
101char IRTranslator::ID = 0;
102
103INITIALIZE_PASS_BEGIN(IRTranslator, DEBUG_TYPE, "IRTranslator LLVM IR -> MI",
104 false, false)
112
117 MF.getProperties().setFailedISel();
118
119 // Print the function name explicitly if we don't have a debug location (which
120 // makes the diagnostic less useful) or if we're going to emit a raw error.
121 if (!R.getLocation().isValid() || TPC.isGlobalISelAbortEnabled())
122 R << (" (in function: " + MF.getName() + ")").str();
123
124 if (TPC.isGlobalISelAbortEnabled())
125 report_fatal_error(Twine(R.getMsg()));
126 else
127 ORE.emit(R);
128}
129
131 : MachineFunctionPass(ID), OptLevel(optlevel) {}
132
133#ifndef NDEBUG
134namespace {
135/// Verify that every instruction created has the same DILocation as the
136/// instruction being translated.
137class DILocationVerifier : public GISelChangeObserver {
138 const Instruction *CurrInst = nullptr;
139
140public:
141 DILocationVerifier() = default;
142 ~DILocationVerifier() = default;
143
144 const Instruction *getCurrentInst() const { return CurrInst; }
145 void setCurrentInst(const Instruction *Inst) { CurrInst = Inst; }
146
147 void erasingInstr(MachineInstr &MI) override {}
148 void changingInstr(MachineInstr &MI) override {}
149 void changedInstr(MachineInstr &MI) override {}
150
151 void createdInstr(MachineInstr &MI) override {
152 assert(getCurrentInst() && "Inserted instruction without a current MI");
153
154 // Only print the check message if we're actually checking it.
155#ifndef NDEBUG
156 LLVM_DEBUG(dbgs() << "Checking DILocation from " << *CurrInst
157 << " was copied to " << MI);
158#endif
159 // We allow insts in the entry block to have no debug loc because
160 // they could have originated from constants, and we don't want a jumpy
161 // debug experience.
162 assert((CurrInst->getDebugLoc() == MI.getDebugLoc() ||
163 (MI.getParent()->isEntryBlock() && !MI.getDebugLoc()) ||
164 (MI.isDebugInstr())) &&
165 "Line info was not transferred to all instructions");
166 }
167};
168} // namespace
169#endif // ifndef NDEBUG
170
171
177 if (OptLevel != CodeGenOptLevel::None) {
180 }
185}
186
188IRTranslator::allocateVRegs(const Value &Val) {
189 auto VRegsIt = VMap.findVRegs(Val);
190 if (VRegsIt != VMap.vregs_end())
191 return *VRegsIt->second;
192 auto *Regs = VMap.getVRegs(Val);
193 auto *Offsets = VMap.getOffsets(Val);
194 SmallVector<LLT, 4> SplitTys;
195 computeValueLLTs(*DL, *Val.getType(), SplitTys,
196 Offsets->empty() ? Offsets : nullptr);
197 for (unsigned i = 0; i < SplitTys.size(); ++i)
198 Regs->push_back(0);
199 return *Regs;
200}
201
202ArrayRef<Register> IRTranslator::getOrCreateVRegs(const Value &Val) {
203 auto VRegsIt = VMap.findVRegs(Val);
204 if (VRegsIt != VMap.vregs_end())
205 return *VRegsIt->second;
206
207 if (Val.getType()->isVoidTy())
208 return *VMap.getVRegs(Val);
209
210 // Create entry for this type.
211 auto *VRegs = VMap.getVRegs(Val);
212 auto *Offsets = VMap.getOffsets(Val);
213
214 if (!Val.getType()->isTokenTy())
215 assert(Val.getType()->isSized() &&
216 "Don't know how to create an empty vreg");
217
218 SmallVector<LLT, 4> SplitTys;
219 computeValueLLTs(*DL, *Val.getType(), SplitTys,
220 Offsets->empty() ? Offsets : nullptr);
221
222 if (!isa<Constant>(Val)) {
223 for (auto Ty : SplitTys)
224 VRegs->push_back(MRI->createGenericVirtualRegister(Ty));
225 return *VRegs;
226 }
227
228 if (Val.getType()->isAggregateType()) {
229 // UndefValue, ConstantAggregateZero
230 auto &C = cast<Constant>(Val);
231 unsigned Idx = 0;
232 while (auto Elt = C.getAggregateElement(Idx++)) {
233 auto EltRegs = getOrCreateVRegs(*Elt);
234 llvm::append_range(*VRegs, EltRegs);
235 }
236 } else {
237 assert(SplitTys.size() == 1 && "unexpectedly split LLT");
238 VRegs->push_back(MRI->createGenericVirtualRegister(SplitTys[0]));
239 bool Success = translate(cast<Constant>(Val), VRegs->front());
240 if (!Success) {
241 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
243 &MF->getFunction().getEntryBlock());
244 R << "unable to translate constant: " << ore::NV("Type", Val.getType());
245 reportTranslationError(*MF, *TPC, *ORE, R);
246 return *VRegs;
247 }
248 }
249
250 return *VRegs;
251}
252
253int IRTranslator::getOrCreateFrameIndex(const AllocaInst &AI) {
254 auto [MapEntry, Inserted] = FrameIndices.try_emplace(&AI);
255 if (!Inserted)
256 return MapEntry->second;
257
258 uint64_t ElementSize = DL->getTypeAllocSize(AI.getAllocatedType());
259 uint64_t Size =
260 ElementSize * cast<ConstantInt>(AI.getArraySize())->getZExtValue();
261
262 // Always allocate at least one byte.
263 Size = std::max<uint64_t>(Size, 1u);
264
265 int &FI = MapEntry->second;
266 FI = MF->getFrameInfo().CreateStackObject(Size, AI.getAlign(), false, &AI);
267 return FI;
268}
269
270Align IRTranslator::getMemOpAlign(const Instruction &I) {
271 if (const StoreInst *SI = dyn_cast<StoreInst>(&I))
272 return SI->getAlign();
273 if (const LoadInst *LI = dyn_cast<LoadInst>(&I))
274 return LI->getAlign();
275 if (const AtomicCmpXchgInst *AI = dyn_cast<AtomicCmpXchgInst>(&I))
276 return AI->getAlign();
277 if (const AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(&I))
278 return AI->getAlign();
279
280 OptimizationRemarkMissed R("gisel-irtranslator", "", &I);
281 R << "unable to translate memop: " << ore::NV("Opcode", &I);
282 reportTranslationError(*MF, *TPC, *ORE, R);
283 return Align(1);
284}
285
286MachineBasicBlock &IRTranslator::getMBB(const BasicBlock &BB) {
287 MachineBasicBlock *MBB = FuncInfo.getMBB(&BB);
288 assert(MBB && "BasicBlock was not encountered before");
289 return *MBB;
290}
291
292void IRTranslator::addMachineCFGPred(CFGEdge Edge, MachineBasicBlock *NewPred) {
293 assert(NewPred && "new predecessor must be a real MachineBasicBlock");
294 MachinePreds[Edge].push_back(NewPred);
295}
296
297static bool containsBF16Type(const User &U) {
298 // BF16 cannot currently be represented by LLT, to avoid miscompiles we
299 // prevent any instructions using them. FIXME: This can be removed once LLT
300 // supports bfloat.
301 return U.getType()->getScalarType()->isBFloatTy() ||
302 any_of(U.operands(), [](Value *V) {
303 return V->getType()->getScalarType()->isBFloatTy();
304 });
305}
306
307bool IRTranslator::translateBinaryOp(unsigned Opcode, const User &U,
308 MachineIRBuilder &MIRBuilder) {
309 if (containsBF16Type(U))
310 return false;
311
312 // Get or create a virtual register for each value.
313 // Unless the value is a Constant => loadimm cst?
314 // or inline constant each time?
315 // Creation of a virtual register needs to have a size.
316 Register Op0 = getOrCreateVReg(*U.getOperand(0));
317 Register Op1 = getOrCreateVReg(*U.getOperand(1));
318 Register Res = getOrCreateVReg(U);
319 uint32_t Flags = 0;
320 if (isa<Instruction>(U)) {
321 const Instruction &I = cast<Instruction>(U);
323 }
324
325 MIRBuilder.buildInstr(Opcode, {Res}, {Op0, Op1}, Flags);
326 return true;
327}
328
329bool IRTranslator::translateUnaryOp(unsigned Opcode, const User &U,
330 MachineIRBuilder &MIRBuilder) {
331 if (containsBF16Type(U))
332 return false;
333
334 Register Op0 = getOrCreateVReg(*U.getOperand(0));
335 Register Res = getOrCreateVReg(U);
336 uint32_t Flags = 0;
337 if (isa<Instruction>(U)) {
338 const Instruction &I = cast<Instruction>(U);
340 }
341 MIRBuilder.buildInstr(Opcode, {Res}, {Op0}, Flags);
342 return true;
343}
344
345bool IRTranslator::translateFNeg(const User &U, MachineIRBuilder &MIRBuilder) {
346 return translateUnaryOp(TargetOpcode::G_FNEG, U, MIRBuilder);
347}
348
349bool IRTranslator::translateCompare(const User &U,
350 MachineIRBuilder &MIRBuilder) {
351 if (containsBF16Type(U))
352 return false;
353
354 auto *CI = cast<CmpInst>(&U);
355 Register Op0 = getOrCreateVReg(*U.getOperand(0));
356 Register Op1 = getOrCreateVReg(*U.getOperand(1));
357 Register Res = getOrCreateVReg(U);
358 CmpInst::Predicate Pred = CI->getPredicate();
360 if (CmpInst::isIntPredicate(Pred))
361 MIRBuilder.buildICmp(Pred, Res, Op0, Op1, Flags);
362 else if (Pred == CmpInst::FCMP_FALSE)
363 MIRBuilder.buildCopy(
364 Res, getOrCreateVReg(*Constant::getNullValue(U.getType())));
365 else if (Pred == CmpInst::FCMP_TRUE)
366 MIRBuilder.buildCopy(
367 Res, getOrCreateVReg(*Constant::getAllOnesValue(U.getType())));
368 else
369 MIRBuilder.buildFCmp(Pred, Res, Op0, Op1, Flags);
370
371 return true;
372}
373
374bool IRTranslator::translateRet(const User &U, MachineIRBuilder &MIRBuilder) {
375 const ReturnInst &RI = cast<ReturnInst>(U);
376 const Value *Ret = RI.getReturnValue();
377 if (Ret && DL->getTypeStoreSize(Ret->getType()).isZero())
378 Ret = nullptr;
379
380 ArrayRef<Register> VRegs;
381 if (Ret)
382 VRegs = getOrCreateVRegs(*Ret);
383
384 Register SwiftErrorVReg = 0;
385 if (CLI->supportSwiftError() && SwiftError.getFunctionArg()) {
386 SwiftErrorVReg = SwiftError.getOrCreateVRegUseAt(
387 &RI, &MIRBuilder.getMBB(), SwiftError.getFunctionArg());
388 }
389
390 // The target may mess up with the insertion point, but
391 // this is not important as a return is the last instruction
392 // of the block anyway.
393 return CLI->lowerReturn(MIRBuilder, Ret, VRegs, FuncInfo, SwiftErrorVReg);
394}
395
396void IRTranslator::emitBranchForMergedCondition(
398 MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB,
399 BranchProbability TProb, BranchProbability FProb, bool InvertCond) {
400 // If the leaf of the tree is a comparison, merge the condition into
401 // the caseblock.
402 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
403 CmpInst::Predicate Condition;
404 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
405 Condition = InvertCond ? IC->getInversePredicate() : IC->getPredicate();
406 } else {
407 const FCmpInst *FC = cast<FCmpInst>(Cond);
408 Condition = InvertCond ? FC->getInversePredicate() : FC->getPredicate();
409 }
410
411 SwitchCG::CaseBlock CB(Condition, false, BOp->getOperand(0),
412 BOp->getOperand(1), nullptr, TBB, FBB, CurBB,
413 CurBuilder->getDebugLoc(), TProb, FProb);
414 SL->SwitchCases.push_back(CB);
415 return;
416 }
417
418 // Create a CaseBlock record representing this branch.
421 Pred, false, Cond, ConstantInt::getTrue(MF->getFunction().getContext()),
422 nullptr, TBB, FBB, CurBB, CurBuilder->getDebugLoc(), TProb, FProb);
423 SL->SwitchCases.push_back(CB);
424}
425
426static bool isValInBlock(const Value *V, const BasicBlock *BB) {
427 if (const Instruction *I = dyn_cast<Instruction>(V))
428 return I->getParent() == BB;
429 return true;
430}
431
432void IRTranslator::findMergedConditions(
434 MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB,
436 BranchProbability FProb, bool InvertCond) {
437 using namespace PatternMatch;
438 assert((Opc == Instruction::And || Opc == Instruction::Or) &&
439 "Expected Opc to be AND/OR");
440 // Skip over not part of the tree and remember to invert op and operands at
441 // next level.
442 Value *NotCond;
443 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
444 isValInBlock(NotCond, CurBB->getBasicBlock())) {
445 findMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
446 !InvertCond);
447 return;
448 }
449
450 const Instruction *BOp = dyn_cast<Instruction>(Cond);
451 const Value *BOpOp0, *BOpOp1;
452 // Compute the effective opcode for Cond, taking into account whether it needs
453 // to be inverted, e.g.
454 // and (not (or A, B)), C
455 // gets lowered as
456 // and (and (not A, not B), C)
458 if (BOp) {
459 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
460 ? Instruction::And
461 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
462 ? Instruction::Or
464 if (InvertCond) {
465 if (BOpc == Instruction::And)
466 BOpc = Instruction::Or;
467 else if (BOpc == Instruction::Or)
468 BOpc = Instruction::And;
469 }
470 }
471
472 // If this node is not part of the or/and tree, emit it as a branch.
473 // Note that all nodes in the tree should have same opcode.
474 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
475 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
476 !isValInBlock(BOpOp0, CurBB->getBasicBlock()) ||
477 !isValInBlock(BOpOp1, CurBB->getBasicBlock())) {
478 emitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB, TProb, FProb,
479 InvertCond);
480 return;
481 }
482
483 // Create TmpBB after CurBB.
484 MachineFunction::iterator BBI(CurBB);
485 MachineBasicBlock *TmpBB =
487 CurBB->getParent()->insert(++BBI, TmpBB);
488
489 if (Opc == Instruction::Or) {
490 // Codegen X | Y as:
491 // BB1:
492 // jmp_if_X TBB
493 // jmp TmpBB
494 // TmpBB:
495 // jmp_if_Y TBB
496 // jmp FBB
497 //
498
499 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
500 // The requirement is that
501 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
502 // = TrueProb for original BB.
503 // Assuming the original probabilities are A and B, one choice is to set
504 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
505 // A/(1+B) and 2B/(1+B). This choice assumes that
506 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
507 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
508 // TmpBB, but the math is more complicated.
509
510 auto NewTrueProb = TProb / 2;
511 auto NewFalseProb = TProb / 2 + FProb;
512 // Emit the LHS condition.
513 findMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
514 NewFalseProb, InvertCond);
515
516 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
517 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
518 BranchProbability::normalizeProbabilities(Probs.begin(), Probs.end());
519 // Emit the RHS condition into TmpBB.
520 findMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
521 Probs[1], InvertCond);
522 } else {
523 assert(Opc == Instruction::And && "Unknown merge op!");
524 // Codegen X & Y as:
525 // BB1:
526 // jmp_if_X TmpBB
527 // jmp FBB
528 // TmpBB:
529 // jmp_if_Y TBB
530 // jmp FBB
531 //
532 // This requires creation of TmpBB after CurBB.
533
534 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
535 // The requirement is that
536 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
537 // = FalseProb for original BB.
538 // Assuming the original probabilities are A and B, one choice is to set
539 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
540 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
541 // TrueProb for BB1 * FalseProb for TmpBB.
542
543 auto NewTrueProb = TProb + FProb / 2;
544 auto NewFalseProb = FProb / 2;
545 // Emit the LHS condition.
546 findMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
547 NewFalseProb, InvertCond);
548
549 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
550 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
551 BranchProbability::normalizeProbabilities(Probs.begin(), Probs.end());
552 // Emit the RHS condition into TmpBB.
553 findMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
554 Probs[1], InvertCond);
555 }
556}
557
558bool IRTranslator::shouldEmitAsBranches(
559 const std::vector<SwitchCG::CaseBlock> &Cases) {
560 // For multiple cases, it's better to emit as branches.
561 if (Cases.size() != 2)
562 return true;
563
564 // If this is two comparisons of the same values or'd or and'd together, they
565 // will get folded into a single comparison, so don't emit two blocks.
566 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
567 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
568 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
569 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
570 return false;
571 }
572
573 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
574 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
575 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
576 Cases[0].PredInfo.Pred == Cases[1].PredInfo.Pred &&
577 isa<Constant>(Cases[0].CmpRHS) &&
578 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
579 if (Cases[0].PredInfo.Pred == CmpInst::ICMP_EQ &&
580 Cases[0].TrueBB == Cases[1].ThisBB)
581 return false;
582 if (Cases[0].PredInfo.Pred == CmpInst::ICMP_NE &&
583 Cases[0].FalseBB == Cases[1].ThisBB)
584 return false;
585 }
586
587 return true;
588}
589
590bool IRTranslator::translateBr(const User &U, MachineIRBuilder &MIRBuilder) {
591 const BranchInst &BrInst = cast<BranchInst>(U);
592 auto &CurMBB = MIRBuilder.getMBB();
593 auto *Succ0MBB = &getMBB(*BrInst.getSuccessor(0));
594
595 if (BrInst.isUnconditional()) {
596 // If the unconditional target is the layout successor, fallthrough.
597 if (OptLevel == CodeGenOptLevel::None ||
598 !CurMBB.isLayoutSuccessor(Succ0MBB))
599 MIRBuilder.buildBr(*Succ0MBB);
600
601 // Link successors.
602 for (const BasicBlock *Succ : successors(&BrInst))
603 CurMBB.addSuccessor(&getMBB(*Succ));
604 return true;
605 }
606
607 // If this condition is one of the special cases we handle, do special stuff
608 // now.
609 const Value *CondVal = BrInst.getCondition();
610 MachineBasicBlock *Succ1MBB = &getMBB(*BrInst.getSuccessor(1));
611
612 // If this is a series of conditions that are or'd or and'd together, emit
613 // this as a sequence of branches instead of setcc's with and/or operations.
614 // As long as jumps are not expensive (exceptions for multi-use logic ops,
615 // unpredictable branches, and vector extracts because those jumps are likely
616 // expensive for any target), this should improve performance.
617 // For example, instead of something like:
618 // cmp A, B
619 // C = seteq
620 // cmp D, E
621 // F = setle
622 // or C, F
623 // jnz foo
624 // Emit:
625 // cmp A, B
626 // je foo
627 // cmp D, E
628 // jle foo
629 using namespace PatternMatch;
630 const Instruction *CondI = dyn_cast<Instruction>(CondVal);
631 if (!TLI->isJumpExpensive() && CondI && CondI->hasOneUse() &&
632 !BrInst.hasMetadata(LLVMContext::MD_unpredictable)) {
634 Value *Vec;
635 const Value *BOp0, *BOp1;
636 if (match(CondI, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
637 Opcode = Instruction::And;
638 else if (match(CondI, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
639 Opcode = Instruction::Or;
640
641 if (Opcode && !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
642 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value())))) {
643 findMergedConditions(CondI, Succ0MBB, Succ1MBB, &CurMBB, &CurMBB, Opcode,
644 getEdgeProbability(&CurMBB, Succ0MBB),
645 getEdgeProbability(&CurMBB, Succ1MBB),
646 /*InvertCond=*/false);
647 assert(SL->SwitchCases[0].ThisBB == &CurMBB && "Unexpected lowering!");
648
649 // Allow some cases to be rejected.
650 if (shouldEmitAsBranches(SL->SwitchCases)) {
651 // Emit the branch for this block.
652 emitSwitchCase(SL->SwitchCases[0], &CurMBB, *CurBuilder);
653 SL->SwitchCases.erase(SL->SwitchCases.begin());
654 return true;
655 }
656
657 // Okay, we decided not to do this, remove any inserted MBB's and clear
658 // SwitchCases.
659 for (unsigned I = 1, E = SL->SwitchCases.size(); I != E; ++I)
660 MF->erase(SL->SwitchCases[I].ThisBB);
661
662 SL->SwitchCases.clear();
663 }
664 }
665
666 // Create a CaseBlock record representing this branch.
667 SwitchCG::CaseBlock CB(CmpInst::ICMP_EQ, false, CondVal,
669 nullptr, Succ0MBB, Succ1MBB, &CurMBB,
670 CurBuilder->getDebugLoc());
671
672 // Use emitSwitchCase to actually insert the fast branch sequence for this
673 // cond branch.
674 emitSwitchCase(CB, &CurMBB, *CurBuilder);
675 return true;
676}
677
678void IRTranslator::addSuccessorWithProb(MachineBasicBlock *Src,
680 BranchProbability Prob) {
681 if (!FuncInfo.BPI) {
682 Src->addSuccessorWithoutProb(Dst);
683 return;
684 }
685 if (Prob.isUnknown())
686 Prob = getEdgeProbability(Src, Dst);
687 Src->addSuccessor(Dst, Prob);
688}
689
691IRTranslator::getEdgeProbability(const MachineBasicBlock *Src,
692 const MachineBasicBlock *Dst) const {
693 const BasicBlock *SrcBB = Src->getBasicBlock();
694 const BasicBlock *DstBB = Dst->getBasicBlock();
695 if (!FuncInfo.BPI) {
696 // If BPI is not available, set the default probability as 1 / N, where N is
697 // the number of successors.
698 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
699 return BranchProbability(1, SuccSize);
700 }
701 return FuncInfo.BPI->getEdgeProbability(SrcBB, DstBB);
702}
703
704bool IRTranslator::translateSwitch(const User &U, MachineIRBuilder &MIB) {
705 using namespace SwitchCG;
706 // Extract cases from the switch.
707 const SwitchInst &SI = cast<SwitchInst>(U);
708 BranchProbabilityInfo *BPI = FuncInfo.BPI;
709 CaseClusterVector Clusters;
710 Clusters.reserve(SI.getNumCases());
711 for (const auto &I : SI.cases()) {
712 MachineBasicBlock *Succ = &getMBB(*I.getCaseSuccessor());
713 assert(Succ && "Could not find successor mbb in mapping");
714 const ConstantInt *CaseVal = I.getCaseValue();
715 BranchProbability Prob =
716 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
717 : BranchProbability(1, SI.getNumCases() + 1);
718 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
719 }
720
721 MachineBasicBlock *DefaultMBB = &getMBB(*SI.getDefaultDest());
722
723 // Cluster adjacent cases with the same destination. We do this at all
724 // optimization levels because it's cheap to do and will make codegen faster
725 // if there are many clusters.
726 sortAndRangeify(Clusters);
727
728 MachineBasicBlock *SwitchMBB = &getMBB(*SI.getParent());
729
730 // If there is only the default destination, jump there directly.
731 if (Clusters.empty()) {
732 SwitchMBB->addSuccessor(DefaultMBB);
733 if (DefaultMBB != SwitchMBB->getNextNode())
734 MIB.buildBr(*DefaultMBB);
735 return true;
736 }
737
738 SL->findJumpTables(Clusters, &SI, std::nullopt, DefaultMBB, nullptr, nullptr);
739 SL->findBitTestClusters(Clusters, &SI);
740
741 LLVM_DEBUG({
742 dbgs() << "Case clusters: ";
743 for (const CaseCluster &C : Clusters) {
744 if (C.Kind == CC_JumpTable)
745 dbgs() << "JT:";
746 if (C.Kind == CC_BitTests)
747 dbgs() << "BT:";
748
749 C.Low->getValue().print(dbgs(), true);
750 if (C.Low != C.High) {
751 dbgs() << '-';
752 C.High->getValue().print(dbgs(), true);
753 }
754 dbgs() << ' ';
755 }
756 dbgs() << '\n';
757 });
758
759 assert(!Clusters.empty());
760 SwitchWorkList WorkList;
761 CaseClusterIt First = Clusters.begin();
762 CaseClusterIt Last = Clusters.end() - 1;
763 auto DefaultProb = getEdgeProbability(SwitchMBB, DefaultMBB);
764 WorkList.push_back({SwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
765
766 while (!WorkList.empty()) {
767 SwitchWorkListItem W = WorkList.pop_back_val();
768
769 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
770 // For optimized builds, lower large range as a balanced binary tree.
771 if (NumClusters > 3 &&
773 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
774 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB, MIB);
775 continue;
776 }
777
778 if (!lowerSwitchWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB, MIB))
779 return false;
780 }
781 return true;
782}
783
784void IRTranslator::splitWorkItem(SwitchCG::SwitchWorkList &WorkList,
786 Value *Cond, MachineBasicBlock *SwitchMBB,
787 MachineIRBuilder &MIB) {
788 using namespace SwitchCG;
789 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
790 "Clusters not sorted?");
791 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
792
793 auto [LastLeft, FirstRight, LeftProb, RightProb] =
794 SL->computeSplitWorkItemInfo(W);
795
796 // Use the first element on the right as pivot since we will make less-than
797 // comparisons against it.
798 CaseClusterIt PivotCluster = FirstRight;
799 assert(PivotCluster > W.FirstCluster);
800 assert(PivotCluster <= W.LastCluster);
801
802 CaseClusterIt FirstLeft = W.FirstCluster;
803 CaseClusterIt LastRight = W.LastCluster;
804
805 const ConstantInt *Pivot = PivotCluster->Low;
806
807 // New blocks will be inserted immediately after the current one.
809 ++BBI;
810
811 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
812 // we can branch to its destination directly if it's squeezed exactly in
813 // between the known lower bound and Pivot - 1.
814 MachineBasicBlock *LeftMBB;
815 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
816 FirstLeft->Low == W.GE &&
817 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
818 LeftMBB = FirstLeft->MBB;
819 } else {
820 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
821 FuncInfo.MF->insert(BBI, LeftMBB);
822 WorkList.push_back(
823 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
824 }
825
826 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
827 // single cluster, RHS.Low == Pivot, and we can branch to its destination
828 // directly if RHS.High equals the current upper bound.
829 MachineBasicBlock *RightMBB;
830 if (FirstRight == LastRight && FirstRight->Kind == CC_Range && W.LT &&
831 (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
832 RightMBB = FirstRight->MBB;
833 } else {
834 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
835 FuncInfo.MF->insert(BBI, RightMBB);
836 WorkList.push_back(
837 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
838 }
839
840 // Create the CaseBlock record that will be used to lower the branch.
841 CaseBlock CB(ICmpInst::Predicate::ICMP_SLT, false, Cond, Pivot, nullptr,
842 LeftMBB, RightMBB, W.MBB, MIB.getDebugLoc(), LeftProb,
843 RightProb);
844
845 if (W.MBB == SwitchMBB)
846 emitSwitchCase(CB, SwitchMBB, MIB);
847 else
848 SL->SwitchCases.push_back(CB);
849}
850
851void IRTranslator::emitJumpTable(SwitchCG::JumpTable &JT,
853 // Emit the code for the jump table
854 assert(JT.Reg && "Should lower JT Header first!");
856 MIB.setMBB(*MBB);
857 MIB.setDebugLoc(CurBuilder->getDebugLoc());
858
860 const LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
861
862 auto Table = MIB.buildJumpTable(PtrTy, JT.JTI);
863 MIB.buildBrJT(Table.getReg(0), JT.JTI, JT.Reg);
864}
865
866bool IRTranslator::emitJumpTableHeader(SwitchCG::JumpTable &JT,
868 MachineBasicBlock *HeaderBB) {
869 MachineIRBuilder MIB(*HeaderBB->getParent());
870 MIB.setMBB(*HeaderBB);
871 MIB.setDebugLoc(CurBuilder->getDebugLoc());
872
873 const Value &SValue = *JTH.SValue;
874 // Subtract the lowest switch case value from the value being switched on.
875 const LLT SwitchTy = getLLTForType(*SValue.getType(), *DL);
876 Register SwitchOpReg = getOrCreateVReg(SValue);
877 auto FirstCst = MIB.buildConstant(SwitchTy, JTH.First);
878 auto Sub = MIB.buildSub({SwitchTy}, SwitchOpReg, FirstCst);
879
880 // This value may be smaller or larger than the target's pointer type, and
881 // therefore require extension or truncating.
882 auto *PtrIRTy = PointerType::getUnqual(SValue.getContext());
883 const LLT PtrScalarTy = LLT::scalar(DL->getTypeSizeInBits(PtrIRTy));
884 Sub = MIB.buildZExtOrTrunc(PtrScalarTy, Sub);
885
886 JT.Reg = Sub.getReg(0);
887
888 if (JTH.FallthroughUnreachable) {
889 if (JT.MBB != HeaderBB->getNextNode())
890 MIB.buildBr(*JT.MBB);
891 return true;
892 }
893
894 // Emit the range check for the jump table, and branch to the default block
895 // for the switch statement if the value being switched on exceeds the
896 // largest case in the switch.
897 auto Cst = getOrCreateVReg(
898 *ConstantInt::get(SValue.getType(), JTH.Last - JTH.First));
899 Cst = MIB.buildZExtOrTrunc(PtrScalarTy, Cst).getReg(0);
900 auto Cmp = MIB.buildICmp(CmpInst::ICMP_UGT, LLT::scalar(1), Sub, Cst);
901
902 auto BrCond = MIB.buildBrCond(Cmp.getReg(0), *JT.Default);
903
904 // Avoid emitting unnecessary branches to the next block.
905 if (JT.MBB != HeaderBB->getNextNode())
906 BrCond = MIB.buildBr(*JT.MBB);
907 return true;
908}
909
910void IRTranslator::emitSwitchCase(SwitchCG::CaseBlock &CB,
911 MachineBasicBlock *SwitchBB,
912 MachineIRBuilder &MIB) {
913 Register CondLHS = getOrCreateVReg(*CB.CmpLHS);
915 DebugLoc OldDbgLoc = MIB.getDebugLoc();
916 MIB.setDebugLoc(CB.DbgLoc);
917 MIB.setMBB(*CB.ThisBB);
918
919 if (CB.PredInfo.NoCmp) {
920 // Branch or fall through to TrueBB.
921 addSuccessorWithProb(CB.ThisBB, CB.TrueBB, CB.TrueProb);
922 addMachineCFGPred({SwitchBB->getBasicBlock(), CB.TrueBB->getBasicBlock()},
923 CB.ThisBB);
925 if (CB.TrueBB != CB.ThisBB->getNextNode())
926 MIB.buildBr(*CB.TrueBB);
927 MIB.setDebugLoc(OldDbgLoc);
928 return;
929 }
930
931 const LLT i1Ty = LLT::scalar(1);
932 // Build the compare.
933 if (!CB.CmpMHS) {
934 const auto *CI = dyn_cast<ConstantInt>(CB.CmpRHS);
935 // For conditional branch lowering, we might try to do something silly like
936 // emit an G_ICMP to compare an existing G_ICMP i1 result with true. If so,
937 // just re-use the existing condition vreg.
938 if (MRI->getType(CondLHS).getSizeInBits() == 1 && CI && CI->isOne() &&
940 Cond = CondLHS;
941 } else {
942 Register CondRHS = getOrCreateVReg(*CB.CmpRHS);
944 Cond =
945 MIB.buildFCmp(CB.PredInfo.Pred, i1Ty, CondLHS, CondRHS).getReg(0);
946 else
947 Cond =
948 MIB.buildICmp(CB.PredInfo.Pred, i1Ty, CondLHS, CondRHS).getReg(0);
949 }
950 } else {
952 "Can only handle SLE ranges");
953
954 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
955 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
956
957 Register CmpOpReg = getOrCreateVReg(*CB.CmpMHS);
958 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
959 Register CondRHS = getOrCreateVReg(*CB.CmpRHS);
960 Cond =
961 MIB.buildICmp(CmpInst::ICMP_SLE, i1Ty, CmpOpReg, CondRHS).getReg(0);
962 } else {
963 const LLT CmpTy = MRI->getType(CmpOpReg);
964 auto Sub = MIB.buildSub({CmpTy}, CmpOpReg, CondLHS);
965 auto Diff = MIB.buildConstant(CmpTy, High - Low);
966 Cond = MIB.buildICmp(CmpInst::ICMP_ULE, i1Ty, Sub, Diff).getReg(0);
967 }
968 }
969
970 // Update successor info
971 addSuccessorWithProb(CB.ThisBB, CB.TrueBB, CB.TrueProb);
972
973 addMachineCFGPred({SwitchBB->getBasicBlock(), CB.TrueBB->getBasicBlock()},
974 CB.ThisBB);
975
976 // TrueBB and FalseBB are always different unless the incoming IR is
977 // degenerate. This only happens when running llc on weird IR.
978 if (CB.TrueBB != CB.FalseBB)
979 addSuccessorWithProb(CB.ThisBB, CB.FalseBB, CB.FalseProb);
981
982 addMachineCFGPred({SwitchBB->getBasicBlock(), CB.FalseBB->getBasicBlock()},
983 CB.ThisBB);
984
985 MIB.buildBrCond(Cond, *CB.TrueBB);
986 MIB.buildBr(*CB.FalseBB);
987 MIB.setDebugLoc(OldDbgLoc);
988}
989
990bool IRTranslator::lowerJumpTableWorkItem(SwitchCG::SwitchWorkListItem W,
991 MachineBasicBlock *SwitchMBB,
992 MachineBasicBlock *CurMBB,
993 MachineBasicBlock *DefaultMBB,
994 MachineIRBuilder &MIB,
996 BranchProbability UnhandledProbs,
998 MachineBasicBlock *Fallthrough,
999 bool FallthroughUnreachable) {
1000 using namespace SwitchCG;
1001 MachineFunction *CurMF = SwitchMBB->getParent();
1002 // FIXME: Optimize away range check based on pivot comparisons.
1003 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
1004 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
1005 BranchProbability DefaultProb = W.DefaultProb;
1006
1007 // The jump block hasn't been inserted yet; insert it here.
1008 MachineBasicBlock *JumpMBB = JT->MBB;
1009 CurMF->insert(BBI, JumpMBB);
1010
1011 // Since the jump table block is separate from the switch block, we need
1012 // to keep track of it as a machine predecessor to the default block,
1013 // otherwise we lose the phi edges.
1014 addMachineCFGPred({SwitchMBB->getBasicBlock(), DefaultMBB->getBasicBlock()},
1015 CurMBB);
1016 addMachineCFGPred({SwitchMBB->getBasicBlock(), DefaultMBB->getBasicBlock()},
1017 JumpMBB);
1018
1019 auto JumpProb = I->Prob;
1020 auto FallthroughProb = UnhandledProbs;
1021
1022 // If the default statement is a target of the jump table, we evenly
1023 // distribute the default probability to successors of CurMBB. Also
1024 // update the probability on the edge from JumpMBB to Fallthrough.
1025 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
1026 SE = JumpMBB->succ_end();
1027 SI != SE; ++SI) {
1028 if (*SI == DefaultMBB) {
1029 JumpProb += DefaultProb / 2;
1030 FallthroughProb -= DefaultProb / 2;
1031 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
1032 JumpMBB->normalizeSuccProbs();
1033 } else {
1034 // Also record edges from the jump table block to it's successors.
1035 addMachineCFGPred({SwitchMBB->getBasicBlock(), (*SI)->getBasicBlock()},
1036 JumpMBB);
1037 }
1038 }
1039
1040 if (FallthroughUnreachable)
1041 JTH->FallthroughUnreachable = true;
1042
1043 if (!JTH->FallthroughUnreachable)
1044 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
1045 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
1046 CurMBB->normalizeSuccProbs();
1047
1048 // The jump table header will be inserted in our current block, do the
1049 // range check, and fall through to our fallthrough block.
1050 JTH->HeaderBB = CurMBB;
1051 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
1052
1053 // If we're in the right place, emit the jump table header right now.
1054 if (CurMBB == SwitchMBB) {
1055 if (!emitJumpTableHeader(*JT, *JTH, CurMBB))
1056 return false;
1057 JTH->Emitted = true;
1058 }
1059 return true;
1060}
1061bool IRTranslator::lowerSwitchRangeWorkItem(SwitchCG::CaseClusterIt I,
1062 Value *Cond,
1063 MachineBasicBlock *Fallthrough,
1064 bool FallthroughUnreachable,
1065 BranchProbability UnhandledProbs,
1066 MachineBasicBlock *CurMBB,
1067 MachineIRBuilder &MIB,
1068 MachineBasicBlock *SwitchMBB) {
1069 using namespace SwitchCG;
1070 const Value *RHS, *LHS, *MHS;
1071 CmpInst::Predicate Pred;
1072 if (I->Low == I->High) {
1073 // Check Cond == I->Low.
1074 Pred = CmpInst::ICMP_EQ;
1075 LHS = Cond;
1076 RHS = I->Low;
1077 MHS = nullptr;
1078 } else {
1079 // Check I->Low <= Cond <= I->High.
1080 Pred = CmpInst::ICMP_SLE;
1081 LHS = I->Low;
1082 MHS = Cond;
1083 RHS = I->High;
1084 }
1085
1086 // If Fallthrough is unreachable, fold away the comparison.
1087 // The false probability is the sum of all unhandled cases.
1088 CaseBlock CB(Pred, FallthroughUnreachable, LHS, RHS, MHS, I->MBB, Fallthrough,
1089 CurMBB, MIB.getDebugLoc(), I->Prob, UnhandledProbs);
1090
1091 emitSwitchCase(CB, SwitchMBB, MIB);
1092 return true;
1093}
1094
1095void IRTranslator::emitBitTestHeader(SwitchCG::BitTestBlock &B,
1096 MachineBasicBlock *SwitchBB) {
1097 MachineIRBuilder &MIB = *CurBuilder;
1098 MIB.setMBB(*SwitchBB);
1099
1100 // Subtract the minimum value.
1101 Register SwitchOpReg = getOrCreateVReg(*B.SValue);
1102
1103 LLT SwitchOpTy = MRI->getType(SwitchOpReg);
1104 Register MinValReg = MIB.buildConstant(SwitchOpTy, B.First).getReg(0);
1105 auto RangeSub = MIB.buildSub(SwitchOpTy, SwitchOpReg, MinValReg);
1106
1108 const LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
1109
1110 LLT MaskTy = SwitchOpTy;
1111 if (MaskTy.getSizeInBits() > PtrTy.getSizeInBits() ||
1112 !llvm::has_single_bit<uint32_t>(MaskTy.getSizeInBits()))
1113 MaskTy = LLT::scalar(PtrTy.getSizeInBits());
1114 else {
1115 // Ensure that the type will fit the mask value.
1116 for (const SwitchCG::BitTestCase &Case : B.Cases) {
1117 if (!isUIntN(SwitchOpTy.getSizeInBits(), Case.Mask)) {
1118 // Switch table case range are encoded into series of masks.
1119 // Just use pointer type, it's guaranteed to fit.
1120 MaskTy = LLT::scalar(PtrTy.getSizeInBits());
1121 break;
1122 }
1123 }
1124 }
1125 Register SubReg = RangeSub.getReg(0);
1126 if (SwitchOpTy != MaskTy)
1127 SubReg = MIB.buildZExtOrTrunc(MaskTy, SubReg).getReg(0);
1128
1129 B.RegVT = getMVTForLLT(MaskTy);
1130 B.Reg = SubReg;
1131
1132 MachineBasicBlock *MBB = B.Cases[0].ThisBB;
1133
1134 if (!B.FallthroughUnreachable)
1135 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
1136 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
1137
1138 SwitchBB->normalizeSuccProbs();
1139
1140 if (!B.FallthroughUnreachable) {
1141 // Conditional branch to the default block.
1142 auto RangeCst = MIB.buildConstant(SwitchOpTy, B.Range);
1143 auto RangeCmp = MIB.buildICmp(CmpInst::Predicate::ICMP_UGT, LLT::scalar(1),
1144 RangeSub, RangeCst);
1145 MIB.buildBrCond(RangeCmp, *B.Default);
1146 }
1147
1148 // Avoid emitting unnecessary branches to the next block.
1149 if (MBB != SwitchBB->getNextNode())
1150 MIB.buildBr(*MBB);
1151}
1152
1153void IRTranslator::emitBitTestCase(SwitchCG::BitTestBlock &BB,
1154 MachineBasicBlock *NextMBB,
1155 BranchProbability BranchProbToNext,
1157 MachineBasicBlock *SwitchBB) {
1158 MachineIRBuilder &MIB = *CurBuilder;
1159 MIB.setMBB(*SwitchBB);
1160
1161 LLT SwitchTy = getLLTForMVT(BB.RegVT);
1162 Register Cmp;
1163 unsigned PopCount = llvm::popcount(B.Mask);
1164 if (PopCount == 1) {
1165 // Testing for a single bit; just compare the shift count with what it
1166 // would need to be to shift a 1 bit in that position.
1167 auto MaskTrailingZeros =
1168 MIB.buildConstant(SwitchTy, llvm::countr_zero(B.Mask));
1169 Cmp =
1170 MIB.buildICmp(ICmpInst::ICMP_EQ, LLT::scalar(1), Reg, MaskTrailingZeros)
1171 .getReg(0);
1172 } else if (PopCount == BB.Range) {
1173 // There is only one zero bit in the range, test for it directly.
1174 auto MaskTrailingOnes =
1175 MIB.buildConstant(SwitchTy, llvm::countr_one(B.Mask));
1176 Cmp = MIB.buildICmp(CmpInst::ICMP_NE, LLT::scalar(1), Reg, MaskTrailingOnes)
1177 .getReg(0);
1178 } else {
1179 // Make desired shift.
1180 auto CstOne = MIB.buildConstant(SwitchTy, 1);
1181 auto SwitchVal = MIB.buildShl(SwitchTy, CstOne, Reg);
1182
1183 // Emit bit tests and jumps.
1184 auto CstMask = MIB.buildConstant(SwitchTy, B.Mask);
1185 auto AndOp = MIB.buildAnd(SwitchTy, SwitchVal, CstMask);
1186 auto CstZero = MIB.buildConstant(SwitchTy, 0);
1187 Cmp = MIB.buildICmp(CmpInst::ICMP_NE, LLT::scalar(1), AndOp, CstZero)
1188 .getReg(0);
1189 }
1190
1191 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
1192 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
1193 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
1194 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
1195 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
1196 // one as they are relative probabilities (and thus work more like weights),
1197 // and hence we need to normalize them to let the sum of them become one.
1198 SwitchBB->normalizeSuccProbs();
1199
1200 // Record the fact that the IR edge from the header to the bit test target
1201 // will go through our new block. Neeeded for PHIs to have nodes added.
1202 addMachineCFGPred({BB.Parent->getBasicBlock(), B.TargetBB->getBasicBlock()},
1203 SwitchBB);
1204
1205 MIB.buildBrCond(Cmp, *B.TargetBB);
1206
1207 // Avoid emitting unnecessary branches to the next block.
1208 if (NextMBB != SwitchBB->getNextNode())
1209 MIB.buildBr(*NextMBB);
1210}
1211
1212bool IRTranslator::lowerBitTestWorkItem(
1214 MachineBasicBlock *CurMBB, MachineBasicBlock *DefaultMBB,
1216 BranchProbability DefaultProb, BranchProbability UnhandledProbs,
1218 bool FallthroughUnreachable) {
1219 using namespace SwitchCG;
1220 MachineFunction *CurMF = SwitchMBB->getParent();
1221 // FIXME: Optimize away range check based on pivot comparisons.
1222 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
1223 // The bit test blocks haven't been inserted yet; insert them here.
1224 for (BitTestCase &BTC : BTB->Cases)
1225 CurMF->insert(BBI, BTC.ThisBB);
1226
1227 // Fill in fields of the BitTestBlock.
1228 BTB->Parent = CurMBB;
1229 BTB->Default = Fallthrough;
1230
1231 BTB->DefaultProb = UnhandledProbs;
1232 // If the cases in bit test don't form a contiguous range, we evenly
1233 // distribute the probability on the edge to Fallthrough to two
1234 // successors of CurMBB.
1235 if (!BTB->ContiguousRange) {
1236 BTB->Prob += DefaultProb / 2;
1237 BTB->DefaultProb -= DefaultProb / 2;
1238 }
1239
1240 if (FallthroughUnreachable)
1241 BTB->FallthroughUnreachable = true;
1242
1243 // If we're in the right place, emit the bit test header right now.
1244 if (CurMBB == SwitchMBB) {
1245 emitBitTestHeader(*BTB, SwitchMBB);
1246 BTB->Emitted = true;
1247 }
1248 return true;
1249}
1250
1251bool IRTranslator::lowerSwitchWorkItem(SwitchCG::SwitchWorkListItem W,
1252 Value *Cond,
1253 MachineBasicBlock *SwitchMBB,
1254 MachineBasicBlock *DefaultMBB,
1255 MachineIRBuilder &MIB) {
1256 using namespace SwitchCG;
1257 MachineFunction *CurMF = FuncInfo.MF;
1258 MachineBasicBlock *NextMBB = nullptr;
1260 if (++BBI != FuncInfo.MF->end())
1261 NextMBB = &*BBI;
1262
1263 if (EnableOpts) {
1264 // Here, we order cases by probability so the most likely case will be
1265 // checked first. However, two clusters can have the same probability in
1266 // which case their relative ordering is non-deterministic. So we use Low
1267 // as a tie-breaker as clusters are guaranteed to never overlap.
1268 llvm::sort(W.FirstCluster, W.LastCluster + 1,
1269 [](const CaseCluster &a, const CaseCluster &b) {
1270 return a.Prob != b.Prob
1271 ? a.Prob > b.Prob
1272 : a.Low->getValue().slt(b.Low->getValue());
1273 });
1274
1275 // Rearrange the case blocks so that the last one falls through if possible
1276 // without changing the order of probabilities.
1277 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster;) {
1278 --I;
1279 if (I->Prob > W.LastCluster->Prob)
1280 break;
1281 if (I->Kind == CC_Range && I->MBB == NextMBB) {
1282 std::swap(*I, *W.LastCluster);
1283 break;
1284 }
1285 }
1286 }
1287
1288 // Compute total probability.
1289 BranchProbability DefaultProb = W.DefaultProb;
1290 BranchProbability UnhandledProbs = DefaultProb;
1291 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
1292 UnhandledProbs += I->Prob;
1293
1294 MachineBasicBlock *CurMBB = W.MBB;
1295 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
1296 bool FallthroughUnreachable = false;
1297 MachineBasicBlock *Fallthrough;
1298 if (I == W.LastCluster) {
1299 // For the last cluster, fall through to the default destination.
1300 Fallthrough = DefaultMBB;
1301 FallthroughUnreachable = isa<UnreachableInst>(
1302 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
1303 } else {
1304 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
1305 CurMF->insert(BBI, Fallthrough);
1306 }
1307 UnhandledProbs -= I->Prob;
1308
1309 switch (I->Kind) {
1310 case CC_BitTests: {
1311 if (!lowerBitTestWorkItem(W, SwitchMBB, CurMBB, DefaultMBB, MIB, BBI,
1312 DefaultProb, UnhandledProbs, I, Fallthrough,
1313 FallthroughUnreachable)) {
1314 LLVM_DEBUG(dbgs() << "Failed to lower bit test for switch");
1315 return false;
1316 }
1317 break;
1318 }
1319
1320 case CC_JumpTable: {
1321 if (!lowerJumpTableWorkItem(W, SwitchMBB, CurMBB, DefaultMBB, MIB, BBI,
1322 UnhandledProbs, I, Fallthrough,
1323 FallthroughUnreachable)) {
1324 LLVM_DEBUG(dbgs() << "Failed to lower jump table");
1325 return false;
1326 }
1327 break;
1328 }
1329 case CC_Range: {
1330 if (!lowerSwitchRangeWorkItem(I, Cond, Fallthrough,
1331 FallthroughUnreachable, UnhandledProbs,
1332 CurMBB, MIB, SwitchMBB)) {
1333 LLVM_DEBUG(dbgs() << "Failed to lower switch range");
1334 return false;
1335 }
1336 break;
1337 }
1338 }
1339 CurMBB = Fallthrough;
1340 }
1341
1342 return true;
1343}
1344
1345bool IRTranslator::translateIndirectBr(const User &U,
1346 MachineIRBuilder &MIRBuilder) {
1347 const IndirectBrInst &BrInst = cast<IndirectBrInst>(U);
1348
1349 const Register Tgt = getOrCreateVReg(*BrInst.getAddress());
1350 MIRBuilder.buildBrIndirect(Tgt);
1351
1352 // Link successors.
1354 MachineBasicBlock &CurBB = MIRBuilder.getMBB();
1355 for (const BasicBlock *Succ : successors(&BrInst)) {
1356 // It's legal for indirectbr instructions to have duplicate blocks in the
1357 // destination list. We don't allow this in MIR. Skip anything that's
1358 // already a successor.
1359 if (!AddedSuccessors.insert(Succ).second)
1360 continue;
1361 CurBB.addSuccessor(&getMBB(*Succ));
1362 }
1363
1364 return true;
1365}
1366
1367static bool isSwiftError(const Value *V) {
1368 if (auto Arg = dyn_cast<Argument>(V))
1369 return Arg->hasSwiftErrorAttr();
1370 if (auto AI = dyn_cast<AllocaInst>(V))
1371 return AI->isSwiftError();
1372 return false;
1373}
1374
1375bool IRTranslator::translateLoad(const User &U, MachineIRBuilder &MIRBuilder) {
1376 const LoadInst &LI = cast<LoadInst>(U);
1377 TypeSize StoreSize = DL->getTypeStoreSize(LI.getType());
1378 if (StoreSize.isZero())
1379 return true;
1380
1381 ArrayRef<Register> Regs = getOrCreateVRegs(LI);
1382 ArrayRef<uint64_t> Offsets = *VMap.getOffsets(LI);
1383 Register Base = getOrCreateVReg(*LI.getPointerOperand());
1384 AAMDNodes AAInfo = LI.getAAMetadata();
1385
1386 const Value *Ptr = LI.getPointerOperand();
1387 Type *OffsetIRTy = DL->getIndexType(Ptr->getType());
1388 LLT OffsetTy = getLLTForType(*OffsetIRTy, *DL);
1389
1390 if (CLI->supportSwiftError() && isSwiftError(Ptr)) {
1391 assert(Regs.size() == 1 && "swifterror should be single pointer");
1392 Register VReg =
1393 SwiftError.getOrCreateVRegUseAt(&LI, &MIRBuilder.getMBB(), Ptr);
1394 MIRBuilder.buildCopy(Regs[0], VReg);
1395 return true;
1396 }
1397
1399 TLI->getLoadMemOperandFlags(LI, *DL, AC, LibInfo);
1400 if (AA && !(Flags & MachineMemOperand::MOInvariant)) {
1401 if (AA->pointsToConstantMemory(
1402 MemoryLocation(Ptr, LocationSize::precise(StoreSize), AAInfo))) {
1404 }
1405 }
1406
1407 const MDNode *Ranges =
1408 Regs.size() == 1 ? LI.getMetadata(LLVMContext::MD_range) : nullptr;
1409 for (unsigned i = 0; i < Regs.size(); ++i) {
1410 Register Addr;
1411 MIRBuilder.materializeObjectPtrOffset(Addr, Base, OffsetTy, Offsets[i] / 8);
1412
1413 MachinePointerInfo Ptr(LI.getPointerOperand(), Offsets[i] / 8);
1414 Align BaseAlign = getMemOpAlign(LI);
1415 auto MMO = MF->getMachineMemOperand(
1416 Ptr, Flags, MRI->getType(Regs[i]),
1417 commonAlignment(BaseAlign, Offsets[i] / 8), AAInfo, Ranges,
1418 LI.getSyncScopeID(), LI.getOrdering());
1419 MIRBuilder.buildLoad(Regs[i], Addr, *MMO);
1420 }
1421
1422 return true;
1423}
1424
1425bool IRTranslator::translateStore(const User &U, MachineIRBuilder &MIRBuilder) {
1426 const StoreInst &SI = cast<StoreInst>(U);
1427 if (DL->getTypeStoreSize(SI.getValueOperand()->getType()).isZero())
1428 return true;
1429
1430 ArrayRef<Register> Vals = getOrCreateVRegs(*SI.getValueOperand());
1431 ArrayRef<uint64_t> Offsets = *VMap.getOffsets(*SI.getValueOperand());
1432 Register Base = getOrCreateVReg(*SI.getPointerOperand());
1433
1434 Type *OffsetIRTy = DL->getIndexType(SI.getPointerOperandType());
1435 LLT OffsetTy = getLLTForType(*OffsetIRTy, *DL);
1436
1437 if (CLI->supportSwiftError() && isSwiftError(SI.getPointerOperand())) {
1438 assert(Vals.size() == 1 && "swifterror should be single pointer");
1439
1440 Register VReg = SwiftError.getOrCreateVRegDefAt(&SI, &MIRBuilder.getMBB(),
1441 SI.getPointerOperand());
1442 MIRBuilder.buildCopy(VReg, Vals[0]);
1443 return true;
1444 }
1445
1447
1448 for (unsigned i = 0; i < Vals.size(); ++i) {
1449 Register Addr;
1450 MIRBuilder.materializeObjectPtrOffset(Addr, Base, OffsetTy, Offsets[i] / 8);
1451
1452 MachinePointerInfo Ptr(SI.getPointerOperand(), Offsets[i] / 8);
1453 Align BaseAlign = getMemOpAlign(SI);
1454 auto MMO = MF->getMachineMemOperand(
1455 Ptr, Flags, MRI->getType(Vals[i]),
1456 commonAlignment(BaseAlign, Offsets[i] / 8), SI.getAAMetadata(), nullptr,
1457 SI.getSyncScopeID(), SI.getOrdering());
1458 MIRBuilder.buildStore(Vals[i], Addr, *MMO);
1459 }
1460 return true;
1461}
1462
1464 const Value *Src = U.getOperand(0);
1465 Type *Int32Ty = Type::getInt32Ty(U.getContext());
1466
1467 // getIndexedOffsetInType is designed for GEPs, so the first index is the
1468 // usual array element rather than looking into the actual aggregate.
1470 Indices.push_back(ConstantInt::get(Int32Ty, 0));
1471
1472 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(&U)) {
1473 for (auto Idx : EVI->indices())
1474 Indices.push_back(ConstantInt::get(Int32Ty, Idx));
1475 } else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(&U)) {
1476 for (auto Idx : IVI->indices())
1477 Indices.push_back(ConstantInt::get(Int32Ty, Idx));
1478 } else {
1479 llvm::append_range(Indices, drop_begin(U.operands()));
1480 }
1481
1482 return 8 * static_cast<uint64_t>(
1483 DL.getIndexedOffsetInType(Src->getType(), Indices));
1484}
1485
1486bool IRTranslator::translateExtractValue(const User &U,
1487 MachineIRBuilder &MIRBuilder) {
1488 const Value *Src = U.getOperand(0);
1490 ArrayRef<Register> SrcRegs = getOrCreateVRegs(*Src);
1491 ArrayRef<uint64_t> Offsets = *VMap.getOffsets(*Src);
1492 unsigned Idx = llvm::lower_bound(Offsets, Offset) - Offsets.begin();
1493 auto &DstRegs = allocateVRegs(U);
1494
1495 for (unsigned i = 0; i < DstRegs.size(); ++i)
1496 DstRegs[i] = SrcRegs[Idx++];
1497
1498 return true;
1499}
1500
1501bool IRTranslator::translateInsertValue(const User &U,
1502 MachineIRBuilder &MIRBuilder) {
1503 const Value *Src = U.getOperand(0);
1505 auto &DstRegs = allocateVRegs(U);
1506 ArrayRef<uint64_t> DstOffsets = *VMap.getOffsets(U);
1507 ArrayRef<Register> SrcRegs = getOrCreateVRegs(*Src);
1508 ArrayRef<Register> InsertedRegs = getOrCreateVRegs(*U.getOperand(1));
1509 auto *InsertedIt = InsertedRegs.begin();
1510
1511 for (unsigned i = 0; i < DstRegs.size(); ++i) {
1512 if (DstOffsets[i] >= Offset && InsertedIt != InsertedRegs.end())
1513 DstRegs[i] = *InsertedIt++;
1514 else
1515 DstRegs[i] = SrcRegs[i];
1516 }
1517
1518 return true;
1519}
1520
1521bool IRTranslator::translateSelect(const User &U,
1522 MachineIRBuilder &MIRBuilder) {
1523 Register Tst = getOrCreateVReg(*U.getOperand(0));
1524 ArrayRef<Register> ResRegs = getOrCreateVRegs(U);
1525 ArrayRef<Register> Op0Regs = getOrCreateVRegs(*U.getOperand(1));
1526 ArrayRef<Register> Op1Regs = getOrCreateVRegs(*U.getOperand(2));
1527
1528 uint32_t Flags = 0;
1529 if (const SelectInst *SI = dyn_cast<SelectInst>(&U))
1531
1532 for (unsigned i = 0; i < ResRegs.size(); ++i) {
1533 MIRBuilder.buildSelect(ResRegs[i], Tst, Op0Regs[i], Op1Regs[i], Flags);
1534 }
1535
1536 return true;
1537}
1538
1539bool IRTranslator::translateCopy(const User &U, const Value &V,
1540 MachineIRBuilder &MIRBuilder) {
1541 Register Src = getOrCreateVReg(V);
1542 auto &Regs = *VMap.getVRegs(U);
1543 if (Regs.empty()) {
1544 Regs.push_back(Src);
1545 VMap.getOffsets(U)->push_back(0);
1546 } else {
1547 // If we already assigned a vreg for this instruction, we can't change that.
1548 // Emit a copy to satisfy the users we already emitted.
1549 MIRBuilder.buildCopy(Regs[0], Src);
1550 }
1551 return true;
1552}
1553
1554bool IRTranslator::translateBitCast(const User &U,
1555 MachineIRBuilder &MIRBuilder) {
1556 // If we're bitcasting to the source type, we can reuse the source vreg.
1557 if (getLLTForType(*U.getOperand(0)->getType(), *DL) ==
1558 getLLTForType(*U.getType(), *DL)) {
1559 // If the source is a ConstantInt then it was probably created by
1560 // ConstantHoisting and we should leave it alone.
1561 if (isa<ConstantInt>(U.getOperand(0)))
1562 return translateCast(TargetOpcode::G_CONSTANT_FOLD_BARRIER, U,
1563 MIRBuilder);
1564 return translateCopy(U, *U.getOperand(0), MIRBuilder);
1565 }
1566
1567 return translateCast(TargetOpcode::G_BITCAST, U, MIRBuilder);
1568}
1569
1570bool IRTranslator::translateCast(unsigned Opcode, const User &U,
1571 MachineIRBuilder &MIRBuilder) {
1572 if (containsBF16Type(U))
1573 return false;
1574
1575 uint32_t Flags = 0;
1576 if (const Instruction *I = dyn_cast<Instruction>(&U))
1578
1579 Register Op = getOrCreateVReg(*U.getOperand(0));
1580 Register Res = getOrCreateVReg(U);
1581 MIRBuilder.buildInstr(Opcode, {Res}, {Op}, Flags);
1582 return true;
1583}
1584
1585bool IRTranslator::translateGetElementPtr(const User &U,
1586 MachineIRBuilder &MIRBuilder) {
1587 Value &Op0 = *U.getOperand(0);
1588 Register BaseReg = getOrCreateVReg(Op0);
1589 Type *PtrIRTy = Op0.getType();
1590 LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
1591 Type *OffsetIRTy = DL->getIndexType(PtrIRTy);
1592 LLT OffsetTy = getLLTForType(*OffsetIRTy, *DL);
1593
1594 uint32_t PtrAddFlags = 0;
1595 // Each PtrAdd generated to implement the GEP inherits its nuw, nusw, inbounds
1596 // flags.
1597 if (const Instruction *I = dyn_cast<Instruction>(&U))
1599
1600 auto PtrAddFlagsWithConst = [&](int64_t Offset) {
1601 // For nusw/inbounds GEP with an offset that is nonnegative when interpreted
1602 // as signed, assume there is no unsigned overflow.
1603 if (Offset >= 0 && (PtrAddFlags & MachineInstr::MIFlag::NoUSWrap))
1604 return PtrAddFlags | MachineInstr::MIFlag::NoUWrap;
1605 return PtrAddFlags;
1606 };
1607
1608 // Normalize Vector GEP - all scalar operands should be converted to the
1609 // splat vector.
1610 unsigned VectorWidth = 0;
1611
1612 // True if we should use a splat vector; using VectorWidth alone is not
1613 // sufficient.
1614 bool WantSplatVector = false;
1615 if (auto *VT = dyn_cast<VectorType>(U.getType())) {
1616 VectorWidth = cast<FixedVectorType>(VT)->getNumElements();
1617 // We don't produce 1 x N vectors; those are treated as scalars.
1618 WantSplatVector = VectorWidth > 1;
1619 }
1620
1621 // We might need to splat the base pointer into a vector if the offsets
1622 // are vectors.
1623 if (WantSplatVector && !PtrTy.isVector()) {
1624 BaseReg = MIRBuilder
1625 .buildSplatBuildVector(LLT::fixed_vector(VectorWidth, PtrTy),
1626 BaseReg)
1627 .getReg(0);
1628 PtrIRTy = FixedVectorType::get(PtrIRTy, VectorWidth);
1629 PtrTy = getLLTForType(*PtrIRTy, *DL);
1630 OffsetIRTy = DL->getIndexType(PtrIRTy);
1631 OffsetTy = getLLTForType(*OffsetIRTy, *DL);
1632 }
1633
1634 int64_t Offset = 0;
1635 for (gep_type_iterator GTI = gep_type_begin(&U), E = gep_type_end(&U);
1636 GTI != E; ++GTI) {
1637 const Value *Idx = GTI.getOperand();
1638 if (StructType *StTy = GTI.getStructTypeOrNull()) {
1639 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
1641 continue;
1642 } else {
1643 uint64_t ElementSize = GTI.getSequentialElementStride(*DL);
1644
1645 // If this is a scalar constant or a splat vector of constants,
1646 // handle it quickly.
1647 if (const auto *CI = dyn_cast<ConstantInt>(Idx)) {
1648 if (std::optional<int64_t> Val = CI->getValue().trySExtValue()) {
1649 Offset += ElementSize * *Val;
1650 continue;
1651 }
1652 }
1653
1654 if (Offset != 0) {
1655 auto OffsetMIB = MIRBuilder.buildConstant({OffsetTy}, Offset);
1656 BaseReg = MIRBuilder
1657 .buildPtrAdd(PtrTy, BaseReg, OffsetMIB.getReg(0),
1658 PtrAddFlagsWithConst(Offset))
1659 .getReg(0);
1660 Offset = 0;
1661 }
1662
1663 Register IdxReg = getOrCreateVReg(*Idx);
1664 LLT IdxTy = MRI->getType(IdxReg);
1665 if (IdxTy != OffsetTy) {
1666 if (!IdxTy.isVector() && WantSplatVector) {
1667 IdxReg = MIRBuilder
1669 IdxReg)
1670 .getReg(0);
1671 }
1672
1673 IdxReg = MIRBuilder.buildSExtOrTrunc(OffsetTy, IdxReg).getReg(0);
1674 }
1675
1676 // N = N + Idx * ElementSize;
1677 // Avoid doing it for ElementSize of 1.
1678 Register GepOffsetReg;
1679 if (ElementSize != 1) {
1680 auto ElementSizeMIB = MIRBuilder.buildConstant(
1681 getLLTForType(*OffsetIRTy, *DL), ElementSize);
1682
1683 // The multiplication is NUW if the GEP is NUW and NSW if the GEP is
1684 // NUSW.
1685 uint32_t ScaleFlags = PtrAddFlags & MachineInstr::MIFlag::NoUWrap;
1686 if (PtrAddFlags & MachineInstr::MIFlag::NoUSWrap)
1687 ScaleFlags |= MachineInstr::MIFlag::NoSWrap;
1688
1689 GepOffsetReg =
1690 MIRBuilder.buildMul(OffsetTy, IdxReg, ElementSizeMIB, ScaleFlags)
1691 .getReg(0);
1692 } else {
1693 GepOffsetReg = IdxReg;
1694 }
1695
1696 BaseReg =
1697 MIRBuilder.buildPtrAdd(PtrTy, BaseReg, GepOffsetReg, PtrAddFlags)
1698 .getReg(0);
1699 }
1700 }
1701
1702 if (Offset != 0) {
1703 auto OffsetMIB =
1704 MIRBuilder.buildConstant(OffsetTy, Offset);
1705
1706 MIRBuilder.buildPtrAdd(getOrCreateVReg(U), BaseReg, OffsetMIB.getReg(0),
1707 PtrAddFlagsWithConst(Offset));
1708 return true;
1709 }
1710
1711 MIRBuilder.buildCopy(getOrCreateVReg(U), BaseReg);
1712 return true;
1713}
1714
1715bool IRTranslator::translateMemFunc(const CallInst &CI,
1716 MachineIRBuilder &MIRBuilder,
1717 unsigned Opcode) {
1718 const Value *SrcPtr = CI.getArgOperand(1);
1719 // If the source is undef, then just emit a nop.
1720 if (isa<UndefValue>(SrcPtr))
1721 return true;
1722
1724
1725 unsigned MinPtrSize = UINT_MAX;
1726 for (auto AI = CI.arg_begin(), AE = CI.arg_end(); std::next(AI) != AE; ++AI) {
1727 Register SrcReg = getOrCreateVReg(**AI);
1728 LLT SrcTy = MRI->getType(SrcReg);
1729 if (SrcTy.isPointer())
1730 MinPtrSize = std::min<unsigned>(SrcTy.getSizeInBits(), MinPtrSize);
1731 SrcRegs.push_back(SrcReg);
1732 }
1733
1734 LLT SizeTy = LLT::scalar(MinPtrSize);
1735
1736 // The size operand should be the minimum of the pointer sizes.
1737 Register &SizeOpReg = SrcRegs[SrcRegs.size() - 1];
1738 if (MRI->getType(SizeOpReg) != SizeTy)
1739 SizeOpReg = MIRBuilder.buildZExtOrTrunc(SizeTy, SizeOpReg).getReg(0);
1740
1741 auto ICall = MIRBuilder.buildInstr(Opcode);
1742 for (Register SrcReg : SrcRegs)
1743 ICall.addUse(SrcReg);
1744
1745 Align DstAlign;
1746 Align SrcAlign;
1747 unsigned IsVol =
1748 cast<ConstantInt>(CI.getArgOperand(CI.arg_size() - 1))->getZExtValue();
1749
1750 ConstantInt *CopySize = nullptr;
1751
1752 if (auto *MCI = dyn_cast<MemCpyInst>(&CI)) {
1753 DstAlign = MCI->getDestAlign().valueOrOne();
1754 SrcAlign = MCI->getSourceAlign().valueOrOne();
1755 CopySize = dyn_cast<ConstantInt>(MCI->getArgOperand(2));
1756 } else if (auto *MMI = dyn_cast<MemMoveInst>(&CI)) {
1757 DstAlign = MMI->getDestAlign().valueOrOne();
1758 SrcAlign = MMI->getSourceAlign().valueOrOne();
1759 CopySize = dyn_cast<ConstantInt>(MMI->getArgOperand(2));
1760 } else {
1761 auto *MSI = cast<MemSetInst>(&CI);
1762 DstAlign = MSI->getDestAlign().valueOrOne();
1763 }
1764
1765 if (Opcode != TargetOpcode::G_MEMCPY_INLINE) {
1766 // We need to propagate the tail call flag from the IR inst as an argument.
1767 // Otherwise, we have to pessimize and assume later that we cannot tail call
1768 // any memory intrinsics.
1769 ICall.addImm(CI.isTailCall() ? 1 : 0);
1770 }
1771
1772 // Create mem operands to store the alignment and volatile info.
1775 if (IsVol) {
1776 LoadFlags |= MachineMemOperand::MOVolatile;
1777 StoreFlags |= MachineMemOperand::MOVolatile;
1778 }
1779
1780 AAMDNodes AAInfo = CI.getAAMetadata();
1781 if (AA && CopySize &&
1783 SrcPtr, LocationSize::precise(CopySize->getZExtValue()), AAInfo))) {
1784 LoadFlags |= MachineMemOperand::MOInvariant;
1785
1786 // FIXME: pointsToConstantMemory probably does not imply dereferenceable,
1787 // but the previous usage implied it did. Probably should check
1788 // isDereferenceableAndAlignedPointer.
1790 }
1791
1792 ICall.addMemOperand(
1794 StoreFlags, 1, DstAlign, AAInfo));
1795 if (Opcode != TargetOpcode::G_MEMSET)
1796 ICall.addMemOperand(MF->getMachineMemOperand(
1797 MachinePointerInfo(SrcPtr), LoadFlags, 1, SrcAlign, AAInfo));
1798
1799 return true;
1800}
1801
1802bool IRTranslator::translateTrap(const CallInst &CI,
1803 MachineIRBuilder &MIRBuilder,
1804 unsigned Opcode) {
1805 StringRef TrapFuncName =
1806 CI.getAttributes().getFnAttr("trap-func-name").getValueAsString();
1807 if (TrapFuncName.empty()) {
1808 if (Opcode == TargetOpcode::G_UBSANTRAP) {
1809 uint64_t Code = cast<ConstantInt>(CI.getOperand(0))->getZExtValue();
1810 MIRBuilder.buildInstr(Opcode, {}, ArrayRef<llvm::SrcOp>{Code});
1811 } else {
1812 MIRBuilder.buildInstr(Opcode);
1813 }
1814 return true;
1815 }
1816
1818 if (Opcode == TargetOpcode::G_UBSANTRAP)
1819 Info.OrigArgs.push_back({getOrCreateVRegs(*CI.getArgOperand(0)),
1820 CI.getArgOperand(0)->getType(), 0});
1821
1822 Info.Callee = MachineOperand::CreateES(TrapFuncName.data());
1823 Info.CB = &CI;
1824 Info.OrigRet = {Register(), Type::getVoidTy(CI.getContext()), 0};
1825 return CLI->lowerCall(MIRBuilder, Info);
1826}
1827
1828bool IRTranslator::translateVectorInterleave2Intrinsic(
1829 const CallInst &CI, MachineIRBuilder &MIRBuilder) {
1830 assert(CI.getIntrinsicID() == Intrinsic::vector_interleave2 &&
1831 "This function can only be called on the interleave2 intrinsic!");
1832 // Canonicalize interleave2 to G_SHUFFLE_VECTOR (similar to SelectionDAG).
1833 Register Op0 = getOrCreateVReg(*CI.getOperand(0));
1834 Register Op1 = getOrCreateVReg(*CI.getOperand(1));
1835 Register Res = getOrCreateVReg(CI);
1836
1837 LLT OpTy = MRI->getType(Op0);
1838 MIRBuilder.buildShuffleVector(Res, Op0, Op1,
1840
1841 return true;
1842}
1843
1844bool IRTranslator::translateVectorDeinterleave2Intrinsic(
1845 const CallInst &CI, MachineIRBuilder &MIRBuilder) {
1846 assert(CI.getIntrinsicID() == Intrinsic::vector_deinterleave2 &&
1847 "This function can only be called on the deinterleave2 intrinsic!");
1848 // Canonicalize deinterleave2 to shuffles that extract sub-vectors (similar to
1849 // SelectionDAG).
1850 Register Op = getOrCreateVReg(*CI.getOperand(0));
1851 auto Undef = MIRBuilder.buildUndef(MRI->getType(Op));
1852 ArrayRef<Register> Res = getOrCreateVRegs(CI);
1853
1854 LLT ResTy = MRI->getType(Res[0]);
1855 MIRBuilder.buildShuffleVector(Res[0], Op, Undef,
1856 createStrideMask(0, 2, ResTy.getNumElements()));
1857 MIRBuilder.buildShuffleVector(Res[1], Op, Undef,
1858 createStrideMask(1, 2, ResTy.getNumElements()));
1859
1860 return true;
1861}
1862
1863void IRTranslator::getStackGuard(Register DstReg,
1864 MachineIRBuilder &MIRBuilder) {
1866 MRI->setRegClass(DstReg, TRI->getPointerRegClass(*MF));
1867 auto MIB =
1868 MIRBuilder.buildInstr(TargetOpcode::LOAD_STACK_GUARD, {DstReg}, {});
1869
1871 if (!Global)
1872 return;
1873
1874 unsigned AddrSpace = Global->getType()->getPointerAddressSpace();
1875 LLT PtrTy = LLT::pointer(AddrSpace, DL->getPointerSizeInBits(AddrSpace));
1876
1877 MachinePointerInfo MPInfo(Global);
1881 MPInfo, Flags, PtrTy, DL->getPointerABIAlignment(AddrSpace));
1882 MIB.setMemRefs({MemRef});
1883}
1884
1885bool IRTranslator::translateOverflowIntrinsic(const CallInst &CI, unsigned Op,
1886 MachineIRBuilder &MIRBuilder) {
1887 ArrayRef<Register> ResRegs = getOrCreateVRegs(CI);
1888 MIRBuilder.buildInstr(
1889 Op, {ResRegs[0], ResRegs[1]},
1890 {getOrCreateVReg(*CI.getOperand(0)), getOrCreateVReg(*CI.getOperand(1))});
1891
1892 return true;
1893}
1894
1895bool IRTranslator::translateFixedPointIntrinsic(unsigned Op, const CallInst &CI,
1896 MachineIRBuilder &MIRBuilder) {
1897 Register Dst = getOrCreateVReg(CI);
1898 Register Src0 = getOrCreateVReg(*CI.getOperand(0));
1899 Register Src1 = getOrCreateVReg(*CI.getOperand(1));
1900 uint64_t Scale = cast<ConstantInt>(CI.getOperand(2))->getZExtValue();
1901 MIRBuilder.buildInstr(Op, {Dst}, { Src0, Src1, Scale });
1902 return true;
1903}
1904
1905unsigned IRTranslator::getSimpleIntrinsicOpcode(Intrinsic::ID ID) {
1906 switch (ID) {
1907 default:
1908 break;
1909 case Intrinsic::acos:
1910 return TargetOpcode::G_FACOS;
1911 case Intrinsic::asin:
1912 return TargetOpcode::G_FASIN;
1913 case Intrinsic::atan:
1914 return TargetOpcode::G_FATAN;
1915 case Intrinsic::atan2:
1916 return TargetOpcode::G_FATAN2;
1917 case Intrinsic::bswap:
1918 return TargetOpcode::G_BSWAP;
1919 case Intrinsic::bitreverse:
1920 return TargetOpcode::G_BITREVERSE;
1921 case Intrinsic::fshl:
1922 return TargetOpcode::G_FSHL;
1923 case Intrinsic::fshr:
1924 return TargetOpcode::G_FSHR;
1925 case Intrinsic::ceil:
1926 return TargetOpcode::G_FCEIL;
1927 case Intrinsic::cos:
1928 return TargetOpcode::G_FCOS;
1929 case Intrinsic::cosh:
1930 return TargetOpcode::G_FCOSH;
1931 case Intrinsic::ctpop:
1932 return TargetOpcode::G_CTPOP;
1933 case Intrinsic::exp:
1934 return TargetOpcode::G_FEXP;
1935 case Intrinsic::exp2:
1936 return TargetOpcode::G_FEXP2;
1937 case Intrinsic::exp10:
1938 return TargetOpcode::G_FEXP10;
1939 case Intrinsic::fabs:
1940 return TargetOpcode::G_FABS;
1941 case Intrinsic::copysign:
1942 return TargetOpcode::G_FCOPYSIGN;
1943 case Intrinsic::minnum:
1944 return TargetOpcode::G_FMINNUM;
1945 case Intrinsic::maxnum:
1946 return TargetOpcode::G_FMAXNUM;
1947 case Intrinsic::minimum:
1948 return TargetOpcode::G_FMINIMUM;
1949 case Intrinsic::maximum:
1950 return TargetOpcode::G_FMAXIMUM;
1951 case Intrinsic::minimumnum:
1952 return TargetOpcode::G_FMINIMUMNUM;
1953 case Intrinsic::maximumnum:
1954 return TargetOpcode::G_FMAXIMUMNUM;
1955 case Intrinsic::canonicalize:
1956 return TargetOpcode::G_FCANONICALIZE;
1957 case Intrinsic::floor:
1958 return TargetOpcode::G_FFLOOR;
1959 case Intrinsic::fma:
1960 return TargetOpcode::G_FMA;
1961 case Intrinsic::log:
1962 return TargetOpcode::G_FLOG;
1963 case Intrinsic::log2:
1964 return TargetOpcode::G_FLOG2;
1965 case Intrinsic::log10:
1966 return TargetOpcode::G_FLOG10;
1967 case Intrinsic::ldexp:
1968 return TargetOpcode::G_FLDEXP;
1969 case Intrinsic::nearbyint:
1970 return TargetOpcode::G_FNEARBYINT;
1971 case Intrinsic::pow:
1972 return TargetOpcode::G_FPOW;
1973 case Intrinsic::powi:
1974 return TargetOpcode::G_FPOWI;
1975 case Intrinsic::rint:
1976 return TargetOpcode::G_FRINT;
1977 case Intrinsic::round:
1978 return TargetOpcode::G_INTRINSIC_ROUND;
1979 case Intrinsic::roundeven:
1980 return TargetOpcode::G_INTRINSIC_ROUNDEVEN;
1981 case Intrinsic::sin:
1982 return TargetOpcode::G_FSIN;
1983 case Intrinsic::sinh:
1984 return TargetOpcode::G_FSINH;
1985 case Intrinsic::sqrt:
1986 return TargetOpcode::G_FSQRT;
1987 case Intrinsic::tan:
1988 return TargetOpcode::G_FTAN;
1989 case Intrinsic::tanh:
1990 return TargetOpcode::G_FTANH;
1991 case Intrinsic::trunc:
1992 return TargetOpcode::G_INTRINSIC_TRUNC;
1993 case Intrinsic::readcyclecounter:
1994 return TargetOpcode::G_READCYCLECOUNTER;
1995 case Intrinsic::readsteadycounter:
1996 return TargetOpcode::G_READSTEADYCOUNTER;
1997 case Intrinsic::ptrmask:
1998 return TargetOpcode::G_PTRMASK;
1999 case Intrinsic::lrint:
2000 return TargetOpcode::G_INTRINSIC_LRINT;
2001 case Intrinsic::llrint:
2002 return TargetOpcode::G_INTRINSIC_LLRINT;
2003 // FADD/FMUL require checking the FMF, so are handled elsewhere.
2004 case Intrinsic::vector_reduce_fmin:
2005 return TargetOpcode::G_VECREDUCE_FMIN;
2006 case Intrinsic::vector_reduce_fmax:
2007 return TargetOpcode::G_VECREDUCE_FMAX;
2008 case Intrinsic::vector_reduce_fminimum:
2009 return TargetOpcode::G_VECREDUCE_FMINIMUM;
2010 case Intrinsic::vector_reduce_fmaximum:
2011 return TargetOpcode::G_VECREDUCE_FMAXIMUM;
2012 case Intrinsic::vector_reduce_add:
2013 return TargetOpcode::G_VECREDUCE_ADD;
2014 case Intrinsic::vector_reduce_mul:
2015 return TargetOpcode::G_VECREDUCE_MUL;
2016 case Intrinsic::vector_reduce_and:
2017 return TargetOpcode::G_VECREDUCE_AND;
2018 case Intrinsic::vector_reduce_or:
2019 return TargetOpcode::G_VECREDUCE_OR;
2020 case Intrinsic::vector_reduce_xor:
2021 return TargetOpcode::G_VECREDUCE_XOR;
2022 case Intrinsic::vector_reduce_smax:
2023 return TargetOpcode::G_VECREDUCE_SMAX;
2024 case Intrinsic::vector_reduce_smin:
2025 return TargetOpcode::G_VECREDUCE_SMIN;
2026 case Intrinsic::vector_reduce_umax:
2027 return TargetOpcode::G_VECREDUCE_UMAX;
2028 case Intrinsic::vector_reduce_umin:
2029 return TargetOpcode::G_VECREDUCE_UMIN;
2030 case Intrinsic::experimental_vector_compress:
2031 return TargetOpcode::G_VECTOR_COMPRESS;
2032 case Intrinsic::lround:
2033 return TargetOpcode::G_LROUND;
2034 case Intrinsic::llround:
2035 return TargetOpcode::G_LLROUND;
2036 case Intrinsic::get_fpenv:
2037 return TargetOpcode::G_GET_FPENV;
2038 case Intrinsic::get_fpmode:
2039 return TargetOpcode::G_GET_FPMODE;
2040 }
2042}
2043
2044bool IRTranslator::translateSimpleIntrinsic(const CallInst &CI,
2046 MachineIRBuilder &MIRBuilder) {
2047
2048 unsigned Op = getSimpleIntrinsicOpcode(ID);
2049
2050 // Is this a simple intrinsic?
2052 return false;
2053
2054 // Yes. Let's translate it.
2056 for (const auto &Arg : CI.args())
2057 VRegs.push_back(getOrCreateVReg(*Arg));
2058
2059 MIRBuilder.buildInstr(Op, {getOrCreateVReg(CI)}, VRegs,
2061 return true;
2062}
2063
2064// TODO: Include ConstainedOps.def when all strict instructions are defined.
2066 switch (ID) {
2067 case Intrinsic::experimental_constrained_fadd:
2068 return TargetOpcode::G_STRICT_FADD;
2069 case Intrinsic::experimental_constrained_fsub:
2070 return TargetOpcode::G_STRICT_FSUB;
2071 case Intrinsic::experimental_constrained_fmul:
2072 return TargetOpcode::G_STRICT_FMUL;
2073 case Intrinsic::experimental_constrained_fdiv:
2074 return TargetOpcode::G_STRICT_FDIV;
2075 case Intrinsic::experimental_constrained_frem:
2076 return TargetOpcode::G_STRICT_FREM;
2077 case Intrinsic::experimental_constrained_fma:
2078 return TargetOpcode::G_STRICT_FMA;
2079 case Intrinsic::experimental_constrained_sqrt:
2080 return TargetOpcode::G_STRICT_FSQRT;
2081 case Intrinsic::experimental_constrained_ldexp:
2082 return TargetOpcode::G_STRICT_FLDEXP;
2083 default:
2084 return 0;
2085 }
2086}
2087
2088bool IRTranslator::translateConstrainedFPIntrinsic(
2089 const ConstrainedFPIntrinsic &FPI, MachineIRBuilder &MIRBuilder) {
2091
2092 unsigned Opcode = getConstrainedOpcode(FPI.getIntrinsicID());
2093 if (!Opcode)
2094 return false;
2095
2099
2101 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
2102 VRegs.push_back(getOrCreateVReg(*FPI.getArgOperand(I)));
2103
2104 MIRBuilder.buildInstr(Opcode, {getOrCreateVReg(FPI)}, VRegs, Flags);
2105 return true;
2106}
2107
2108std::optional<MCRegister> IRTranslator::getArgPhysReg(Argument &Arg) {
2109 auto VRegs = getOrCreateVRegs(Arg);
2110 if (VRegs.size() != 1)
2111 return std::nullopt;
2112
2113 // Arguments are lowered as a copy of a livein physical register.
2114 auto *VRegDef = MF->getRegInfo().getVRegDef(VRegs[0]);
2115 if (!VRegDef || !VRegDef->isCopy())
2116 return std::nullopt;
2117 return VRegDef->getOperand(1).getReg().asMCReg();
2118}
2119
2120bool IRTranslator::translateIfEntryValueArgument(bool isDeclare, Value *Val,
2121 const DILocalVariable *Var,
2122 const DIExpression *Expr,
2123 const DebugLoc &DL,
2124 MachineIRBuilder &MIRBuilder) {
2125 auto *Arg = dyn_cast<Argument>(Val);
2126 if (!Arg)
2127 return false;
2128
2129 if (!Expr->isEntryValue())
2130 return false;
2131
2132 std::optional<MCRegister> PhysReg = getArgPhysReg(*Arg);
2133 if (!PhysReg) {
2134 LLVM_DEBUG(dbgs() << "Dropping dbg." << (isDeclare ? "declare" : "value")
2135 << ": expression is entry_value but "
2136 << "couldn't find a physical register\n");
2137 LLVM_DEBUG(dbgs() << *Var << "\n");
2138 return true;
2139 }
2140
2141 if (isDeclare) {
2142 // Append an op deref to account for the fact that this is a dbg_declare.
2143 Expr = DIExpression::append(Expr, dwarf::DW_OP_deref);
2144 MF->setVariableDbgInfo(Var, Expr, *PhysReg, DL);
2145 } else {
2146 MIRBuilder.buildDirectDbgValue(*PhysReg, Var, Expr);
2147 }
2148
2149 return true;
2150}
2151
2153 switch (ID) {
2154 default:
2155 llvm_unreachable("Unexpected intrinsic");
2156 case Intrinsic::experimental_convergence_anchor:
2157 return TargetOpcode::CONVERGENCECTRL_ANCHOR;
2158 case Intrinsic::experimental_convergence_entry:
2159 return TargetOpcode::CONVERGENCECTRL_ENTRY;
2160 case Intrinsic::experimental_convergence_loop:
2161 return TargetOpcode::CONVERGENCECTRL_LOOP;
2162 }
2163}
2164
2165bool IRTranslator::translateConvergenceControlIntrinsic(
2166 const CallInst &CI, Intrinsic::ID ID, MachineIRBuilder &MIRBuilder) {
2168 Register OutputReg = getOrCreateConvergenceTokenVReg(CI);
2169 MIB.addDef(OutputReg);
2170
2171 if (ID == Intrinsic::experimental_convergence_loop) {
2173 assert(Bundle && "Expected a convergence control token.");
2174 Register InputReg =
2175 getOrCreateConvergenceTokenVReg(*Bundle->Inputs[0].get());
2176 MIB.addUse(InputReg);
2177 }
2178
2179 return true;
2180}
2181
2182bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
2183 MachineIRBuilder &MIRBuilder) {
2184 if (auto *MI = dyn_cast<AnyMemIntrinsic>(&CI)) {
2185 if (ORE->enabled()) {
2186 if (MemoryOpRemark::canHandle(MI, *LibInfo)) {
2187 MemoryOpRemark R(*ORE, "gisel-irtranslator-memsize", *DL, *LibInfo);
2188 R.visit(MI);
2189 }
2190 }
2191 }
2192
2193 // If this is a simple intrinsic (that is, we just need to add a def of
2194 // a vreg, and uses for each arg operand, then translate it.
2195 if (translateSimpleIntrinsic(CI, ID, MIRBuilder))
2196 return true;
2197
2198 switch (ID) {
2199 default:
2200 break;
2201 case Intrinsic::lifetime_start:
2202 case Intrinsic::lifetime_end: {
2203 // No stack colouring in O0, discard region information.
2205 MF->getFunction().hasOptNone())
2206 return true;
2207
2208 unsigned Op = ID == Intrinsic::lifetime_start ? TargetOpcode::LIFETIME_START
2209 : TargetOpcode::LIFETIME_END;
2210
2211 const AllocaInst *AI = dyn_cast<AllocaInst>(CI.getArgOperand(0));
2212 if (!AI || !AI->isStaticAlloca())
2213 return true;
2214
2215 MIRBuilder.buildInstr(Op).addFrameIndex(getOrCreateFrameIndex(*AI));
2216 return true;
2217 }
2218 case Intrinsic::fake_use: {
2220 for (const auto &Arg : CI.args())
2221 llvm::append_range(VRegs, getOrCreateVRegs(*Arg));
2222 MIRBuilder.buildInstr(TargetOpcode::FAKE_USE, {}, VRegs);
2223 MF->setHasFakeUses(true);
2224 return true;
2225 }
2226 case Intrinsic::dbg_declare: {
2227 const DbgDeclareInst &DI = cast<DbgDeclareInst>(CI);
2228 assert(DI.getVariable() && "Missing variable");
2229 translateDbgDeclareRecord(DI.getAddress(), DI.hasArgList(), DI.getVariable(),
2230 DI.getExpression(), DI.getDebugLoc(), MIRBuilder);
2231 return true;
2232 }
2233 case Intrinsic::dbg_label: {
2234 const DbgLabelInst &DI = cast<DbgLabelInst>(CI);
2235 assert(DI.getLabel() && "Missing label");
2236
2238 MIRBuilder.getDebugLoc()) &&
2239 "Expected inlined-at fields to agree");
2240
2241 MIRBuilder.buildDbgLabel(DI.getLabel());
2242 return true;
2243 }
2244 case Intrinsic::vaend:
2245 // No target I know of cares about va_end. Certainly no in-tree target
2246 // does. Simplest intrinsic ever!
2247 return true;
2248 case Intrinsic::vastart: {
2249 Value *Ptr = CI.getArgOperand(0);
2250 unsigned ListSize = TLI->getVaListSizeInBits(*DL) / 8;
2251 Align Alignment = getKnownAlignment(Ptr, *DL);
2252
2253 MIRBuilder.buildInstr(TargetOpcode::G_VASTART, {}, {getOrCreateVReg(*Ptr)})
2254 .addMemOperand(MF->getMachineMemOperand(MachinePointerInfo(Ptr),
2256 ListSize, Alignment));
2257 return true;
2258 }
2259 case Intrinsic::dbg_assign:
2260 // A dbg.assign is a dbg.value with more information about stack locations,
2261 // typically produced during optimisation of variables with leaked
2262 // addresses. We can treat it like a normal dbg_value intrinsic here; to
2263 // benefit from the full analysis of stack/SSA locations, GlobalISel would
2264 // need to register for and use the AssignmentTrackingAnalysis pass.
2265 [[fallthrough]];
2266 case Intrinsic::dbg_value: {
2267 // This form of DBG_VALUE is target-independent.
2268 const DbgValueInst &DI = cast<DbgValueInst>(CI);
2269 translateDbgValueRecord(DI.getValue(), DI.hasArgList(), DI.getVariable(),
2270 DI.getExpression(), DI.getDebugLoc(), MIRBuilder);
2271 return true;
2272 }
2273 case Intrinsic::uadd_with_overflow:
2274 return translateOverflowIntrinsic(CI, TargetOpcode::G_UADDO, MIRBuilder);
2275 case Intrinsic::sadd_with_overflow:
2276 return translateOverflowIntrinsic(CI, TargetOpcode::G_SADDO, MIRBuilder);
2277 case Intrinsic::usub_with_overflow:
2278 return translateOverflowIntrinsic(CI, TargetOpcode::G_USUBO, MIRBuilder);
2279 case Intrinsic::ssub_with_overflow:
2280 return translateOverflowIntrinsic(CI, TargetOpcode::G_SSUBO, MIRBuilder);
2281 case Intrinsic::umul_with_overflow:
2282 return translateOverflowIntrinsic(CI, TargetOpcode::G_UMULO, MIRBuilder);
2283 case Intrinsic::smul_with_overflow:
2284 return translateOverflowIntrinsic(CI, TargetOpcode::G_SMULO, MIRBuilder);
2285 case Intrinsic::uadd_sat:
2286 return translateBinaryOp(TargetOpcode::G_UADDSAT, CI, MIRBuilder);
2287 case Intrinsic::sadd_sat:
2288 return translateBinaryOp(TargetOpcode::G_SADDSAT, CI, MIRBuilder);
2289 case Intrinsic::usub_sat:
2290 return translateBinaryOp(TargetOpcode::G_USUBSAT, CI, MIRBuilder);
2291 case Intrinsic::ssub_sat:
2292 return translateBinaryOp(TargetOpcode::G_SSUBSAT, CI, MIRBuilder);
2293 case Intrinsic::ushl_sat:
2294 return translateBinaryOp(TargetOpcode::G_USHLSAT, CI, MIRBuilder);
2295 case Intrinsic::sshl_sat:
2296 return translateBinaryOp(TargetOpcode::G_SSHLSAT, CI, MIRBuilder);
2297 case Intrinsic::umin:
2298 return translateBinaryOp(TargetOpcode::G_UMIN, CI, MIRBuilder);
2299 case Intrinsic::umax:
2300 return translateBinaryOp(TargetOpcode::G_UMAX, CI, MIRBuilder);
2301 case Intrinsic::smin:
2302 return translateBinaryOp(TargetOpcode::G_SMIN, CI, MIRBuilder);
2303 case Intrinsic::smax:
2304 return translateBinaryOp(TargetOpcode::G_SMAX, CI, MIRBuilder);
2305 case Intrinsic::abs:
2306 // TODO: Preserve "int min is poison" arg in GMIR?
2307 return translateUnaryOp(TargetOpcode::G_ABS, CI, MIRBuilder);
2308 case Intrinsic::smul_fix:
2309 return translateFixedPointIntrinsic(TargetOpcode::G_SMULFIX, CI, MIRBuilder);
2310 case Intrinsic::umul_fix:
2311 return translateFixedPointIntrinsic(TargetOpcode::G_UMULFIX, CI, MIRBuilder);
2312 case Intrinsic::smul_fix_sat:
2313 return translateFixedPointIntrinsic(TargetOpcode::G_SMULFIXSAT, CI, MIRBuilder);
2314 case Intrinsic::umul_fix_sat:
2315 return translateFixedPointIntrinsic(TargetOpcode::G_UMULFIXSAT, CI, MIRBuilder);
2316 case Intrinsic::sdiv_fix:
2317 return translateFixedPointIntrinsic(TargetOpcode::G_SDIVFIX, CI, MIRBuilder);
2318 case Intrinsic::udiv_fix:
2319 return translateFixedPointIntrinsic(TargetOpcode::G_UDIVFIX, CI, MIRBuilder);
2320 case Intrinsic::sdiv_fix_sat:
2321 return translateFixedPointIntrinsic(TargetOpcode::G_SDIVFIXSAT, CI, MIRBuilder);
2322 case Intrinsic::udiv_fix_sat:
2323 return translateFixedPointIntrinsic(TargetOpcode::G_UDIVFIXSAT, CI, MIRBuilder);
2324 case Intrinsic::fmuladd: {
2325 const TargetMachine &TM = MF->getTarget();
2326 Register Dst = getOrCreateVReg(CI);
2327 Register Op0 = getOrCreateVReg(*CI.getArgOperand(0));
2328 Register Op1 = getOrCreateVReg(*CI.getArgOperand(1));
2329 Register Op2 = getOrCreateVReg(*CI.getArgOperand(2));
2330 if (TM.Options.AllowFPOpFusion != FPOpFusion::Strict &&
2332 TLI->getValueType(*DL, CI.getType()))) {
2333 // TODO: Revisit this to see if we should move this part of the
2334 // lowering to the combiner.
2335 MIRBuilder.buildFMA(Dst, Op0, Op1, Op2,
2337 } else {
2338 LLT Ty = getLLTForType(*CI.getType(), *DL);
2339 auto FMul = MIRBuilder.buildFMul(
2340 Ty, Op0, Op1, MachineInstr::copyFlagsFromInstruction(CI));
2341 MIRBuilder.buildFAdd(Dst, FMul, Op2,
2343 }
2344 return true;
2345 }
2346 case Intrinsic::convert_from_fp16:
2347 // FIXME: This intrinsic should probably be removed from the IR.
2348 MIRBuilder.buildFPExt(getOrCreateVReg(CI),
2349 getOrCreateVReg(*CI.getArgOperand(0)),
2351 return true;
2352 case Intrinsic::convert_to_fp16:
2353 // FIXME: This intrinsic should probably be removed from the IR.
2354 MIRBuilder.buildFPTrunc(getOrCreateVReg(CI),
2355 getOrCreateVReg(*CI.getArgOperand(0)),
2357 return true;
2358 case Intrinsic::frexp: {
2359 ArrayRef<Register> VRegs = getOrCreateVRegs(CI);
2360 MIRBuilder.buildFFrexp(VRegs[0], VRegs[1],
2361 getOrCreateVReg(*CI.getArgOperand(0)),
2363 return true;
2364 }
2365 case Intrinsic::sincos: {
2366 ArrayRef<Register> VRegs = getOrCreateVRegs(CI);
2367 MIRBuilder.buildFSincos(VRegs[0], VRegs[1],
2368 getOrCreateVReg(*CI.getArgOperand(0)),
2370 return true;
2371 }
2372 case Intrinsic::fptosi_sat:
2373 MIRBuilder.buildFPTOSI_SAT(getOrCreateVReg(CI),
2374 getOrCreateVReg(*CI.getArgOperand(0)));
2375 return true;
2376 case Intrinsic::fptoui_sat:
2377 MIRBuilder.buildFPTOUI_SAT(getOrCreateVReg(CI),
2378 getOrCreateVReg(*CI.getArgOperand(0)));
2379 return true;
2380 case Intrinsic::memcpy_inline:
2381 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMCPY_INLINE);
2382 case Intrinsic::memcpy:
2383 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMCPY);
2384 case Intrinsic::memmove:
2385 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMMOVE);
2386 case Intrinsic::memset:
2387 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMSET);
2388 case Intrinsic::eh_typeid_for: {
2390 Register Reg = getOrCreateVReg(CI);
2391 unsigned TypeID = MF->getTypeIDFor(GV);
2392 MIRBuilder.buildConstant(Reg, TypeID);
2393 return true;
2394 }
2395 case Intrinsic::objectsize:
2396 llvm_unreachable("llvm.objectsize.* should have been lowered already");
2397
2398 case Intrinsic::is_constant:
2399 llvm_unreachable("llvm.is.constant.* should have been lowered already");
2400
2401 case Intrinsic::stackguard:
2402 getStackGuard(getOrCreateVReg(CI), MIRBuilder);
2403 return true;
2404 case Intrinsic::stackprotector: {
2405 LLT PtrTy = getLLTForType(*CI.getArgOperand(0)->getType(), *DL);
2406 Register GuardVal;
2407 if (TLI->useLoadStackGuardNode(*CI.getModule())) {
2408 GuardVal = MRI->createGenericVirtualRegister(PtrTy);
2409 getStackGuard(GuardVal, MIRBuilder);
2410 } else
2411 GuardVal = getOrCreateVReg(*CI.getArgOperand(0)); // The guard's value.
2412
2413 AllocaInst *Slot = cast<AllocaInst>(CI.getArgOperand(1));
2414 int FI = getOrCreateFrameIndex(*Slot);
2416
2417 MIRBuilder.buildStore(
2418 GuardVal, getOrCreateVReg(*Slot),
2422 PtrTy, Align(8)));
2423 return true;
2424 }
2425 case Intrinsic::stacksave: {
2426 MIRBuilder.buildInstr(TargetOpcode::G_STACKSAVE, {getOrCreateVReg(CI)}, {});
2427 return true;
2428 }
2429 case Intrinsic::stackrestore: {
2430 MIRBuilder.buildInstr(TargetOpcode::G_STACKRESTORE, {},
2431 {getOrCreateVReg(*CI.getArgOperand(0))});
2432 return true;
2433 }
2434 case Intrinsic::cttz:
2435 case Intrinsic::ctlz: {
2436 ConstantInt *Cst = cast<ConstantInt>(CI.getArgOperand(1));
2437 bool isTrailing = ID == Intrinsic::cttz;
2438 unsigned Opcode = isTrailing
2439 ? Cst->isZero() ? TargetOpcode::G_CTTZ
2440 : TargetOpcode::G_CTTZ_ZERO_UNDEF
2441 : Cst->isZero() ? TargetOpcode::G_CTLZ
2442 : TargetOpcode::G_CTLZ_ZERO_UNDEF;
2443 MIRBuilder.buildInstr(Opcode, {getOrCreateVReg(CI)},
2444 {getOrCreateVReg(*CI.getArgOperand(0))});
2445 return true;
2446 }
2447 case Intrinsic::invariant_start: {
2448 MIRBuilder.buildUndef(getOrCreateVReg(CI));
2449 return true;
2450 }
2451 case Intrinsic::invariant_end:
2452 return true;
2453 case Intrinsic::expect:
2454 case Intrinsic::expect_with_probability:
2455 case Intrinsic::annotation:
2456 case Intrinsic::ptr_annotation:
2457 case Intrinsic::launder_invariant_group:
2458 case Intrinsic::strip_invariant_group: {
2459 // Drop the intrinsic, but forward the value.
2460 MIRBuilder.buildCopy(getOrCreateVReg(CI),
2461 getOrCreateVReg(*CI.getArgOperand(0)));
2462 return true;
2463 }
2464 case Intrinsic::assume:
2465 case Intrinsic::experimental_noalias_scope_decl:
2466 case Intrinsic::var_annotation:
2467 case Intrinsic::sideeffect:
2468 // Discard annotate attributes, assumptions, and artificial side-effects.
2469 return true;
2470 case Intrinsic::read_volatile_register:
2471 case Intrinsic::read_register: {
2472 Value *Arg = CI.getArgOperand(0);
2473 MIRBuilder
2474 .buildInstr(TargetOpcode::G_READ_REGISTER, {getOrCreateVReg(CI)}, {})
2475 .addMetadata(cast<MDNode>(cast<MetadataAsValue>(Arg)->getMetadata()));
2476 return true;
2477 }
2478 case Intrinsic::write_register: {
2479 Value *Arg = CI.getArgOperand(0);
2480 MIRBuilder.buildInstr(TargetOpcode::G_WRITE_REGISTER)
2481 .addMetadata(cast<MDNode>(cast<MetadataAsValue>(Arg)->getMetadata()))
2482 .addUse(getOrCreateVReg(*CI.getArgOperand(1)));
2483 return true;
2484 }
2485 case Intrinsic::localescape: {
2486 MachineBasicBlock &EntryMBB = MF->front();
2488
2489 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
2490 // is the same on all targets.
2491 for (unsigned Idx = 0, E = CI.arg_size(); Idx < E; ++Idx) {
2493 if (isa<ConstantPointerNull>(Arg))
2494 continue; // Skip null pointers. They represent a hole in index space.
2495
2496 int FI = getOrCreateFrameIndex(*cast<AllocaInst>(Arg));
2497 MCSymbol *FrameAllocSym =
2498 MF->getContext().getOrCreateFrameAllocSymbol(EscapedName, Idx);
2499
2500 // This should be inserted at the start of the entry block.
2501 auto LocalEscape =
2502 MIRBuilder.buildInstrNoInsert(TargetOpcode::LOCAL_ESCAPE)
2503 .addSym(FrameAllocSym)
2504 .addFrameIndex(FI);
2505
2506 EntryMBB.insert(EntryMBB.begin(), LocalEscape);
2507 }
2508
2509 return true;
2510 }
2511 case Intrinsic::vector_reduce_fadd:
2512 case Intrinsic::vector_reduce_fmul: {
2513 // Need to check for the reassoc flag to decide whether we want a
2514 // sequential reduction opcode or not.
2515 Register Dst = getOrCreateVReg(CI);
2516 Register ScalarSrc = getOrCreateVReg(*CI.getArgOperand(0));
2517 Register VecSrc = getOrCreateVReg(*CI.getArgOperand(1));
2518 unsigned Opc = 0;
2519 if (!CI.hasAllowReassoc()) {
2520 // The sequential ordering case.
2521 Opc = ID == Intrinsic::vector_reduce_fadd
2522 ? TargetOpcode::G_VECREDUCE_SEQ_FADD
2523 : TargetOpcode::G_VECREDUCE_SEQ_FMUL;
2524 if (!MRI->getType(VecSrc).isVector())
2525 Opc = ID == Intrinsic::vector_reduce_fadd ? TargetOpcode::G_FADD
2526 : TargetOpcode::G_FMUL;
2527 MIRBuilder.buildInstr(Opc, {Dst}, {ScalarSrc, VecSrc},
2529 return true;
2530 }
2531 // We split the operation into a separate G_FADD/G_FMUL + the reduce,
2532 // since the associativity doesn't matter.
2533 unsigned ScalarOpc;
2534 if (ID == Intrinsic::vector_reduce_fadd) {
2535 Opc = TargetOpcode::G_VECREDUCE_FADD;
2536 ScalarOpc = TargetOpcode::G_FADD;
2537 } else {
2538 Opc = TargetOpcode::G_VECREDUCE_FMUL;
2539 ScalarOpc = TargetOpcode::G_FMUL;
2540 }
2541 LLT DstTy = MRI->getType(Dst);
2542 auto Rdx = MIRBuilder.buildInstr(
2543 Opc, {DstTy}, {VecSrc}, MachineInstr::copyFlagsFromInstruction(CI));
2544 MIRBuilder.buildInstr(ScalarOpc, {Dst}, {ScalarSrc, Rdx},
2546
2547 return true;
2548 }
2549 case Intrinsic::trap:
2550 return translateTrap(CI, MIRBuilder, TargetOpcode::G_TRAP);
2551 case Intrinsic::debugtrap:
2552 return translateTrap(CI, MIRBuilder, TargetOpcode::G_DEBUGTRAP);
2553 case Intrinsic::ubsantrap:
2554 return translateTrap(CI, MIRBuilder, TargetOpcode::G_UBSANTRAP);
2555 case Intrinsic::allow_runtime_check:
2556 case Intrinsic::allow_ubsan_check:
2557 MIRBuilder.buildCopy(getOrCreateVReg(CI),
2558 getOrCreateVReg(*ConstantInt::getTrue(CI.getType())));
2559 return true;
2560 case Intrinsic::amdgcn_cs_chain:
2561 case Intrinsic::amdgcn_call_whole_wave:
2562 return translateCallBase(CI, MIRBuilder);
2563 case Intrinsic::fptrunc_round: {
2565
2566 // Convert the metadata argument to a constant integer
2567 Metadata *MD = cast<MetadataAsValue>(CI.getArgOperand(1))->getMetadata();
2568 std::optional<RoundingMode> RoundMode =
2569 convertStrToRoundingMode(cast<MDString>(MD)->getString());
2570
2571 // Add the Rounding mode as an integer
2572 MIRBuilder
2573 .buildInstr(TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND,
2574 {getOrCreateVReg(CI)},
2575 {getOrCreateVReg(*CI.getArgOperand(0))}, Flags)
2576 .addImm((int)*RoundMode);
2577
2578 return true;
2579 }
2580 case Intrinsic::is_fpclass: {
2581 Value *FpValue = CI.getOperand(0);
2582 ConstantInt *TestMaskValue = cast<ConstantInt>(CI.getOperand(1));
2583
2584 MIRBuilder
2585 .buildInstr(TargetOpcode::G_IS_FPCLASS, {getOrCreateVReg(CI)},
2586 {getOrCreateVReg(*FpValue)})
2587 .addImm(TestMaskValue->getZExtValue());
2588
2589 return true;
2590 }
2591 case Intrinsic::set_fpenv: {
2592 Value *FPEnv = CI.getOperand(0);
2593 MIRBuilder.buildSetFPEnv(getOrCreateVReg(*FPEnv));
2594 return true;
2595 }
2596 case Intrinsic::reset_fpenv:
2597 MIRBuilder.buildResetFPEnv();
2598 return true;
2599 case Intrinsic::set_fpmode: {
2600 Value *FPState = CI.getOperand(0);
2601 MIRBuilder.buildSetFPMode(getOrCreateVReg(*FPState));
2602 return true;
2603 }
2604 case Intrinsic::reset_fpmode:
2605 MIRBuilder.buildResetFPMode();
2606 return true;
2607 case Intrinsic::get_rounding:
2608 MIRBuilder.buildGetRounding(getOrCreateVReg(CI));
2609 return true;
2610 case Intrinsic::vscale: {
2611 MIRBuilder.buildVScale(getOrCreateVReg(CI), 1);
2612 return true;
2613 }
2614 case Intrinsic::scmp:
2615 MIRBuilder.buildSCmp(getOrCreateVReg(CI),
2616 getOrCreateVReg(*CI.getOperand(0)),
2617 getOrCreateVReg(*CI.getOperand(1)));
2618 return true;
2619 case Intrinsic::ucmp:
2620 MIRBuilder.buildUCmp(getOrCreateVReg(CI),
2621 getOrCreateVReg(*CI.getOperand(0)),
2622 getOrCreateVReg(*CI.getOperand(1)));
2623 return true;
2624 case Intrinsic::vector_extract:
2625 return translateExtractVector(CI, MIRBuilder);
2626 case Intrinsic::vector_insert:
2627 return translateInsertVector(CI, MIRBuilder);
2628 case Intrinsic::stepvector: {
2629 MIRBuilder.buildStepVector(getOrCreateVReg(CI), 1);
2630 return true;
2631 }
2632 case Intrinsic::prefetch: {
2633 Value *Addr = CI.getOperand(0);
2634 unsigned RW = cast<ConstantInt>(CI.getOperand(1))->getZExtValue();
2635 unsigned Locality = cast<ConstantInt>(CI.getOperand(2))->getZExtValue();
2636 unsigned CacheType = cast<ConstantInt>(CI.getOperand(3))->getZExtValue();
2637
2639 auto &MMO = *MF->getMachineMemOperand(MachinePointerInfo(Addr), Flags,
2640 LLT(), Align());
2641
2642 MIRBuilder.buildPrefetch(getOrCreateVReg(*Addr), RW, Locality, CacheType,
2643 MMO);
2644
2645 return true;
2646 }
2647
2648 case Intrinsic::vector_interleave2:
2649 case Intrinsic::vector_deinterleave2: {
2650 // Both intrinsics have at least one operand.
2651 Value *Op0 = CI.getOperand(0);
2652 LLT ResTy = getLLTForType(*Op0->getType(), MIRBuilder.getDataLayout());
2653 if (!ResTy.isFixedVector())
2654 return false;
2655
2656 if (CI.getIntrinsicID() == Intrinsic::vector_interleave2)
2657 return translateVectorInterleave2Intrinsic(CI, MIRBuilder);
2658
2659 return translateVectorDeinterleave2Intrinsic(CI, MIRBuilder);
2660 }
2661
2662#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
2663 case Intrinsic::INTRINSIC:
2664#include "llvm/IR/ConstrainedOps.def"
2665 return translateConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(CI),
2666 MIRBuilder);
2667 case Intrinsic::experimental_convergence_anchor:
2668 case Intrinsic::experimental_convergence_entry:
2669 case Intrinsic::experimental_convergence_loop:
2670 return translateConvergenceControlIntrinsic(CI, ID, MIRBuilder);
2671 }
2672 return false;
2673}
2674
2675bool IRTranslator::translateInlineAsm(const CallBase &CB,
2676 MachineIRBuilder &MIRBuilder) {
2677 if (containsBF16Type(CB))
2678 return false;
2679
2681
2682 if (!ALI) {
2683 LLVM_DEBUG(
2684 dbgs() << "Inline asm lowering is not supported for this target yet\n");
2685 return false;
2686 }
2687
2688 return ALI->lowerInlineAsm(
2689 MIRBuilder, CB, [&](const Value &Val) { return getOrCreateVRegs(Val); });
2690}
2691
2692bool IRTranslator::translateCallBase(const CallBase &CB,
2693 MachineIRBuilder &MIRBuilder) {
2694 ArrayRef<Register> Res = getOrCreateVRegs(CB);
2695
2697 Register SwiftInVReg = 0;
2698 Register SwiftErrorVReg = 0;
2699 for (const auto &Arg : CB.args()) {
2700 if (CLI->supportSwiftError() && isSwiftError(Arg)) {
2701 assert(SwiftInVReg == 0 && "Expected only one swift error argument");
2702 LLT Ty = getLLTForType(*Arg->getType(), *DL);
2703 SwiftInVReg = MRI->createGenericVirtualRegister(Ty);
2704 MIRBuilder.buildCopy(SwiftInVReg, SwiftError.getOrCreateVRegUseAt(
2705 &CB, &MIRBuilder.getMBB(), Arg));
2706 Args.emplace_back(ArrayRef(SwiftInVReg));
2707 SwiftErrorVReg =
2708 SwiftError.getOrCreateVRegDefAt(&CB, &MIRBuilder.getMBB(), Arg);
2709 continue;
2710 }
2711 Args.push_back(getOrCreateVRegs(*Arg));
2712 }
2713
2714 if (auto *CI = dyn_cast<CallInst>(&CB)) {
2715 if (ORE->enabled()) {
2716 if (MemoryOpRemark::canHandle(CI, *LibInfo)) {
2717 MemoryOpRemark R(*ORE, "gisel-irtranslator-memsize", *DL, *LibInfo);
2718 R.visit(CI);
2719 }
2720 }
2721 }
2722
2723 std::optional<CallLowering::PtrAuthInfo> PAI;
2724 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_ptrauth)) {
2725 // Functions should never be ptrauth-called directly.
2726 assert(!CB.getCalledFunction() && "invalid direct ptrauth call");
2727
2728 const Value *Key = Bundle->Inputs[0];
2729 const Value *Discriminator = Bundle->Inputs[1];
2730
2731 // Look through ptrauth constants to try to eliminate the matching bundle
2732 // and turn this into a direct call with no ptrauth.
2733 // CallLowering will use the raw pointer if it doesn't find the PAI.
2734 const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CB.getCalledOperand());
2735 if (!CalleeCPA || !isa<Function>(CalleeCPA->getPointer()) ||
2736 !CalleeCPA->isKnownCompatibleWith(Key, Discriminator, *DL)) {
2737 // If we can't make it direct, package the bundle into PAI.
2738 Register DiscReg = getOrCreateVReg(*Discriminator);
2739 PAI = CallLowering::PtrAuthInfo{cast<ConstantInt>(Key)->getZExtValue(),
2740 DiscReg};
2741 }
2742 }
2743
2744 Register ConvergenceCtrlToken = 0;
2745 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
2746 const auto &Token = *Bundle->Inputs[0].get();
2747 ConvergenceCtrlToken = getOrCreateConvergenceTokenVReg(Token);
2748 }
2749
2750 // We don't set HasCalls on MFI here yet because call lowering may decide to
2751 // optimize into tail calls. Instead, we defer that to selection where a final
2752 // scan is done to check if any instructions are calls.
2753 bool Success = CLI->lowerCall(
2754 MIRBuilder, CB, Res, Args, SwiftErrorVReg, PAI, ConvergenceCtrlToken,
2755 [&]() { return getOrCreateVReg(*CB.getCalledOperand()); });
2756
2757 // Check if we just inserted a tail call.
2758 if (Success) {
2759 assert(!HasTailCall && "Can't tail call return twice from block?");
2761 HasTailCall = TII->isTailCall(*std::prev(MIRBuilder.getInsertPt()));
2762 }
2763
2764 return Success;
2765}
2766
2767bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
2768 if (containsBF16Type(U))
2769 return false;
2770
2771 const CallInst &CI = cast<CallInst>(U);
2772 const Function *F = CI.getCalledFunction();
2773
2774 // FIXME: support Windows dllimport function calls and calls through
2775 // weak symbols.
2776 if (F && (F->hasDLLImportStorageClass() ||
2778 F->hasExternalWeakLinkage())))
2779 return false;
2780
2781 // FIXME: support control flow guard targets.
2783 return false;
2784
2785 // FIXME: support statepoints and related.
2786 if (isa<GCStatepointInst, GCRelocateInst, GCResultInst>(U))
2787 return false;
2788
2789 if (CI.isInlineAsm())
2790 return translateInlineAsm(CI, MIRBuilder);
2791
2792 Intrinsic::ID ID = F ? F->getIntrinsicID() : Intrinsic::not_intrinsic;
2793 if (!F || ID == Intrinsic::not_intrinsic) {
2794 if (translateCallBase(CI, MIRBuilder)) {
2795 diagnoseDontCall(CI);
2796 return true;
2797 }
2798 return false;
2799 }
2800
2801 assert(ID != Intrinsic::not_intrinsic && "unknown intrinsic");
2802
2803 if (translateKnownIntrinsic(CI, ID, MIRBuilder))
2804 return true;
2805
2806 ArrayRef<Register> ResultRegs;
2807 if (!CI.getType()->isVoidTy())
2808 ResultRegs = getOrCreateVRegs(CI);
2809
2810 // Ignore the callsite attributes. Backend code is most likely not expecting
2811 // an intrinsic to sometimes have side effects and sometimes not.
2812 MachineInstrBuilder MIB = MIRBuilder.buildIntrinsic(ID, ResultRegs);
2813 if (isa<FPMathOperator>(CI))
2814 MIB->copyIRFlags(CI);
2815
2816 for (const auto &Arg : enumerate(CI.args())) {
2817 // If this is required to be an immediate, don't materialize it in a
2818 // register.
2819 if (CI.paramHasAttr(Arg.index(), Attribute::ImmArg)) {
2820 if (ConstantInt *CI = dyn_cast<ConstantInt>(Arg.value())) {
2821 // imm arguments are more convenient than cimm (and realistically
2822 // probably sufficient), so use them.
2823 assert(CI->getBitWidth() <= 64 &&
2824 "large intrinsic immediates not handled");
2825 MIB.addImm(CI->getSExtValue());
2826 } else {
2827 MIB.addFPImm(cast<ConstantFP>(Arg.value()));
2828 }
2829 } else if (auto *MDVal = dyn_cast<MetadataAsValue>(Arg.value())) {
2830 auto *MD = MDVal->getMetadata();
2831 auto *MDN = dyn_cast<MDNode>(MD);
2832 if (!MDN) {
2833 if (auto *ConstMD = dyn_cast<ConstantAsMetadata>(MD))
2834 MDN = MDNode::get(MF->getFunction().getContext(), ConstMD);
2835 else // This was probably an MDString.
2836 return false;
2837 }
2838 MIB.addMetadata(MDN);
2839 } else {
2840 ArrayRef<Register> VRegs = getOrCreateVRegs(*Arg.value());
2841 if (VRegs.size() > 1)
2842 return false;
2843 MIB.addUse(VRegs[0]);
2844 }
2845 }
2846
2847 // Add a MachineMemOperand if it is a target mem intrinsic.
2849 // TODO: Add a GlobalISel version of getTgtMemIntrinsic.
2850 if (TLI->getTgtMemIntrinsic(Info, CI, *MF, ID)) {
2851 Align Alignment = Info.align.value_or(
2852 DL->getABITypeAlign(Info.memVT.getTypeForEVT(F->getContext())));
2853 LLT MemTy = Info.memVT.isSimple()
2854 ? getLLTForMVT(Info.memVT.getSimpleVT())
2855 : LLT::scalar(Info.memVT.getStoreSizeInBits());
2856
2857 // TODO: We currently just fallback to address space 0 if getTgtMemIntrinsic
2858 // didn't yield anything useful.
2860 if (Info.ptrVal)
2861 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
2862 else if (Info.fallbackAddressSpace)
2863 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
2865 MPI, Info.flags, MemTy, Alignment, CI.getAAMetadata(),
2866 /*Ranges=*/nullptr, Info.ssid, Info.order, Info.failureOrder));
2867 }
2868
2869 if (CI.isConvergent()) {
2870 if (auto Bundle = CI.getOperandBundle(LLVMContext::OB_convergencectrl)) {
2871 auto *Token = Bundle->Inputs[0].get();
2872 Register TokenReg = getOrCreateVReg(*Token);
2873 MIB.addUse(TokenReg, RegState::Implicit);
2874 }
2875 }
2876
2877 return true;
2878}
2879
2880bool IRTranslator::findUnwindDestinations(
2881 const BasicBlock *EHPadBB,
2882 BranchProbability Prob,
2883 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
2884 &UnwindDests) {
2886 EHPadBB->getParent()->getFunction().getPersonalityFn());
2887 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
2888 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
2889 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
2890 bool IsSEH = isAsynchronousEHPersonality(Personality);
2891
2892 if (IsWasmCXX) {
2893 // Ignore this for now.
2894 return false;
2895 }
2896
2897 while (EHPadBB) {
2899 BasicBlock *NewEHPadBB = nullptr;
2900 if (isa<LandingPadInst>(Pad)) {
2901 // Stop on landingpads. They are not funclets.
2902 UnwindDests.emplace_back(&getMBB(*EHPadBB), Prob);
2903 break;
2904 }
2905 if (isa<CleanupPadInst>(Pad)) {
2906 // Stop on cleanup pads. Cleanups are always funclet entries for all known
2907 // personalities.
2908 UnwindDests.emplace_back(&getMBB(*EHPadBB), Prob);
2909 UnwindDests.back().first->setIsEHScopeEntry();
2910 UnwindDests.back().first->setIsEHFuncletEntry();
2911 break;
2912 }
2913 if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
2914 // Add the catchpad handlers to the possible destinations.
2915 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
2916 UnwindDests.emplace_back(&getMBB(*CatchPadBB), Prob);
2917 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
2918 if (IsMSVCCXX || IsCoreCLR)
2919 UnwindDests.back().first->setIsEHFuncletEntry();
2920 if (!IsSEH)
2921 UnwindDests.back().first->setIsEHScopeEntry();
2922 }
2923 NewEHPadBB = CatchSwitch->getUnwindDest();
2924 } else {
2925 continue;
2926 }
2927
2928 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2929 if (BPI && NewEHPadBB)
2930 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
2931 EHPadBB = NewEHPadBB;
2932 }
2933 return true;
2934}
2935
2936bool IRTranslator::translateInvoke(const User &U,
2937 MachineIRBuilder &MIRBuilder) {
2938 const InvokeInst &I = cast<InvokeInst>(U);
2939 MCContext &Context = MF->getContext();
2940
2941 const BasicBlock *ReturnBB = I.getSuccessor(0);
2942 const BasicBlock *EHPadBB = I.getSuccessor(1);
2943
2944 const Function *Fn = I.getCalledFunction();
2945
2946 // FIXME: support invoking patchpoint and statepoint intrinsics.
2947 if (Fn && Fn->isIntrinsic())
2948 return false;
2949
2950 // FIXME: support whatever these are.
2951 if (I.hasDeoptState())
2952 return false;
2953
2954 // FIXME: support control flow guard targets.
2955 if (I.countOperandBundlesOfType(LLVMContext::OB_cfguardtarget))
2956 return false;
2957
2958 // FIXME: support Windows exception handling.
2959 if (!isa<LandingPadInst>(EHPadBB->getFirstNonPHIIt()))
2960 return false;
2961
2962 // FIXME: support Windows dllimport function calls and calls through
2963 // weak symbols.
2964 if (Fn && (Fn->hasDLLImportStorageClass() ||
2966 Fn->hasExternalWeakLinkage())))
2967 return false;
2968
2969 bool LowerInlineAsm = I.isInlineAsm();
2970 bool NeedEHLabel = true;
2971
2972 // Emit the actual call, bracketed by EH_LABELs so that the MF knows about
2973 // the region covered by the try.
2974 MCSymbol *BeginSymbol = nullptr;
2975 if (NeedEHLabel) {
2976 MIRBuilder.buildInstr(TargetOpcode::G_INVOKE_REGION_START);
2977 BeginSymbol = Context.createTempSymbol();
2978 MIRBuilder.buildInstr(TargetOpcode::EH_LABEL).addSym(BeginSymbol);
2979 }
2980
2981 if (LowerInlineAsm) {
2982 if (!translateInlineAsm(I, MIRBuilder))
2983 return false;
2984 } else if (!translateCallBase(I, MIRBuilder))
2985 return false;
2986
2987 MCSymbol *EndSymbol = nullptr;
2988 if (NeedEHLabel) {
2989 EndSymbol = Context.createTempSymbol();
2990 MIRBuilder.buildInstr(TargetOpcode::EH_LABEL).addSym(EndSymbol);
2991 }
2992
2994 BranchProbabilityInfo *BPI = FuncInfo.BPI;
2995 MachineBasicBlock *InvokeMBB = &MIRBuilder.getMBB();
2996 BranchProbability EHPadBBProb =
2997 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
2999
3000 if (!findUnwindDestinations(EHPadBB, EHPadBBProb, UnwindDests))
3001 return false;
3002
3003 MachineBasicBlock &EHPadMBB = getMBB(*EHPadBB),
3004 &ReturnMBB = getMBB(*ReturnBB);
3005 // Update successor info.
3006 addSuccessorWithProb(InvokeMBB, &ReturnMBB);
3007 for (auto &UnwindDest : UnwindDests) {
3008 UnwindDest.first->setIsEHPad();
3009 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3010 }
3011 InvokeMBB->normalizeSuccProbs();
3012
3013 if (NeedEHLabel) {
3014 assert(BeginSymbol && "Expected a begin symbol!");
3015 assert(EndSymbol && "Expected an end symbol!");
3016 MF->addInvoke(&EHPadMBB, BeginSymbol, EndSymbol);
3017 }
3018
3019 MIRBuilder.buildBr(ReturnMBB);
3020 return true;
3021}
3022
3023bool IRTranslator::translateCallBr(const User &U,
3024 MachineIRBuilder &MIRBuilder) {
3025 // FIXME: Implement this.
3026 return false;
3027}
3028
3029bool IRTranslator::translateLandingPad(const User &U,
3030 MachineIRBuilder &MIRBuilder) {
3031 const LandingPadInst &LP = cast<LandingPadInst>(U);
3032
3033 MachineBasicBlock &MBB = MIRBuilder.getMBB();
3034
3035 MBB.setIsEHPad();
3036
3037 // If there aren't registers to copy the values into (e.g., during SjLj
3038 // exceptions), then don't bother.
3039 const Constant *PersonalityFn = MF->getFunction().getPersonalityFn();
3040 if (TLI->getExceptionPointerRegister(PersonalityFn) == 0 &&
3041 TLI->getExceptionSelectorRegister(PersonalityFn) == 0)
3042 return true;
3043
3044 // If landingpad's return type is token type, we don't create DAG nodes
3045 // for its exception pointer and selector value. The extraction of exception
3046 // pointer or selector value from token type landingpads is not currently
3047 // supported.
3048 if (LP.getType()->isTokenTy())
3049 return true;
3050
3051 // Add a label to mark the beginning of the landing pad. Deletion of the
3052 // landing pad can thus be detected via the MachineModuleInfo.
3053 MIRBuilder.buildInstr(TargetOpcode::EH_LABEL)
3054 .addSym(MF->addLandingPad(&MBB));
3055
3056 // If the unwinder does not preserve all registers, ensure that the
3057 // function marks the clobbered registers as used.
3059 if (auto *RegMask = TRI.getCustomEHPadPreservedMask(*MF))
3061
3062 LLT Ty = getLLTForType(*LP.getType(), *DL);
3064 MIRBuilder.buildUndef(Undef);
3065
3067 for (Type *Ty : cast<StructType>(LP.getType())->elements())
3068 Tys.push_back(getLLTForType(*Ty, *DL));
3069 assert(Tys.size() == 2 && "Only two-valued landingpads are supported");
3070
3071 // Mark exception register as live in.
3072 Register ExceptionReg = TLI->getExceptionPointerRegister(PersonalityFn);
3073 if (!ExceptionReg)
3074 return false;
3075
3076 MBB.addLiveIn(ExceptionReg);
3077 ArrayRef<Register> ResRegs = getOrCreateVRegs(LP);
3078 MIRBuilder.buildCopy(ResRegs[0], ExceptionReg);
3079
3080 Register SelectorReg = TLI->getExceptionSelectorRegister(PersonalityFn);
3081 if (!SelectorReg)
3082 return false;
3083
3084 MBB.addLiveIn(SelectorReg);
3085 Register PtrVReg = MRI->createGenericVirtualRegister(Tys[0]);
3086 MIRBuilder.buildCopy(PtrVReg, SelectorReg);
3087 MIRBuilder.buildCast(ResRegs[1], PtrVReg);
3088
3089 return true;
3090}
3091
3092bool IRTranslator::translateAlloca(const User &U,
3093 MachineIRBuilder &MIRBuilder) {
3094 auto &AI = cast<AllocaInst>(U);
3095
3096 if (AI.isSwiftError())
3097 return true;
3098
3099 if (AI.isStaticAlloca()) {
3100 Register Res = getOrCreateVReg(AI);
3101 int FI = getOrCreateFrameIndex(AI);
3102 MIRBuilder.buildFrameIndex(Res, FI);
3103 return true;
3104 }
3105
3106 // FIXME: support stack probing for Windows.
3108 return false;
3109
3110 // Now we're in the harder dynamic case.
3111 Register NumElts = getOrCreateVReg(*AI.getArraySize());
3112 Type *IntPtrIRTy = DL->getIntPtrType(AI.getType());
3113 LLT IntPtrTy = getLLTForType(*IntPtrIRTy, *DL);
3114 if (MRI->getType(NumElts) != IntPtrTy) {
3115 Register ExtElts = MRI->createGenericVirtualRegister(IntPtrTy);
3116 MIRBuilder.buildZExtOrTrunc(ExtElts, NumElts);
3117 NumElts = ExtElts;
3118 }
3119
3120 Type *Ty = AI.getAllocatedType();
3121
3122 Register AllocSize = MRI->createGenericVirtualRegister(IntPtrTy);
3123 Register TySize =
3124 getOrCreateVReg(*ConstantInt::get(IntPtrIRTy, DL->getTypeAllocSize(Ty)));
3125 MIRBuilder.buildMul(AllocSize, NumElts, TySize);
3126
3127 // Round the size of the allocation up to the stack alignment size
3128 // by add SA-1 to the size. This doesn't overflow because we're computing
3129 // an address inside an alloca.
3130 Align StackAlign = MF->getSubtarget().getFrameLowering()->getStackAlign();
3131 auto SAMinusOne = MIRBuilder.buildConstant(IntPtrTy, StackAlign.value() - 1);
3132 auto AllocAdd = MIRBuilder.buildAdd(IntPtrTy, AllocSize, SAMinusOne,
3134 auto AlignCst =
3135 MIRBuilder.buildConstant(IntPtrTy, ~(uint64_t)(StackAlign.value() - 1));
3136 auto AlignedAlloc = MIRBuilder.buildAnd(IntPtrTy, AllocAdd, AlignCst);
3137
3138 Align Alignment = std::max(AI.getAlign(), DL->getPrefTypeAlign(Ty));
3139 if (Alignment <= StackAlign)
3140 Alignment = Align(1);
3141 MIRBuilder.buildDynStackAlloc(getOrCreateVReg(AI), AlignedAlloc, Alignment);
3142
3143 MF->getFrameInfo().CreateVariableSizedObject(Alignment, &AI);
3145 return true;
3146}
3147
3148bool IRTranslator::translateVAArg(const User &U, MachineIRBuilder &MIRBuilder) {
3149 // FIXME: We may need more info about the type. Because of how LLT works,
3150 // we're completely discarding the i64/double distinction here (amongst
3151 // others). Fortunately the ABIs I know of where that matters don't use va_arg
3152 // anyway but that's not guaranteed.
3153 MIRBuilder.buildInstr(TargetOpcode::G_VAARG, {getOrCreateVReg(U)},
3154 {getOrCreateVReg(*U.getOperand(0)),
3155 DL->getABITypeAlign(U.getType()).value()});
3156 return true;
3157}
3158
3159bool IRTranslator::translateUnreachable(const User &U,
3160 MachineIRBuilder &MIRBuilder) {
3161 auto &UI = cast<UnreachableInst>(U);
3162 if (!UI.shouldLowerToTrap(MF->getTarget().Options.TrapUnreachable,
3164 return true;
3165
3166 MIRBuilder.buildTrap();
3167 return true;
3168}
3169
3170bool IRTranslator::translateInsertElement(const User &U,
3171 MachineIRBuilder &MIRBuilder) {
3172 // If it is a <1 x Ty> vector, use the scalar as it is
3173 // not a legal vector type in LLT.
3174 if (auto *FVT = dyn_cast<FixedVectorType>(U.getType());
3175 FVT && FVT->getNumElements() == 1)
3176 return translateCopy(U, *U.getOperand(1), MIRBuilder);
3177
3178 Register Res = getOrCreateVReg(U);
3179 Register Val = getOrCreateVReg(*U.getOperand(0));
3180 Register Elt = getOrCreateVReg(*U.getOperand(1));
3181 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
3182 Register Idx;
3183 if (auto *CI = dyn_cast<ConstantInt>(U.getOperand(2))) {
3184 if (CI->getBitWidth() != PreferredVecIdxWidth) {
3185 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
3186 auto *NewIdxCI = ConstantInt::get(CI->getContext(), NewIdx);
3187 Idx = getOrCreateVReg(*NewIdxCI);
3188 }
3189 }
3190 if (!Idx)
3191 Idx = getOrCreateVReg(*U.getOperand(2));
3192 if (MRI->getType(Idx).getSizeInBits() != PreferredVecIdxWidth) {
3193 const LLT VecIdxTy = LLT::scalar(PreferredVecIdxWidth);
3194 Idx = MIRBuilder.buildZExtOrTrunc(VecIdxTy, Idx).getReg(0);
3195 }
3196 MIRBuilder.buildInsertVectorElement(Res, Val, Elt, Idx);
3197 return true;
3198}
3199
3200bool IRTranslator::translateInsertVector(const User &U,
3201 MachineIRBuilder &MIRBuilder) {
3202 Register Dst = getOrCreateVReg(U);
3203 Register Vec = getOrCreateVReg(*U.getOperand(0));
3204 Register Elt = getOrCreateVReg(*U.getOperand(1));
3205
3206 ConstantInt *CI = cast<ConstantInt>(U.getOperand(2));
3207 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
3208
3209 // Resize Index to preferred index width.
3210 if (CI->getBitWidth() != PreferredVecIdxWidth) {
3211 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
3212 CI = ConstantInt::get(CI->getContext(), NewIdx);
3213 }
3214
3215 // If it is a <1 x Ty> vector, we have to use other means.
3216 if (auto *ResultType = dyn_cast<FixedVectorType>(U.getOperand(1)->getType());
3217 ResultType && ResultType->getNumElements() == 1) {
3218 if (auto *InputType = dyn_cast<FixedVectorType>(U.getOperand(0)->getType());
3219 InputType && InputType->getNumElements() == 1) {
3220 // We are inserting an illegal fixed vector into an illegal
3221 // fixed vector, use the scalar as it is not a legal vector type
3222 // in LLT.
3223 return translateCopy(U, *U.getOperand(0), MIRBuilder);
3224 }
3225 if (isa<FixedVectorType>(U.getOperand(0)->getType())) {
3226 // We are inserting an illegal fixed vector into a legal fixed
3227 // vector, use the scalar as it is not a legal vector type in
3228 // LLT.
3229 Register Idx = getOrCreateVReg(*CI);
3230 MIRBuilder.buildInsertVectorElement(Dst, Vec, Elt, Idx);
3231 return true;
3232 }
3233 if (isa<ScalableVectorType>(U.getOperand(0)->getType())) {
3234 // We are inserting an illegal fixed vector into a scalable
3235 // vector, use a scalar element insert.
3236 LLT VecIdxTy = LLT::scalar(PreferredVecIdxWidth);
3237 Register Idx = getOrCreateVReg(*CI);
3238 auto ScaledIndex = MIRBuilder.buildMul(
3239 VecIdxTy, MIRBuilder.buildVScale(VecIdxTy, 1), Idx);
3240 MIRBuilder.buildInsertVectorElement(Dst, Vec, Elt, ScaledIndex);
3241 return true;
3242 }
3243 }
3244
3245 MIRBuilder.buildInsertSubvector(
3246 getOrCreateVReg(U), getOrCreateVReg(*U.getOperand(0)),
3247 getOrCreateVReg(*U.getOperand(1)), CI->getZExtValue());
3248 return true;
3249}
3250
3251bool IRTranslator::translateExtractElement(const User &U,
3252 MachineIRBuilder &MIRBuilder) {
3253 // If it is a <1 x Ty> vector, use the scalar as it is
3254 // not a legal vector type in LLT.
3255 if (const FixedVectorType *FVT =
3256 dyn_cast<FixedVectorType>(U.getOperand(0)->getType()))
3257 if (FVT->getNumElements() == 1)
3258 return translateCopy(U, *U.getOperand(0), MIRBuilder);
3259
3260 Register Res = getOrCreateVReg(U);
3261 Register Val = getOrCreateVReg(*U.getOperand(0));
3262 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
3263 Register Idx;
3264 if (auto *CI = dyn_cast<ConstantInt>(U.getOperand(1))) {
3265 if (CI->getBitWidth() != PreferredVecIdxWidth) {
3266 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
3267 auto *NewIdxCI = ConstantInt::get(CI->getContext(), NewIdx);
3268 Idx = getOrCreateVReg(*NewIdxCI);
3269 }
3270 }
3271 if (!Idx)
3272 Idx = getOrCreateVReg(*U.getOperand(1));
3273 if (MRI->getType(Idx).getSizeInBits() != PreferredVecIdxWidth) {
3274 const LLT VecIdxTy = LLT::scalar(PreferredVecIdxWidth);
3275 Idx = MIRBuilder.buildZExtOrTrunc(VecIdxTy, Idx).getReg(0);
3276 }
3277 MIRBuilder.buildExtractVectorElement(Res, Val, Idx);
3278 return true;
3279}
3280
3281bool IRTranslator::translateExtractVector(const User &U,
3282 MachineIRBuilder &MIRBuilder) {
3283 Register Res = getOrCreateVReg(U);
3284 Register Vec = getOrCreateVReg(*U.getOperand(0));
3285 ConstantInt *CI = cast<ConstantInt>(U.getOperand(1));
3286 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
3287
3288 // Resize Index to preferred index width.
3289 if (CI->getBitWidth() != PreferredVecIdxWidth) {
3290 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
3291 CI = ConstantInt::get(CI->getContext(), NewIdx);
3292 }
3293
3294 // If it is a <1 x Ty> vector, we have to use other means.
3295 if (auto *ResultType = dyn_cast<FixedVectorType>(U.getType());
3296 ResultType && ResultType->getNumElements() == 1) {
3297 if (auto *InputType = dyn_cast<FixedVectorType>(U.getOperand(0)->getType());
3298 InputType && InputType->getNumElements() == 1) {
3299 // We are extracting an illegal fixed vector from an illegal fixed vector,
3300 // use the scalar as it is not a legal vector type in LLT.
3301 return translateCopy(U, *U.getOperand(0), MIRBuilder);
3302 }
3303 if (isa<FixedVectorType>(U.getOperand(0)->getType())) {
3304 // We are extracting an illegal fixed vector from a legal fixed
3305 // vector, use the scalar as it is not a legal vector type in
3306 // LLT.
3307 Register Idx = getOrCreateVReg(*CI);
3308 MIRBuilder.buildExtractVectorElement(Res, Vec, Idx);
3309 return true;
3310 }
3311 if (isa<ScalableVectorType>(U.getOperand(0)->getType())) {
3312 // We are extracting an illegal fixed vector from a scalable
3313 // vector, use a scalar element extract.
3314 LLT VecIdxTy = LLT::scalar(PreferredVecIdxWidth);
3315 Register Idx = getOrCreateVReg(*CI);
3316 auto ScaledIndex = MIRBuilder.buildMul(
3317 VecIdxTy, MIRBuilder.buildVScale(VecIdxTy, 1), Idx);
3318 MIRBuilder.buildExtractVectorElement(Res, Vec, ScaledIndex);
3319 return true;
3320 }
3321 }
3322
3323 MIRBuilder.buildExtractSubvector(getOrCreateVReg(U),
3324 getOrCreateVReg(*U.getOperand(0)),
3325 CI->getZExtValue());
3326 return true;
3327}
3328
3329bool IRTranslator::translateShuffleVector(const User &U,
3330 MachineIRBuilder &MIRBuilder) {
3331 // A ShuffleVector that operates on scalable vectors is a splat vector where
3332 // the value of the splat vector is the 0th element of the first operand,
3333 // since the index mask operand is the zeroinitializer (undef and
3334 // poison are treated as zeroinitializer here).
3335 if (U.getOperand(0)->getType()->isScalableTy()) {
3336 Register Val = getOrCreateVReg(*U.getOperand(0));
3337 auto SplatVal = MIRBuilder.buildExtractVectorElementConstant(
3338 MRI->getType(Val).getElementType(), Val, 0);
3339 MIRBuilder.buildSplatVector(getOrCreateVReg(U), SplatVal);
3340 return true;
3341 }
3342
3344 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&U))
3345 Mask = SVI->getShuffleMask();
3346 else
3347 Mask = cast<ConstantExpr>(U).getShuffleMask();
3348 ArrayRef<int> MaskAlloc = MF->allocateShuffleMask(Mask);
3349 MIRBuilder
3350 .buildInstr(TargetOpcode::G_SHUFFLE_VECTOR, {getOrCreateVReg(U)},
3351 {getOrCreateVReg(*U.getOperand(0)),
3352 getOrCreateVReg(*U.getOperand(1))})
3353 .addShuffleMask(MaskAlloc);
3354 return true;
3355}
3356
3357bool IRTranslator::translatePHI(const User &U, MachineIRBuilder &MIRBuilder) {
3358 const PHINode &PI = cast<PHINode>(U);
3359
3361 for (auto Reg : getOrCreateVRegs(PI)) {
3362 auto MIB = MIRBuilder.buildInstr(TargetOpcode::G_PHI, {Reg}, {});
3363 Insts.push_back(MIB.getInstr());
3364 }
3365
3366 PendingPHIs.emplace_back(&PI, std::move(Insts));
3367 return true;
3368}
3369
3370bool IRTranslator::translateAtomicCmpXchg(const User &U,
3371 MachineIRBuilder &MIRBuilder) {
3372 const AtomicCmpXchgInst &I = cast<AtomicCmpXchgInst>(U);
3373
3374 auto Flags = TLI->getAtomicMemOperandFlags(I, *DL);
3375
3376 auto Res = getOrCreateVRegs(I);
3377 Register OldValRes = Res[0];
3378 Register SuccessRes = Res[1];
3379 Register Addr = getOrCreateVReg(*I.getPointerOperand());
3380 Register Cmp = getOrCreateVReg(*I.getCompareOperand());
3381 Register NewVal = getOrCreateVReg(*I.getNewValOperand());
3382
3384 OldValRes, SuccessRes, Addr, Cmp, NewVal,
3386 MachinePointerInfo(I.getPointerOperand()), Flags, MRI->getType(Cmp),
3387 getMemOpAlign(I), I.getAAMetadata(), nullptr, I.getSyncScopeID(),
3388 I.getSuccessOrdering(), I.getFailureOrdering()));
3389 return true;
3390}
3391
3392bool IRTranslator::translateAtomicRMW(const User &U,
3393 MachineIRBuilder &MIRBuilder) {
3394 if (containsBF16Type(U))
3395 return false;
3396
3397 const AtomicRMWInst &I = cast<AtomicRMWInst>(U);
3398 auto Flags = TLI->getAtomicMemOperandFlags(I, *DL);
3399
3400 Register Res = getOrCreateVReg(I);
3401 Register Addr = getOrCreateVReg(*I.getPointerOperand());
3402 Register Val = getOrCreateVReg(*I.getValOperand());
3403
3404 unsigned Opcode = 0;
3405 switch (I.getOperation()) {
3406 default:
3407 return false;
3409 Opcode = TargetOpcode::G_ATOMICRMW_XCHG;
3410 break;
3411 case AtomicRMWInst::Add:
3412 Opcode = TargetOpcode::G_ATOMICRMW_ADD;
3413 break;
3414 case AtomicRMWInst::Sub:
3415 Opcode = TargetOpcode::G_ATOMICRMW_SUB;
3416 break;
3417 case AtomicRMWInst::And:
3418 Opcode = TargetOpcode::G_ATOMICRMW_AND;
3419 break;
3421 Opcode = TargetOpcode::G_ATOMICRMW_NAND;
3422 break;
3423 case AtomicRMWInst::Or:
3424 Opcode = TargetOpcode::G_ATOMICRMW_OR;
3425 break;
3426 case AtomicRMWInst::Xor:
3427 Opcode = TargetOpcode::G_ATOMICRMW_XOR;
3428 break;
3429 case AtomicRMWInst::Max:
3430 Opcode = TargetOpcode::G_ATOMICRMW_MAX;
3431 break;
3432 case AtomicRMWInst::Min:
3433 Opcode = TargetOpcode::G_ATOMICRMW_MIN;
3434 break;
3436 Opcode = TargetOpcode::G_ATOMICRMW_UMAX;
3437 break;
3439 Opcode = TargetOpcode::G_ATOMICRMW_UMIN;
3440 break;
3442 Opcode = TargetOpcode::G_ATOMICRMW_FADD;
3443 break;
3445 Opcode = TargetOpcode::G_ATOMICRMW_FSUB;
3446 break;
3448 Opcode = TargetOpcode::G_ATOMICRMW_FMAX;
3449 break;
3451 Opcode = TargetOpcode::G_ATOMICRMW_FMIN;
3452 break;
3454 Opcode = TargetOpcode::G_ATOMICRMW_FMAXIMUM;
3455 break;
3457 Opcode = TargetOpcode::G_ATOMICRMW_FMINIMUM;
3458 break;
3460 Opcode = TargetOpcode::G_ATOMICRMW_UINC_WRAP;
3461 break;
3463 Opcode = TargetOpcode::G_ATOMICRMW_UDEC_WRAP;
3464 break;
3466 Opcode = TargetOpcode::G_ATOMICRMW_USUB_COND;
3467 break;
3469 Opcode = TargetOpcode::G_ATOMICRMW_USUB_SAT;
3470 break;
3471 }
3472
3473 MIRBuilder.buildAtomicRMW(
3474 Opcode, Res, Addr, Val,
3475 *MF->getMachineMemOperand(MachinePointerInfo(I.getPointerOperand()),
3476 Flags, MRI->getType(Val), getMemOpAlign(I),
3477 I.getAAMetadata(), nullptr, I.getSyncScopeID(),
3478 I.getOrdering()));
3479 return true;
3480}
3481
3482bool IRTranslator::translateFence(const User &U,
3483 MachineIRBuilder &MIRBuilder) {
3484 const FenceInst &Fence = cast<FenceInst>(U);
3485 MIRBuilder.buildFence(static_cast<unsigned>(Fence.getOrdering()),
3486 Fence.getSyncScopeID());
3487 return true;
3488}
3489
3490bool IRTranslator::translateFreeze(const User &U,
3491 MachineIRBuilder &MIRBuilder) {
3492 const ArrayRef<Register> DstRegs = getOrCreateVRegs(U);
3493 const ArrayRef<Register> SrcRegs = getOrCreateVRegs(*U.getOperand(0));
3494
3495 assert(DstRegs.size() == SrcRegs.size() &&
3496 "Freeze with different source and destination type?");
3497
3498 for (unsigned I = 0; I < DstRegs.size(); ++I) {
3499 MIRBuilder.buildFreeze(DstRegs[I], SrcRegs[I]);
3500 }
3501
3502 return true;
3503}
3504
3505void IRTranslator::finishPendingPhis() {
3506#ifndef NDEBUG
3507 DILocationVerifier Verifier;
3508 GISelObserverWrapper WrapperObserver(&Verifier);
3509 RAIIMFObsDelInstaller ObsInstall(*MF, WrapperObserver);
3510#endif // ifndef NDEBUG
3511 for (auto &Phi : PendingPHIs) {
3512 const PHINode *PI = Phi.first;
3513 if (PI->getType()->isEmptyTy())
3514 continue;
3515 ArrayRef<MachineInstr *> ComponentPHIs = Phi.second;
3516 MachineBasicBlock *PhiMBB = ComponentPHIs[0]->getParent();
3517 EntryBuilder->setDebugLoc(PI->getDebugLoc());
3518#ifndef NDEBUG
3519 Verifier.setCurrentInst(PI);
3520#endif // ifndef NDEBUG
3521
3523 for (unsigned i = 0; i < PI->getNumIncomingValues(); ++i) {
3524 auto IRPred = PI->getIncomingBlock(i);
3525 ArrayRef<Register> ValRegs = getOrCreateVRegs(*PI->getIncomingValue(i));
3526 for (auto *Pred : getMachinePredBBs({IRPred, PI->getParent()})) {
3527 if (SeenPreds.count(Pred) || !PhiMBB->isPredecessor(Pred))
3528 continue;
3529 SeenPreds.insert(Pred);
3530 for (unsigned j = 0; j < ValRegs.size(); ++j) {
3531 MachineInstrBuilder MIB(*MF, ComponentPHIs[j]);
3532 MIB.addUse(ValRegs[j]);
3533 MIB.addMBB(Pred);
3534 }
3535 }
3536 }
3537 }
3538}
3539
3540void IRTranslator::translateDbgValueRecord(Value *V, bool HasArgList,
3541 const DILocalVariable *Variable,
3542 const DIExpression *Expression,
3543 const DebugLoc &DL,
3544 MachineIRBuilder &MIRBuilder) {
3545 assert(Variable->isValidLocationForIntrinsic(DL) &&
3546 "Expected inlined-at fields to agree");
3547 // Act as if we're handling a debug intrinsic.
3548 MIRBuilder.setDebugLoc(DL);
3549
3550 if (!V || HasArgList) {
3551 // DI cannot produce a valid DBG_VALUE, so produce an undef DBG_VALUE to
3552 // terminate any prior location.
3553 MIRBuilder.buildIndirectDbgValue(0, Variable, Expression);
3554 return;
3555 }
3556
3557 if (const auto *CI = dyn_cast<Constant>(V)) {
3558 MIRBuilder.buildConstDbgValue(*CI, Variable, Expression);
3559 return;
3560 }
3561
3562 if (auto *AI = dyn_cast<AllocaInst>(V);
3563 AI && AI->isStaticAlloca() && Expression->startsWithDeref()) {
3564 // If the value is an alloca and the expression starts with a
3565 // dereference, track a stack slot instead of a register, as registers
3566 // may be clobbered.
3567 auto ExprOperands = Expression->getElements();
3568 auto *ExprDerefRemoved =
3569 DIExpression::get(AI->getContext(), ExprOperands.drop_front());
3570 MIRBuilder.buildFIDbgValue(getOrCreateFrameIndex(*AI), Variable,
3571 ExprDerefRemoved);
3572 return;
3573 }
3574 if (translateIfEntryValueArgument(false, V, Variable, Expression, DL,
3575 MIRBuilder))
3576 return;
3577 for (Register Reg : getOrCreateVRegs(*V)) {
3578 // FIXME: This does not handle register-indirect values at offset 0. The
3579 // direct/indirect thing shouldn't really be handled by something as
3580 // implicit as reg+noreg vs reg+imm in the first place, but it seems
3581 // pretty baked in right now.
3582 MIRBuilder.buildDirectDbgValue(Reg, Variable, Expression);
3583 }
3584}
3585
3586void IRTranslator::translateDbgDeclareRecord(Value *Address, bool HasArgList,
3587 const DILocalVariable *Variable,
3588 const DIExpression *Expression,
3589 const DebugLoc &DL,
3590 MachineIRBuilder &MIRBuilder) {
3591 if (!Address || isa<UndefValue>(Address)) {
3592 LLVM_DEBUG(dbgs() << "Dropping debug info for " << *Variable << "\n");
3593 return;
3594 }
3595
3596 assert(Variable->isValidLocationForIntrinsic(DL) &&
3597 "Expected inlined-at fields to agree");
3598 auto AI = dyn_cast<AllocaInst>(Address);
3599 if (AI && AI->isStaticAlloca()) {
3600 // Static allocas are tracked at the MF level, no need for DBG_VALUE
3601 // instructions (in fact, they get ignored if they *do* exist).
3602 MF->setVariableDbgInfo(Variable, Expression,
3603 getOrCreateFrameIndex(*AI), DL);
3604 return;
3605 }
3606
3607 if (translateIfEntryValueArgument(true, Address, Variable,
3608 Expression, DL,
3609 MIRBuilder))
3610 return;
3611
3612 // A dbg.declare describes the address of a source variable, so lower it
3613 // into an indirect DBG_VALUE.
3614 MIRBuilder.setDebugLoc(DL);
3615 MIRBuilder.buildIndirectDbgValue(getOrCreateVReg(*Address), Variable,
3616 Expression);
3617}
3618
3619void IRTranslator::translateDbgInfo(const Instruction &Inst,
3620 MachineIRBuilder &MIRBuilder) {
3621 for (DbgRecord &DR : Inst.getDbgRecordRange()) {
3622 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
3623 MIRBuilder.setDebugLoc(DLR->getDebugLoc());
3624 assert(DLR->getLabel() && "Missing label");
3625 assert(DLR->getLabel()->isValidLocationForIntrinsic(
3626 MIRBuilder.getDebugLoc()) &&
3627 "Expected inlined-at fields to agree");
3628 MIRBuilder.buildDbgLabel(DLR->getLabel());
3629 continue;
3630 }
3631 DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR);
3632 const DILocalVariable *Variable = DVR.getVariable();
3633 const DIExpression *Expression = DVR.getExpression();
3634 Value *V = DVR.getVariableLocationOp(0);
3635 if (DVR.isDbgDeclare())
3636 translateDbgDeclareRecord(V, DVR.hasArgList(), Variable, Expression,
3637 DVR.getDebugLoc(), MIRBuilder);
3638 else
3639 translateDbgValueRecord(V, DVR.hasArgList(), Variable, Expression,
3640 DVR.getDebugLoc(), MIRBuilder);
3641 }
3642}
3643
3644bool IRTranslator::translate(const Instruction &Inst) {
3645 CurBuilder->setDebugLoc(Inst.getDebugLoc());
3646 CurBuilder->setPCSections(Inst.getMetadata(LLVMContext::MD_pcsections));
3647 CurBuilder->setMMRAMetadata(Inst.getMetadata(LLVMContext::MD_mmra));
3648
3649 if (TLI->fallBackToDAGISel(Inst))
3650 return false;
3651
3652 switch (Inst.getOpcode()) {
3653#define HANDLE_INST(NUM, OPCODE, CLASS) \
3654 case Instruction::OPCODE: \
3655 return translate##OPCODE(Inst, *CurBuilder.get());
3656#include "llvm/IR/Instruction.def"
3657 default:
3658 return false;
3659 }
3660}
3661
3662bool IRTranslator::translate(const Constant &C, Register Reg) {
3663 // We only emit constants into the entry block from here. To prevent jumpy
3664 // debug behaviour remove debug line.
3665 if (auto CurrInstDL = CurBuilder->getDL())
3666 EntryBuilder->setDebugLoc(DebugLoc());
3667
3668 if (auto CI = dyn_cast<ConstantInt>(&C)) {
3669 // buildConstant expects a to-be-splatted scalar ConstantInt.
3670 if (isa<VectorType>(CI->getType()))
3671 CI = ConstantInt::get(CI->getContext(), CI->getValue());
3672 EntryBuilder->buildConstant(Reg, *CI);
3673 } else if (auto CF = dyn_cast<ConstantFP>(&C)) {
3674 // buildFConstant expects a to-be-splatted scalar ConstantFP.
3675 if (isa<VectorType>(CF->getType()))
3676 CF = ConstantFP::get(CF->getContext(), CF->getValue());
3677 EntryBuilder->buildFConstant(Reg, *CF);
3678 } else if (isa<UndefValue>(C))
3679 EntryBuilder->buildUndef(Reg);
3680 else if (isa<ConstantPointerNull>(C))
3681 EntryBuilder->buildConstant(Reg, 0);
3682 else if (auto GV = dyn_cast<GlobalValue>(&C))
3683 EntryBuilder->buildGlobalValue(Reg, GV);
3684 else if (auto CPA = dyn_cast<ConstantPtrAuth>(&C)) {
3685 Register Addr = getOrCreateVReg(*CPA->getPointer());
3686 Register AddrDisc = getOrCreateVReg(*CPA->getAddrDiscriminator());
3687 EntryBuilder->buildConstantPtrAuth(Reg, CPA, Addr, AddrDisc);
3688 } else if (auto CAZ = dyn_cast<ConstantAggregateZero>(&C)) {
3689 Constant &Elt = *CAZ->getElementValue(0u);
3690 if (isa<ScalableVectorType>(CAZ->getType())) {
3691 EntryBuilder->buildSplatVector(Reg, getOrCreateVReg(Elt));
3692 return true;
3693 }
3694 // Return the scalar if it is a <1 x Ty> vector.
3695 unsigned NumElts = CAZ->getElementCount().getFixedValue();
3696 if (NumElts == 1)
3697 return translateCopy(C, Elt, *EntryBuilder);
3698 // All elements are zero so we can just use the first one.
3699 EntryBuilder->buildSplatBuildVector(Reg, getOrCreateVReg(Elt));
3700 } else if (auto CV = dyn_cast<ConstantDataVector>(&C)) {
3701 // Return the scalar if it is a <1 x Ty> vector.
3702 if (CV->getNumElements() == 1)
3703 return translateCopy(C, *CV->getElementAsConstant(0), *EntryBuilder);
3705 for (unsigned i = 0; i < CV->getNumElements(); ++i) {
3706 Constant &Elt = *CV->getElementAsConstant(i);
3707 Ops.push_back(getOrCreateVReg(Elt));
3708 }
3709 EntryBuilder->buildBuildVector(Reg, Ops);
3710 } else if (auto CE = dyn_cast<ConstantExpr>(&C)) {
3711 switch(CE->getOpcode()) {
3712#define HANDLE_INST(NUM, OPCODE, CLASS) \
3713 case Instruction::OPCODE: \
3714 return translate##OPCODE(*CE, *EntryBuilder.get());
3715#include "llvm/IR/Instruction.def"
3716 default:
3717 return false;
3718 }
3719 } else if (auto CV = dyn_cast<ConstantVector>(&C)) {
3720 if (CV->getNumOperands() == 1)
3721 return translateCopy(C, *CV->getOperand(0), *EntryBuilder);
3723 for (unsigned i = 0; i < CV->getNumOperands(); ++i) {
3724 Ops.push_back(getOrCreateVReg(*CV->getOperand(i)));
3725 }
3726 EntryBuilder->buildBuildVector(Reg, Ops);
3727 } else if (auto *BA = dyn_cast<BlockAddress>(&C)) {
3728 EntryBuilder->buildBlockAddress(Reg, BA);
3729 } else
3730 return false;
3731
3732 return true;
3733}
3734
3735bool IRTranslator::finalizeBasicBlock(const BasicBlock &BB,
3737 for (auto &BTB : SL->BitTestCases) {
3738 // Emit header first, if it wasn't already emitted.
3739 if (!BTB.Emitted)
3740 emitBitTestHeader(BTB, BTB.Parent);
3741
3742 BranchProbability UnhandledProb = BTB.Prob;
3743 for (unsigned j = 0, ej = BTB.Cases.size(); j != ej; ++j) {
3744 UnhandledProb -= BTB.Cases[j].ExtraProb;
3745 // Set the current basic block to the mbb we wish to insert the code into
3746 MachineBasicBlock *MBB = BTB.Cases[j].ThisBB;
3747 // If all cases cover a contiguous range, it is not necessary to jump to
3748 // the default block after the last bit test fails. This is because the
3749 // range check during bit test header creation has guaranteed that every
3750 // case here doesn't go outside the range. In this case, there is no need
3751 // to perform the last bit test, as it will always be true. Instead, make
3752 // the second-to-last bit-test fall through to the target of the last bit
3753 // test, and delete the last bit test.
3754
3755 MachineBasicBlock *NextMBB;
3756 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
3757 // Second-to-last bit-test with contiguous range: fall through to the
3758 // target of the final bit test.
3759 NextMBB = BTB.Cases[j + 1].TargetBB;
3760 } else if (j + 1 == ej) {
3761 // For the last bit test, fall through to Default.
3762 NextMBB = BTB.Default;
3763 } else {
3764 // Otherwise, fall through to the next bit test.
3765 NextMBB = BTB.Cases[j + 1].ThisBB;
3766 }
3767
3768 emitBitTestCase(BTB, NextMBB, UnhandledProb, BTB.Reg, BTB.Cases[j], MBB);
3769
3770 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
3771 // We need to record the replacement phi edge here that normally
3772 // happens in emitBitTestCase before we delete the case, otherwise the
3773 // phi edge will be lost.
3774 addMachineCFGPred({BTB.Parent->getBasicBlock(),
3775 BTB.Cases[ej - 1].TargetBB->getBasicBlock()},
3776 MBB);
3777 // Since we're not going to use the final bit test, remove it.
3778 BTB.Cases.pop_back();
3779 break;
3780 }
3781 }
3782 // This is "default" BB. We have two jumps to it. From "header" BB and from
3783 // last "case" BB, unless the latter was skipped.
3784 CFGEdge HeaderToDefaultEdge = {BTB.Parent->getBasicBlock(),
3785 BTB.Default->getBasicBlock()};
3786 addMachineCFGPred(HeaderToDefaultEdge, BTB.Parent);
3787 if (!BTB.ContiguousRange) {
3788 addMachineCFGPred(HeaderToDefaultEdge, BTB.Cases.back().ThisBB);
3789 }
3790 }
3791 SL->BitTestCases.clear();
3792
3793 for (auto &JTCase : SL->JTCases) {
3794 // Emit header first, if it wasn't already emitted.
3795 if (!JTCase.first.Emitted)
3796 emitJumpTableHeader(JTCase.second, JTCase.first, JTCase.first.HeaderBB);
3797
3798 emitJumpTable(JTCase.second, JTCase.second.MBB);
3799 }
3800 SL->JTCases.clear();
3801
3802 for (auto &SwCase : SL->SwitchCases)
3803 emitSwitchCase(SwCase, &CurBuilder->getMBB(), *CurBuilder);
3804 SL->SwitchCases.clear();
3805
3806 // Check if we need to generate stack-protector guard checks.
3807 StackProtector &SP = getAnalysis<StackProtector>();
3808 if (SP.shouldEmitSDCheck(BB)) {
3809 bool FunctionBasedInstrumentation =
3811 SPDescriptor.initialize(&BB, &MBB, FunctionBasedInstrumentation);
3812 }
3813 // Handle stack protector.
3814 if (SPDescriptor.shouldEmitFunctionBasedCheckStackProtector()) {
3815 LLVM_DEBUG(dbgs() << "Unimplemented stack protector case\n");
3816 return false;
3817 } else if (SPDescriptor.shouldEmitStackProtector()) {
3818 MachineBasicBlock *ParentMBB = SPDescriptor.getParentMBB();
3819 MachineBasicBlock *SuccessMBB = SPDescriptor.getSuccessMBB();
3820
3821 // Find the split point to split the parent mbb. At the same time copy all
3822 // physical registers used in the tail of parent mbb into virtual registers
3823 // before the split point and back into physical registers after the split
3824 // point. This prevents us needing to deal with Live-ins and many other
3825 // register allocation issues caused by us splitting the parent mbb. The
3826 // register allocator will clean up said virtual copies later on.
3828 ParentMBB, *MF->getSubtarget().getInstrInfo());
3829
3830 // Splice the terminator of ParentMBB into SuccessMBB.
3831 SuccessMBB->splice(SuccessMBB->end(), ParentMBB, SplitPoint,
3832 ParentMBB->end());
3833
3834 // Add compare/jump on neq/jump to the parent BB.
3835 if (!emitSPDescriptorParent(SPDescriptor, ParentMBB))
3836 return false;
3837
3838 // CodeGen Failure MBB if we have not codegened it yet.
3839 MachineBasicBlock *FailureMBB = SPDescriptor.getFailureMBB();
3840 if (FailureMBB->empty()) {
3841 if (!emitSPDescriptorFailure(SPDescriptor, FailureMBB))
3842 return false;
3843 }
3844
3845 // Clear the Per-BB State.
3846 SPDescriptor.resetPerBBState();
3847 }
3848 return true;
3849}
3850
3851bool IRTranslator::emitSPDescriptorParent(StackProtectorDescriptor &SPD,
3852 MachineBasicBlock *ParentBB) {
3853 CurBuilder->setInsertPt(*ParentBB, ParentBB->end());
3854 // First create the loads to the guard/stack slot for the comparison.
3856 const LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
3857 LLT PtrMemTy = getLLTForMVT(TLI->getPointerMemTy(*DL));
3858
3859 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
3860 int FI = MFI.getStackProtectorIndex();
3861
3862 Register Guard;
3863 Register StackSlotPtr = CurBuilder->buildFrameIndex(PtrTy, FI).getReg(0);
3864 const Module &M = *ParentBB->getParent()->getFunction().getParent();
3865 Align Align = DL->getPrefTypeAlign(PointerType::getUnqual(M.getContext()));
3866
3867 // Generate code to load the content of the guard slot.
3868 Register GuardVal =
3869 CurBuilder
3870 ->buildLoad(PtrMemTy, StackSlotPtr,
3873 .getReg(0);
3874
3875 if (TLI->useStackGuardXorFP()) {
3876 LLVM_DEBUG(dbgs() << "Stack protector xor'ing with FP not yet implemented");
3877 return false;
3878 }
3879
3880 // Retrieve guard check function, nullptr if instrumentation is inlined.
3881 if (const Function *GuardCheckFn = TLI->getSSPStackGuardCheck(M)) {
3882 // This path is currently untestable on GlobalISel, since the only platform
3883 // that needs this seems to be Windows, and we fall back on that currently.
3884 // The code still lives here in case that changes.
3885 // Silence warning about unused variable until the code below that uses
3886 // 'GuardCheckFn' is enabled.
3887 (void)GuardCheckFn;
3888 return false;
3889#if 0
3890 // The target provides a guard check function to validate the guard value.
3891 // Generate a call to that function with the content of the guard slot as
3892 // argument.
3893 FunctionType *FnTy = GuardCheckFn->getFunctionType();
3894 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
3896 if (GuardCheckFn->hasAttribute(1, Attribute::AttrKind::InReg))
3897 Flags.setInReg();
3898 CallLowering::ArgInfo GuardArgInfo(
3899 {GuardVal, FnTy->getParamType(0), {Flags}});
3900
3902 Info.OrigArgs.push_back(GuardArgInfo);
3903 Info.CallConv = GuardCheckFn->getCallingConv();
3904 Info.Callee = MachineOperand::CreateGA(GuardCheckFn, 0);
3905 Info.OrigRet = {Register(), FnTy->getReturnType()};
3906 if (!CLI->lowerCall(MIRBuilder, Info)) {
3907 LLVM_DEBUG(dbgs() << "Failed to lower call to stack protector check\n");
3908 return false;
3909 }
3910 return true;
3911#endif
3912 }
3913
3914 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
3915 // Otherwise, emit a volatile load to retrieve the stack guard value.
3916 if (TLI->useLoadStackGuardNode(*ParentBB->getBasicBlock()->getModule())) {
3917 Guard =
3919 getStackGuard(Guard, *CurBuilder);
3920 } else {
3921 // TODO: test using android subtarget when we support @llvm.thread.pointer.
3922 const Value *IRGuard = TLI->getSDagStackGuard(M);
3923 Register GuardPtr = getOrCreateVReg(*IRGuard);
3924
3925 Guard = CurBuilder
3926 ->buildLoad(PtrMemTy, GuardPtr,
3930 .getReg(0);
3931 }
3932
3933 // Perform the comparison.
3934 auto Cmp =
3935 CurBuilder->buildICmp(CmpInst::ICMP_NE, LLT::scalar(1), Guard, GuardVal);
3936 // If the guard/stackslot do not equal, branch to failure MBB.
3937 CurBuilder->buildBrCond(Cmp, *SPD.getFailureMBB());
3938 // Otherwise branch to success MBB.
3939 CurBuilder->buildBr(*SPD.getSuccessMBB());
3940 return true;
3941}
3942
3943bool IRTranslator::emitSPDescriptorFailure(StackProtectorDescriptor &SPD,
3944 MachineBasicBlock *FailureBB) {
3945 CurBuilder->setInsertPt(*FailureBB, FailureBB->end());
3946
3947 const RTLIB::Libcall Libcall = RTLIB::STACKPROTECTOR_CHECK_FAIL;
3948 const char *Name = TLI->getLibcallName(Libcall);
3949
3951 Info.CallConv = TLI->getLibcallCallingConv(Libcall);
3953 Info.OrigRet = {Register(), Type::getVoidTy(MF->getFunction().getContext()),
3954 0};
3955 if (!CLI->lowerCall(*CurBuilder, Info)) {
3956 LLVM_DEBUG(dbgs() << "Failed to lower call to stack protector fail\n");
3957 return false;
3958 }
3959
3960 // Emit a trap instruction if we are required to do so.
3961 const TargetOptions &TargetOpts = TLI->getTargetMachine().Options;
3962 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
3963 CurBuilder->buildInstr(TargetOpcode::G_TRAP);
3964
3965 return true;
3966}
3967
3968void IRTranslator::finalizeFunction() {
3969 // Release the memory used by the different maps we
3970 // needed during the translation.
3971 PendingPHIs.clear();
3972 VMap.reset();
3973 FrameIndices.clear();
3974 MachinePreds.clear();
3975 // MachineIRBuilder::DebugLoc can outlive the DILocation it holds. Clear it
3976 // to avoid accessing free’d memory (in runOnMachineFunction) and to avoid
3977 // destroying it twice (in ~IRTranslator() and ~LLVMContext())
3978 EntryBuilder.reset();
3979 CurBuilder.reset();
3980 FuncInfo.clear();
3981 SPDescriptor.resetPerFunctionState();
3982}
3983
3984/// Returns true if a BasicBlock \p BB within a variadic function contains a
3985/// variadic musttail call.
3986static bool checkForMustTailInVarArgFn(bool IsVarArg, const BasicBlock &BB) {
3987 if (!IsVarArg)
3988 return false;
3989
3990 // Walk the block backwards, because tail calls usually only appear at the end
3991 // of a block.
3992 return llvm::any_of(llvm::reverse(BB), [](const Instruction &I) {
3993 const auto *CI = dyn_cast<CallInst>(&I);
3994 return CI && CI->isMustTailCall();
3995 });
3996}
3997
3999 MF = &CurMF;
4000 const Function &F = MF->getFunction();
4002 getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
4003 // Set the CSEConfig and run the analysis.
4004 GISelCSEInfo *CSEInfo = nullptr;
4005 TPC = &getAnalysis<TargetPassConfig>();
4008 : TPC->isGISelCSEEnabled();
4009 TLI = MF->getSubtarget().getTargetLowering();
4010
4011 if (EnableCSE) {
4012 EntryBuilder = std::make_unique<CSEMIRBuilder>(CurMF);
4013 CSEInfo = &Wrapper.get(TPC->getCSEConfig());
4014 EntryBuilder->setCSEInfo(CSEInfo);
4015 CurBuilder = std::make_unique<CSEMIRBuilder>(CurMF);
4016 CurBuilder->setCSEInfo(CSEInfo);
4017 } else {
4018 EntryBuilder = std::make_unique<MachineIRBuilder>();
4019 CurBuilder = std::make_unique<MachineIRBuilder>();
4020 }
4021 CLI = MF->getSubtarget().getCallLowering();
4022 CurBuilder->setMF(*MF);
4023 EntryBuilder->setMF(*MF);
4024 MRI = &MF->getRegInfo();
4025 DL = &F.getDataLayout();
4026 ORE = std::make_unique<OptimizationRemarkEmitter>(&F);
4027 const TargetMachine &TM = MF->getTarget();
4028 TM.resetTargetOptions(F);
4029 EnableOpts = OptLevel != CodeGenOptLevel::None && !skipFunction(F);
4030 FuncInfo.MF = MF;
4031 if (EnableOpts) {
4032 AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
4033 FuncInfo.BPI = &getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI();
4034 } else {
4035 AA = nullptr;
4036 FuncInfo.BPI = nullptr;
4037 }
4038
4039 AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
4040 MF->getFunction());
4041 LibInfo = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
4042 FuncInfo.CanLowerReturn = CLI->checkReturnTypeForCallConv(*MF);
4043
4044 SL = std::make_unique<GISelSwitchLowering>(this, FuncInfo);
4045 SL->init(*TLI, TM, *DL);
4046
4047 assert(PendingPHIs.empty() && "stale PHIs");
4048
4049 // Targets which want to use big endian can enable it using
4050 // enableBigEndian()
4051 if (!DL->isLittleEndian() && !CLI->enableBigEndian()) {
4052 // Currently we don't properly handle big endian code.
4053 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
4054 F.getSubprogram(), &F.getEntryBlock());
4055 R << "unable to translate in big endian mode";
4056 reportTranslationError(*MF, *TPC, *ORE, R);
4057 return false;
4058 }
4059
4060 // Release the per-function state when we return, whether we succeeded or not.
4061 auto FinalizeOnReturn = make_scope_exit([this]() { finalizeFunction(); });
4062
4063 // Setup a separate basic-block for the arguments and constants
4065 MF->push_back(EntryBB);
4066 EntryBuilder->setMBB(*EntryBB);
4067
4068 DebugLoc DbgLoc = F.getEntryBlock().getFirstNonPHIIt()->getDebugLoc();
4069 SwiftError.setFunction(CurMF);
4070 SwiftError.createEntriesInEntryBlock(DbgLoc);
4071
4072 bool IsVarArg = F.isVarArg();
4073 bool HasMustTailInVarArgFn = false;
4074
4075 // Create all blocks, in IR order, to preserve the layout.
4076 FuncInfo.MBBMap.resize(F.getMaxBlockNumber());
4077 for (const BasicBlock &BB: F) {
4078 auto *&MBB = FuncInfo.MBBMap[BB.getNumber()];
4079
4080 MBB = MF->CreateMachineBasicBlock(&BB);
4081 MF->push_back(MBB);
4082
4083 if (BB.hasAddressTaken())
4084 MBB->setAddressTakenIRBlock(const_cast<BasicBlock *>(&BB));
4085
4086 if (!HasMustTailInVarArgFn)
4087 HasMustTailInVarArgFn = checkForMustTailInVarArgFn(IsVarArg, BB);
4088 }
4089
4090 MF->getFrameInfo().setHasMustTailInVarArgFunc(HasMustTailInVarArgFn);
4091
4092 // Make our arguments/constants entry block fallthrough to the IR entry block.
4093 EntryBB->addSuccessor(&getMBB(F.front()));
4094
4095 if (CLI->fallBackToDAGISel(*MF)) {
4096 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
4097 F.getSubprogram(), &F.getEntryBlock());
4098 R << "unable to lower function: "
4099 << ore::NV("Prototype", F.getFunctionType());
4100 reportTranslationError(*MF, *TPC, *ORE, R);
4101 return false;
4102 }
4103
4104 // Lower the actual args into this basic block.
4105 SmallVector<ArrayRef<Register>, 8> VRegArgs;
4106 for (const Argument &Arg: F.args()) {
4107 if (DL->getTypeStoreSize(Arg.getType()).isZero())
4108 continue; // Don't handle zero sized types.
4109 ArrayRef<Register> VRegs = getOrCreateVRegs(Arg);
4110 VRegArgs.push_back(VRegs);
4111
4112 if (Arg.hasSwiftErrorAttr()) {
4113 assert(VRegs.size() == 1 && "Too many vregs for Swift error");
4114 SwiftError.setCurrentVReg(EntryBB, SwiftError.getFunctionArg(), VRegs[0]);
4115 }
4116 }
4117
4118 if (!CLI->lowerFormalArguments(*EntryBuilder, F, VRegArgs, FuncInfo)) {
4119 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
4120 F.getSubprogram(), &F.getEntryBlock());
4121 R << "unable to lower arguments: "
4122 << ore::NV("Prototype", F.getFunctionType());
4123 reportTranslationError(*MF, *TPC, *ORE, R);
4124 return false;
4125 }
4126
4127 // Need to visit defs before uses when translating instructions.
4128 GISelObserverWrapper WrapperObserver;
4129 if (EnableCSE && CSEInfo)
4130 WrapperObserver.addObserver(CSEInfo);
4131 {
4133#ifndef NDEBUG
4134 DILocationVerifier Verifier;
4135 WrapperObserver.addObserver(&Verifier);
4136#endif // ifndef NDEBUG
4137 RAIIMFObsDelInstaller ObsInstall(*MF, WrapperObserver);
4138 for (const BasicBlock *BB : RPOT) {
4139 MachineBasicBlock &MBB = getMBB(*BB);
4140 // Set the insertion point of all the following translations to
4141 // the end of this basic block.
4142 CurBuilder->setMBB(MBB);
4143 HasTailCall = false;
4144 for (const Instruction &Inst : *BB) {
4145 // If we translated a tail call in the last step, then we know
4146 // everything after the call is either a return, or something that is
4147 // handled by the call itself. (E.g. a lifetime marker or assume
4148 // intrinsic.) In this case, we should stop translating the block and
4149 // move on.
4150 if (HasTailCall)
4151 break;
4152#ifndef NDEBUG
4153 Verifier.setCurrentInst(&Inst);
4154#endif // ifndef NDEBUG
4155
4156 // Translate any debug-info attached to the instruction.
4157 translateDbgInfo(Inst, *CurBuilder);
4158
4159 if (translate(Inst))
4160 continue;
4161
4162 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
4163 Inst.getDebugLoc(), BB);
4164 R << "unable to translate instruction: " << ore::NV("Opcode", &Inst);
4165
4166 if (ORE->allowExtraAnalysis("gisel-irtranslator")) {
4167 std::string InstStrStorage;
4168 raw_string_ostream InstStr(InstStrStorage);
4169 InstStr << Inst;
4170
4171 R << ": '" << InstStrStorage << "'";
4172 }
4173
4174 reportTranslationError(*MF, *TPC, *ORE, R);
4175 return false;
4176 }
4177
4178 if (!finalizeBasicBlock(*BB, MBB)) {
4179 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
4180 BB->getTerminator()->getDebugLoc(), BB);
4181 R << "unable to translate basic block";
4182 reportTranslationError(*MF, *TPC, *ORE, R);
4183 return false;
4184 }
4185 }
4186#ifndef NDEBUG
4187 WrapperObserver.removeObserver(&Verifier);
4188#endif
4189 }
4190
4191 finishPendingPhis();
4192
4193 SwiftError.propagateVRegs();
4194
4195 // Merge the argument lowering and constants block with its single
4196 // successor, the LLVM-IR entry block. We want the basic block to
4197 // be maximal.
4198 assert(EntryBB->succ_size() == 1 &&
4199 "Custom BB used for lowering should have only one successor");
4200 // Get the successor of the current entry block.
4201 MachineBasicBlock &NewEntryBB = **EntryBB->succ_begin();
4202 assert(NewEntryBB.pred_size() == 1 &&
4203 "LLVM-IR entry block has a predecessor!?");
4204 // Move all the instruction from the current entry block to the
4205 // new entry block.
4206 NewEntryBB.splice(NewEntryBB.begin(), EntryBB, EntryBB->begin(),
4207 EntryBB->end());
4208
4209 // Update the live-in information for the new entry block.
4210 for (const MachineBasicBlock::RegisterMaskPair &LiveIn : EntryBB->liveins())
4211 NewEntryBB.addLiveIn(LiveIn);
4212 NewEntryBB.sortUniqueLiveIns();
4213
4214 // Get rid of the now empty basic block.
4215 EntryBB->removeSuccessor(&NewEntryBB);
4216 MF->remove(EntryBB);
4217 MF->deleteMachineBasicBlock(EntryBB);
4218
4219 assert(&MF->front() == &NewEntryBB &&
4220 "New entry wasn't next in the list of basic block!");
4221
4222 // Initialize stack protector information.
4223 StackProtector &SP = getAnalysis<StackProtector>();
4224 SP.copyToMachineFrameInfo(MF->getFrameInfo());
4225
4226 return false;
4227}
unsigned SubReg
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
amdgpu aa AMDGPU Address space based Alias Analysis Wrapper
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
Provides analysis for continuously CSEing during GISel passes.
This file implements a version of MachineIRBuilder which CSEs insts within a MachineBasicBlock.
This file describes how to lower LLVM calls to machine code calls.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
uint64_t Addr
std::string Name
uint64_t Size
This contains common code to allow clients to notify changes to machine instr.
const HexagonInstrInfo * TII
IRTranslator LLVM IR static false void reportTranslationError(MachineFunction &MF, const TargetPassConfig &TPC, OptimizationRemarkEmitter &ORE, OptimizationRemarkMissed &R)
static bool checkForMustTailInVarArgFn(bool IsVarArg, const BasicBlock &BB)
Returns true if a BasicBlock BB within a variadic function contains a variadic musttail call.
static bool containsBF16Type(const User &U)
static unsigned getConvOpcode(Intrinsic::ID ID)
static uint64_t getOffsetFromIndices(const User &U, const DataLayout &DL)
static unsigned getConstrainedOpcode(Intrinsic::ID ID)
IRTranslator LLVM IR MI
#define DEBUG_TYPE
static cl::opt< bool > EnableCSEInIRTranslator("enable-cse-in-irtranslator", cl::desc("Should enable CSE in irtranslator"), cl::Optional, cl::init(false))
static bool isValInBlock(const Value *V, const BasicBlock *BB)
static bool isSwiftError(const Value *V)
This file declares the IRTranslator pass.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This file describes how to lower LLVM inline asm to machine code INLINEASM.
Legalize the Machine IR a function s Machine IR
Definition: Legalizer.cpp:80
Implement a low-level type suitable for MachineInstr level instruction selection.
Implement a low-level type suitable for MachineInstr level instruction selection.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
This file declares the MachineIRBuilder class.
Register const TargetRegisterInfo * TRI
This file contains the declarations for metadata subclasses.
uint64_t High
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:39
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
std::pair< BasicBlock *, BasicBlock * > Edge
This file contains some templates that are useful if you are working with the STL at all.
verify safepoint Safepoint IR Verifier
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition: Debug.h:119
This file describes how to lower LLVM code to machine code.
Target-Independent Code Generator Pass Configuration Options pass.
Value * RHS
Value * LHS
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
bool pointsToConstantMemory(const MemoryLocation &Loc, bool OrLocal=false)
Checks whether the given location points to constant memory, or if OrLocal is true whether it points ...
Class for arbitrary precision integers.
Definition: APInt.h:78
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition: APInt.cpp:1033
an instruction to allocate memory on the stack
Definition: Instructions.h:64
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
Definition: Instructions.h:153
LLVM_ABI bool isStaticAlloca() const
Return true if this alloca is in the entry block of the function and is a constant size.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Definition: Instructions.h:128
PointerType * getType() const
Overload to return most specific pointer type.
Definition: Instructions.h:101
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
Definition: Instructions.h:121
const Value * getArraySize() const
Get the number of elements allocated.
Definition: Instructions.h:97
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
This class represents an incoming formal argument to a Function.
Definition: Argument.h:32
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:136
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:147
iterator begin() const
Definition: ArrayRef.h:135
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:142
An immutable pass that tracks lazily created AssumptionCache objects.
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:506
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:709
@ Add
*p = old + v
Definition: Instructions.h:725
@ FAdd
*p = old + v
Definition: Instructions.h:746
@ USubCond
Subtract only if no unsigned overflow.
Definition: Instructions.h:777
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
Definition: Instructions.h:765
@ Min
*p = old <signed v ? old : v
Definition: Instructions.h:739
@ Or
*p = old | v
Definition: Instructions.h:733
@ Sub
*p = old - v
Definition: Instructions.h:727
@ And
*p = old & v
Definition: Instructions.h:729
@ Xor
*p = old ^ v
Definition: Instructions.h:735
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
Definition: Instructions.h:781
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
Definition: Instructions.h:761
@ FSub
*p = old - v
Definition: Instructions.h:749
@ UIncWrap
Increment one up to a maximum value.
Definition: Instructions.h:769
@ Max
*p = old >signed v ? old : v
Definition: Instructions.h:737
@ UMin
*p = old <unsigned v ? old : v
Definition: Instructions.h:743
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
Definition: Instructions.h:757
@ UMax
*p = old >unsigned v ? old : v
Definition: Instructions.h:741
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
Definition: Instructions.h:753
@ UDecWrap
Decrement one until a minimum value or zero.
Definition: Instructions.h:773
@ Nand
*p = ~(old & v)
Definition: Instructions.h:731
Attribute getFnAttr(Attribute::AttrKind Kind) const
Return the attribute object that exists for the function.
Definition: Attributes.h:905
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:400
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
unsigned getNumber() const
Definition: BasicBlock.h:95
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition: BasicBlock.h:690
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
Definition: BasicBlock.cpp:337
InstListType::const_iterator const_iterator
Definition: BasicBlock.h:171
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
Definition: BasicBlock.cpp:354
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:213
const Instruction & back() const
Definition: BasicBlock.h:484
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
Definition: BasicBlock.cpp:248
Legacy analysis pass which computes BlockFrequencyInfo.
Conditional or Unconditional Branch instruction.
BasicBlock * getSuccessor(unsigned i) const
bool isUnconditional() const
Value * getCondition() const
Legacy analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
bool isInlineAsm() const
Check if this call is an inline asm statement.
Definition: InstrTypes.h:1415
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
Definition: InstrTypes.h:2083
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Definition: InstrTypes.h:1348
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Definition: InstrTypes.h:1267
unsigned countOperandBundlesOfType(StringRef Name) const
Return the number of operand bundles with the tag Name attached to this instruction.
Definition: InstrTypes.h:2059
Value * getCalledOperand() const
Definition: InstrTypes.h:1340
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1292
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
Definition: InstrTypes.h:1273
bool isConvergent() const
Determine if the invoke is convergent.
Definition: InstrTypes.h:1967
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
Definition: InstrTypes.h:1283
unsigned arg_size() const
Definition: InstrTypes.h:1290
AttributeList getAttributes() const
Return the attributes for this call.
Definition: InstrTypes.h:1424
This class represents a function call, abstracting a target machine's calling convention.
bool isTailCall() const
bool checkReturnTypeForCallConv(MachineFunction &MF) const
Toplevel function to check the return type based on the target calling convention.
virtual bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, ArrayRef< ArrayRef< Register > > VRegs, FunctionLoweringInfo &FLI) const
This hook must be implemented to lower the incoming (formal) arguments, described by VRegs,...
Definition: CallLowering.h:553
virtual bool enableBigEndian() const
For targets which want to use big-endian can enable it with enableBigEndian() hook.
Definition: CallLowering.h:602
virtual bool supportSwiftError() const
Definition: CallLowering.h:456
virtual bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, ArrayRef< Register > VRegs, FunctionLoweringInfo &FLI, Register SwiftErrorVReg) const
This hook must be implemented to lower outgoing return values, described by Val, into the specified v...
Definition: CallLowering.h:521
virtual bool lowerCall(MachineIRBuilder &MIRBuilder, CallLoweringInfo &Info) const
This hook must be implemented to lower the given call instruction, including argument and return valu...
Definition: CallLowering.h:565
virtual bool fallBackToDAGISel(const MachineFunction &MF) const
Definition: CallLowering.h:539
This class is the base class for the comparison instructions.
Definition: InstrTypes.h:666
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:678
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:695
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:707
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:708
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:701
@ ICMP_EQ
equal
Definition: InstrTypes.h:699
@ ICMP_NE
not equal
Definition: InstrTypes.h:700
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:704
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:680
bool isFPPredicate() const
Definition: InstrTypes.h:784
bool isIntPredicate() const
Definition: InstrTypes.h:785
This is the shared class of boolean and integer constants.
Definition: Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:868
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition: Constants.h:214
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:157
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition: Constants.h:163
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:154
This is an important base class in LLVM.
Definition: Constant.h:43
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
Definition: Constants.cpp:420
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:373
This is the common base class for constrained floating point intrinsics.
LLVM_ABI std::optional< fp::ExceptionBehavior > getExceptionBehavior() const
LLVM_ABI unsigned getNonMetadataArgCount() const
DWARF expression.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
static LLVM_ABI DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this label.
bool isValidLocationForIntrinsic(const DILocation *DL) const
Check that a location is valid for this variable.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
Definition: DataLayout.h:390
LLVM_ABI const StructLayout * getStructLayout(StructType *Ty) const
Returns a StructLayout object, indicating the alignment of the struct, its size, and the offsets of i...
Definition: DataLayout.cpp:708
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
Definition: DataLayout.cpp:877
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
Definition: DataLayout.h:504
TypeSize getTypeSizeInBits(Type *Ty) const
Size examples:
Definition: DataLayout.h:674
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition: DataLayout.h:468
LLVM_ABI Align getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
Definition: DataLayout.cpp:730
This represents the llvm.dbg.declare instruction.
Value * getAddress() const
This represents the llvm.dbg.label instruction.
DILabel * getLabel() const
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
This represents the llvm.dbg.value instruction.
Value * getValue(unsigned OpIdx=0) const
DILocalVariable * getVariable() const
DIExpression * getExpression() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
DIExpression * getExpression() const
LLVM_ABI Value * getVariableLocationOp(unsigned OpIdx) const
DILocalVariable * getVariable() const
A debug info location.
Definition: DebugLoc.h:124
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
An instruction for ordering other memory operations.
Definition: Instructions.h:429
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this fence instruction.
Definition: Instructions.h:465
AtomicOrdering getOrdering() const
Returns the ordering constraint of this fence instruction.
Definition: Instructions.h:454
Class to represent fixed width SIMD vectors.
Definition: DerivedTypes.h:592
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition: Type.cpp:803
BranchProbabilityInfo * BPI
void clear()
clear - Clear out all the function-specific state.
MachineBasicBlock * getMBB(const BasicBlock *BB) const
SmallVector< MachineBasicBlock * > MBBMap
A mapping from LLVM basic block number to their machine block.
bool CanLowerReturn
CanLowerReturn - true iff the function's return value can be lowered to registers.
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
Definition: Pass.cpp:188
const BasicBlock & getEntryBlock() const
Definition: Function.h:807
DISubprogram * getSubprogram() const
Get the attached subprogram.
Definition: Metadata.cpp:1915
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition: Function.h:703
Constant * getPersonalityFn() const
Get the personality function associated with this function.
Definition: Function.cpp:1036
const Function & getFunction() const
Definition: Function.h:164
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition: Function.h:249
bool hasOptNone() const
Do not optimize this function (-O0).
Definition: Function.h:700
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:359
The actual analysis pass wrapper.
Definition: CSEInfo.h:229
Simple wrapper that does the following.
Definition: CSEInfo.h:211
The CSE Analysis object.
Definition: CSEInfo.h:71
Abstract class that contains various methods for clients to notify about changes.
Simple wrapper observer that takes several observers, and calls each one for each event.
void removeObserver(GISelChangeObserver *O)
void addObserver(GISelChangeObserver *O)
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Definition: GlobalValue.h:569
bool hasExternalWeakLinkage() const
Definition: GlobalValue.h:531
bool hasDLLImportStorageClass() const
Definition: GlobalValue.h:280
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:663
bool isTailCall(const MachineInstr &MI) const override
This instruction compares its operands according to the predicate given to the constructor.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
IRTranslator(CodeGenOptLevel OptLevel=CodeGenOptLevel::None)
static char ID
Definition: IRTranslator.h:68
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Indirect Branch Instruction.
bool lowerInlineAsm(MachineIRBuilder &MIRBuilder, const CallBase &CB, std::function< ArrayRef< Register >(const Value &Val)> GetOrCreateVRegs) const
Lower the given inline asm call instruction GetOrCreateVRegs is a callback to materialize a register ...
This instruction inserts a struct field of array element value into an aggregate value.
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange() const
Return a range over the DbgRecords attached to this instruction.
Definition: Instruction.h:105
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Definition: Instruction.h:513
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
Definition: Instruction.cpp:78
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
Definition: Instruction.h:406
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
Definition: Instruction.h:428
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
Definition: Metadata.cpp:1789
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Definition: Instruction.h:312
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Definition: IntrinsicInst.h:56
Invoke instruction.
constexpr LLT changeElementType(LLT NewEltTy) const
If this type is a vector, return a vector with the same number of elements but the new element type.
Definition: LowLevelType.h:212
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
Definition: LowLevelType.h:43
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
Definition: LowLevelType.h:160
constexpr bool isVector() const
Definition: LowLevelType.h:149
static constexpr LLT pointer(unsigned AddressSpace, unsigned SizeInBits)
Get a low-level pointer in the given address space.
Definition: LowLevelType.h:58
constexpr TypeSize getSizeInBits() const
Returns the total size of the type. Must only be called on sized types.
Definition: LowLevelType.h:191
constexpr bool isPointer() const
Definition: LowLevelType.h:150
constexpr LLT getElementType() const
Returns the vector's element type. Only valid for vector types.
Definition: LowLevelType.h:278
static constexpr LLT fixed_vector(unsigned NumElements, unsigned ScalarSizeInBits)
Get a low-level fixed-width vector of some number of elements and element width.
Definition: LowLevelType.h:101
constexpr bool isFixedVector() const
Returns true if the LLT is a fixed vector.
Definition: LowLevelType.h:178
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
Definition: Instructions.h:180
Value * getPointerOperand()
Definition: Instructions.h:259
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
Definition: Instructions.h:224
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this load instruction.
Definition: Instructions.h:234
static LocationSize precise(uint64_t Value)
Context object for machine code objects.
Definition: MCContext.h:83
LLVM_ABI MCSymbol * getOrCreateFrameAllocSymbol(const Twine &FuncName, unsigned Idx)
Gets a symbol that will be defined to the final stack offset of a local variable after codegen.
Definition: MCContext.cpp:247
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
Metadata node.
Definition: Metadata.h:1077
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1565
unsigned pred_size() const
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
void setAddressTakenIRBlock(BasicBlock *BB)
Set this block to reflect that it corresponds to an IR-level basic block with a BlockAddress.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
LLVM_ABI void sortUniqueLiveIns()
Sorts and uniques the LiveIns vector.
LLVM_ABI bool isPredecessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a predecessor of this block.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
void setIsEHPad(bool V=true)
Indicates the block is a landing pad.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
LLVM_ABI int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot, const AllocaInst *Alloca=nullptr, uint8_t ID=0)
Create a new statically sized stack object, returning a nonnegative identifier to represent it.
int getStackProtectorIndex() const
Return the index for the stack protector object.
void setStackProtectorIndex(int I)
LLVM_ABI int CreateVariableSizedObject(Align Alignment, const AllocaInst *Alloca)
Notify the MachineFrameInfo object that a variable sized object has been created.
void setHasMustTailInVarArgFunc(bool B)
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
ArrayRef< int > allocateShuffleMask(ArrayRef< int > Mask)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align 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.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
unsigned getTypeIDFor(const GlobalValue *TI)
Return the type id for the specified typeinfo. This is function wide.
void push_back(MachineBasicBlock *MBB)
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
MCSymbol * addLandingPad(MachineBasicBlock *LandingPad)
Add a new panding pad, and extract the exception handling information from the landingpad instruction...
void deleteMachineBasicBlock(MachineBasicBlock *MBB)
DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
Function & getFunction()
Return the LLVM function that this machine code represents.
void remove(iterator MBBI)
void setVariableDbgInfo(const DILocalVariable *Var, const DIExpression *Expr, int Slot, const DILocation *Loc)
Collect information used to emit debugging information of a variable in a stack slot.
const MachineBasicBlock & front() const
void addInvoke(MachineBasicBlock *LandingPad, MCSymbol *BeginLabel, MCSymbol *EndLabel)
Provide the begin and end labels of an invoke style call and associate it with a try landing pad bloc...
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
void erase(iterator MBBI)
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Helper class to build MachineInstr.
MachineInstrBuilder buildFPTOUI_SAT(const DstOp &Dst, const SrcOp &Src0)
Build and insert Res = G_FPTOUI_SAT Src0.
MachineInstrBuilder buildFMul(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, std::optional< unsigned > Flags=std::nullopt)
MachineInstrBuilder buildFreeze(const DstOp &Dst, const SrcOp &Src)
Build and insert Dst = G_FREEZE Src.
MachineInstrBuilder buildBr(MachineBasicBlock &Dest)
Build and insert G_BR Dest.
MachineInstrBuilder buildAdd(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_ADD Op0, Op1.
MachineInstrBuilder buildUndef(const DstOp &Res)
Build and insert Res = IMPLICIT_DEF.
MachineInstrBuilder buildResetFPMode()
Build and insert G_RESET_FPMODE.
MachineInstrBuilder buildFPExt(const DstOp &Res, const SrcOp &Op, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_FPEXT Op.
MachineInstrBuilder buildFPTOSI_SAT(const DstOp &Dst, const SrcOp &Src0)
Build and insert Res = G_FPTOSI_SAT Src0.
MachineInstrBuilder buildUCmp(const DstOp &Res, const SrcOp &Op0, const SrcOp &Op1)
Build and insert a Res = G_UCMP Op0, Op1.
MachineInstrBuilder buildJumpTable(const LLT PtrTy, unsigned JTI)
Build and insert Res = G_JUMP_TABLE JTI.
MachineInstrBuilder buildGetRounding(const DstOp &Dst)
Build and insert Dst = G_GET_ROUNDING.
MachineInstrBuilder buildSCmp(const DstOp &Res, const SrcOp &Op0, const SrcOp &Op1)
Build and insert a Res = G_SCMP Op0, Op1.
MachineInstrBuilder buildFence(unsigned Ordering, unsigned Scope)
Build and insert G_FENCE Ordering, Scope.
MachineInstrBuilder buildSelect(const DstOp &Res, const SrcOp &Tst, const SrcOp &Op0, const SrcOp &Op1, std::optional< unsigned > Flags=std::nullopt)
Build and insert a Res = G_SELECT Tst, Op0, Op1.
MachineInstrBuilder buildFMA(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, const SrcOp &Src2, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_FMA Op0, Op1, Op2.
MachineInstrBuilder buildMul(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_MUL Op0, Op1.
MachineInstrBuilder buildInsertSubvector(const DstOp &Res, const SrcOp &Src0, const SrcOp &Src1, unsigned Index)
Build and insert Res = G_INSERT_SUBVECTOR Src0, Src1, Idx.
MachineInstrBuilder buildAnd(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1)
Build and insert Res = G_AND Op0, Op1.
MachineInstrBuilder buildCast(const DstOp &Dst, const SrcOp &Src)
Build and insert an appropriate cast between two registers of equal size.
MachineInstrBuilder buildICmp(CmpInst::Predicate Pred, const DstOp &Res, const SrcOp &Op0, const SrcOp &Op1, std::optional< unsigned > Flags=std::nullopt)
Build and insert a Res = G_ICMP Pred, Op0, Op1.
MachineBasicBlock::iterator getInsertPt()
Current insertion point for new instructions.
MachineInstrBuilder buildSExtOrTrunc(const DstOp &Res, const SrcOp &Op)
Build and insert Res = G_SEXT Op, Res = G_TRUNC Op, or Res = COPY Op depending on the differing sizes...
MachineInstrBuilder buildAtomicRMW(unsigned Opcode, const DstOp &OldValRes, const SrcOp &Addr, const SrcOp &Val, MachineMemOperand &MMO)
Build and insert OldValRes<def> = G_ATOMICRMW_<Opcode> Addr, Val, MMO.
MachineInstrBuilder buildSub(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_SUB Op0, Op1.
MachineInstrBuilder buildIntrinsic(Intrinsic::ID ID, ArrayRef< Register > Res, bool HasSideEffects, bool isConvergent)
Build and insert a G_INTRINSIC instruction.
MachineInstrBuilder buildVScale(const DstOp &Res, unsigned MinElts)
Build and insert Res = G_VSCALE MinElts.
MachineInstrBuilder buildSplatBuildVector(const DstOp &Res, const SrcOp &Src)
Build and insert Res = G_BUILD_VECTOR with Src replicated to fill the number of elements.
MachineInstrBuilder buildSetFPMode(const SrcOp &Src)
Build and insert G_SET_FPMODE Src.
MachineInstrBuilder buildIndirectDbgValue(Register Reg, const MDNode *Variable, const MDNode *Expr)
Build and insert a DBG_VALUE instruction expressing the fact that the associated Variable lives in me...
MachineInstrBuilder buildConstDbgValue(const Constant &C, const MDNode *Variable, const MDNode *Expr)
Build and insert a DBG_VALUE instructions specifying that Variable is given by C (suitably modified b...
MachineInstrBuilder buildBrCond(const SrcOp &Tst, MachineBasicBlock &Dest)
Build and insert G_BRCOND Tst, Dest.
std::optional< MachineInstrBuilder > materializeObjectPtrOffset(Register &Res, Register Op0, const LLT ValueTy, uint64_t Value)
Materialize and insert an instruction with appropriate flags for addressing some offset of an object,...
MachineInstrBuilder buildExtractVectorElement(const DstOp &Res, const SrcOp &Val, const SrcOp &Idx)
Build and insert Res = G_EXTRACT_VECTOR_ELT Val, Idx.
MachineInstrBuilder buildLoad(const DstOp &Res, const SrcOp &Addr, MachineMemOperand &MMO)
Build and insert Res = G_LOAD Addr, MMO.
MachineInstrBuilder buildPtrAdd(const DstOp &Res, const SrcOp &Op0, const SrcOp &Op1, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_PTR_ADD Op0, Op1.
MachineInstrBuilder buildZExtOrTrunc(const DstOp &Res, const SrcOp &Op)
Build and insert Res = G_ZEXT Op, Res = G_TRUNC Op, or Res = COPY Op depending on the differing sizes...
MachineInstrBuilder buildExtractVectorElementConstant(const DstOp &Res, const SrcOp &Val, const int Idx)
Build and insert Res = G_EXTRACT_VECTOR_ELT Val, Idx.
MachineInstrBuilder buildShl(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, std::optional< unsigned > Flags=std::nullopt)
MachineInstrBuilder buildStore(const SrcOp &Val, const SrcOp &Addr, MachineMemOperand &MMO)
Build and insert G_STORE Val, Addr, MMO.
MachineInstrBuilder buildInstr(unsigned Opcode)
Build and insert <empty> = Opcode <empty>.
MachineInstrBuilder buildFrameIndex(const DstOp &Res, int Idx)
Build and insert Res = G_FRAME_INDEX Idx.
MachineInstrBuilder buildDirectDbgValue(Register Reg, const MDNode *Variable, const MDNode *Expr)
Build and insert a DBG_VALUE instruction expressing the fact that the associated Variable lives in Re...
MachineInstrBuilder buildDbgLabel(const MDNode *Label)
Build and insert a DBG_LABEL instructions specifying that Label is given.
MachineInstrBuilder buildBrJT(Register TablePtr, unsigned JTI, Register IndexReg)
Build and insert G_BRJT TablePtr, JTI, IndexReg.
MachineInstrBuilder buildDynStackAlloc(const DstOp &Res, const SrcOp &Size, Align Alignment)
Build and insert Res = G_DYN_STACKALLOC Size, Align.
MachineInstrBuilder buildFIDbgValue(int FI, const MDNode *Variable, const MDNode *Expr)
Build and insert a DBG_VALUE instruction expressing the fact that the associated Variable lives in th...
MachineInstrBuilder buildResetFPEnv()
Build and insert G_RESET_FPENV.
void setDebugLoc(const DebugLoc &DL)
Set the debug location to DL for all the next build instructions.
const MachineBasicBlock & getMBB() const
Getter for the basic block we currently build.
MachineInstrBuilder buildInsertVectorElement(const DstOp &Res, const SrcOp &Val, const SrcOp &Elt, const SrcOp &Idx)
Build and insert Res = G_INSERT_VECTOR_ELT Val, Elt, Idx.
MachineInstrBuilder buildAtomicCmpXchgWithSuccess(const DstOp &OldValRes, const DstOp &SuccessRes, const SrcOp &Addr, const SrcOp &CmpVal, const SrcOp &NewVal, MachineMemOperand &MMO)
Build and insert OldValRes<def>, SuccessRes<def> = G_ATOMIC_CMPXCHG_WITH_SUCCESS Addr,...
void setMBB(MachineBasicBlock &MBB)
Set the insertion point to the end of MBB.
const DebugLoc & getDebugLoc()
Get the current instruction's debug location.
MachineInstrBuilder buildTrap(bool Debug=false)
Build and insert G_TRAP or G_DEBUGTRAP.
MachineInstrBuilder buildFFrexp(const DstOp &Fract, const DstOp &Exp, const SrcOp &Src, std::optional< unsigned > Flags=std::nullopt)
Build and insert Fract, Exp = G_FFREXP Src.
MachineInstrBuilder buildFPTrunc(const DstOp &Res, const SrcOp &Op, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_FPTRUNC Op.
MachineInstrBuilder buildFSincos(const DstOp &Sin, const DstOp &Cos, const SrcOp &Src, std::optional< unsigned > Flags=std::nullopt)
Build and insert Sin, Cos = G_FSINCOS Src.
MachineInstrBuilder buildShuffleVector(const DstOp &Res, const SrcOp &Src1, const SrcOp &Src2, ArrayRef< int > Mask)
Build and insert Res = G_SHUFFLE_VECTOR Src1, Src2, Mask.
MachineInstrBuilder buildInstrNoInsert(unsigned Opcode)
Build but don't insert <empty> = Opcode <empty>.
MachineInstrBuilder buildCopy(const DstOp &Res, const SrcOp &Op)
Build and insert Res = COPY Op.
MachineInstrBuilder buildPrefetch(const SrcOp &Addr, unsigned RW, unsigned Locality, unsigned CacheType, MachineMemOperand &MMO)
Build and insert G_PREFETCH Addr, RW, Locality, CacheType.
MachineInstrBuilder buildExtractSubvector(const DstOp &Res, const SrcOp &Src, unsigned Index)
Build and insert Res = G_EXTRACT_SUBVECTOR Src, Idx0.
const DataLayout & getDataLayout() const
MachineInstrBuilder buildBrIndirect(Register Tgt)
Build and insert G_BRINDIRECT Tgt.
MachineInstrBuilder buildSplatVector(const DstOp &Res, const SrcOp &Val)
Build and insert Res = G_SPLAT_VECTOR Val.
MachineInstrBuilder buildStepVector(const DstOp &Res, unsigned Step)
Build and insert Res = G_STEP_VECTOR Step.
virtual MachineInstrBuilder buildConstant(const DstOp &Res, const ConstantInt &Val)
Build and insert Res = G_CONSTANT Val.
MachineInstrBuilder buildFCmp(CmpInst::Predicate Pred, const DstOp &Res, const SrcOp &Op0, const SrcOp &Op1, std::optional< unsigned > Flags=std::nullopt)
Build and insert a Res = G_FCMP PredOp0, Op1.
MachineInstrBuilder buildFAdd(const DstOp &Dst, const SrcOp &Src0, const SrcOp &Src1, std::optional< unsigned > Flags=std::nullopt)
Build and insert Res = G_FADD Op0, Op1.
MachineInstrBuilder buildSetFPEnv(const SrcOp &Src)
Build and insert G_SET_FPENV Src.
Register getReg(unsigned Idx) const
Get the register for the operand index.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addMetadata(const MDNode *MD) const
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addFPImm(const ConstantFP *Val) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addUse(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register use operand.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
Definition: MachineInstr.h:72
LLVM_ABI void copyIRFlags(const Instruction &I)
Copy all flags to MachineInst MIFlags.
static LLVM_ABI uint32_t copyFlagsFromInstruction(const Instruction &I)
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:595
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
static MachineOperand CreateES(const char *SymName, unsigned TargetFlags=0)
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, unsigned TargetFlags=0)
LLVM_ABI MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
LLT getType(Register Reg) const
Get the low-level type of Reg or LLT{} if Reg is not a generic (target independent) virtual register.
LLVM_ABI void setRegClass(Register Reg, const TargetRegisterClass *RC)
setRegClass - Set the register class of the specified virtual register.
LLVM_ABI Register createGenericVirtualRegister(LLT Ty, StringRef Name="")
Create and return a new generic virtual register with low-level type Ty.
void addPhysRegsUsedFromRegMask(const uint32_t *RegMask)
addPhysRegsUsedFromRegMask - Mark any registers not in RegMask as used.
Representation for a specific memory location.
Root of the metadata hierarchy.
Definition: Metadata.h:63
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
The optimization diagnostic interface.
Diagnostic information for missed-optimization remarks.
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:720
Class to install both of the above.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
Definition: Register.h:102
Return a value (possibly void), from a function.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
This class represents the LLVM 'select' instruction.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:470
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
Encapsulates all of the information needed to generate a stack protector check, and signals to isel w...
void initialize(const BasicBlock *BB, MachineBasicBlock *MBB, bool FunctionBasedInstrumentation)
Initialize the stack protector descriptor structure for a new basic block.
MachineBasicBlock * getSuccessMBB()
void resetPerBBState()
Reset state that changes when we handle different basic blocks.
void resetPerFunctionState()
Reset state that only changes when we switch functions.
MachineBasicBlock * getFailureMBB()
MachineBasicBlock * getParentMBB()
bool shouldEmitStackProtector() const
Returns true if all fields of the stack protector descriptor are initialized implying that we should/...
bool shouldEmitFunctionBasedCheckStackProtector() const
An instruction for storing to memory.
Definition: Instructions.h:296
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:151
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Definition: StringRef.h:148
TypeSize getElementOffset(unsigned Idx) const
Definition: DataLayout.h:657
Class to represent struct types.
Definition: DerivedTypes.h:218
bool createEntriesInEntryBlock(DebugLoc DbgLoc)
Create initial definitions of swifterror values in the entry block of the current function.
void setFunction(MachineFunction &MF)
Initialize data structures for specified new function.
void setCurrentVReg(const MachineBasicBlock *MBB, const Value *, Register)
Set the swifterror virtual register in the VRegDefMap for this basic block.
Register getOrCreateVRegUseAt(const Instruction *, const MachineBasicBlock *, const Value *)
Get or create the swifterror value virtual register for a use of a swifterror by an instruction.
Register getOrCreateVRegDefAt(const Instruction *, const MachineBasicBlock *, const Value *)
Get or create the swifterror value virtual register for a def of a swifterror by an instruction.
const Value * getFunctionArg() const
Get the (unique) function argument that was marked swifterror, or nullptr if this function has no swi...
void propagateVRegs()
Propagate assigned swifterror vregs through a function, synthesizing PHI nodes when needed to maintai...
Multiway switch.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
virtual bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
virtual unsigned getVaListSizeInBits(const DataLayout &DL) const
Returns the size of the platform's va_list object.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const
Get the CallingConv that should be used for the specified libcall.
virtual bool useStackGuardXorFP() const
If this function returns true, stack protection checks should XOR the frame pointer (or whichever poi...
const TargetMachine & getTargetMachine() const
virtual Value * getSDagStackGuard(const Module &M) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
bool isJumpExpensive() const
Return true if Flow Control is an expensive operation that should be avoided.
virtual Function * getSSPStackGuardCheck(const Module &M) const
If the target has a standard stack protection check function that performs validation and error handl...
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool getTgtMemIntrinsic(IntrinsicInfo &, const CallInst &, MachineFunction &, unsigned) const
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
virtual bool fallBackToDAGISel(const Instruction &Inst) const
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
const char * getLibcallName(RTLIB::Libcall Call) const
Get the libcall routine name for the specified libcall.
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual MVT getPointerMemTy(const DataLayout &DL, uint32_t AS=0) const
Return the in-memory pointer type for the given address space, defaults to the pointer type from the ...
virtual unsigned getVectorIdxWidth(const DataLayout &DL) const
Returns the type to be used for the index operand vector operations.
virtual bool useLoadStackGuardNode(const Module &M) const
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:83
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
const Triple & getTargetTriple() const
TargetOptions Options
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
Target-Independent Code Generator Pass Configuration Options.
virtual std::unique_ptr< CSEConfigBase > getCSEConfig() const
Returns the CSEConfig object to use for the current optimization level.
virtual bool isGISelCSEEnabled() const
Check whether continuous CSE should be enabled in GISel passes.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const InlineAsmLowering * getInlineAsmLowering() const
virtual const CallLowering * getCallLowering() const
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
bool isOSWindows() const
Tests whether the OS is Windows.
Definition: Triple.h:676
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM_ABI bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
TypeID
Definitions of all of the base types for the Type system.
Definition: Type.h:54
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:311
bool isAggregateType() const
Return true if the type is an aggregate type.
Definition: Type.h:304
bool isTokenTy() const
Return true if this is 'token'.
Definition: Type.h:234
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:139
Value * getOperand(unsigned i) const
Definition: User.h:232
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:439
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:701
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1098
int getNumOccurrences() const
Definition: CommandLine.h:400
constexpr bool isZero() const
Definition: TypeSize.h:157
const ParentTy * getParent() const
Definition: ilist_node.h:34
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition: ilist_node.h:359
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:662
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: Lint.cpp:82
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
Key
PAL metadata keys.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
Definition: BitmaskEnum.h:126
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ Libcall
The operation should be implemented as a call to some kind of runtime support library.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
bool match(Val *V, const Pattern &P)
Definition: PatternMatch.h:49
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
Definition: PatternMatch.h:962
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
Definition: PatternMatch.h:92
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Undef
Value of the register doesn't matter.
Offsets
Offsets in bytes from the start of the input buffer.
Definition: SIInstrInfo.h:1695
SmallVector< SwitchWorkListItem, 4 > SwitchWorkList
std::vector< CaseCluster > CaseClusterVector
void sortAndRangeify(CaseClusterVector &Clusters)
Sort Clusters and merge adjacent cases.
CaseClusterVector::iterator CaseClusterIt
@ CC_Range
A cluster of adjacent case labels with the same destination, or just one case.
@ CC_JumpTable
A cluster of cases suitable for jump table lowering.
@ CC_BitTests
A cluster of cases suitable for bit test lowering.
@ CE
Windows NT (Windows on ARM)
Reg
All possible values of the reg field in the ModR/M byte.
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
ExceptionBehavior
Exception behavior used for floating point operations.
Definition: FPEnv.h:39
@ ebIgnore
This corresponds to "fpexcept.ignore".
Definition: FPEnv.h:40
DiagnosticInfoOptimizationBase::Argument NV
NodeAddr< PhiNode * > Phi
Definition: RDFGraph.h:390
NodeAddr< CodeNode * > Code
Definition: RDFGraph.h:388
BaseReg
Stack frame base register. Bit 0 of FREInfo.Info.
Definition: SFrame.h:77
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition: STLExtras.h:338
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
@ Offset
Definition: DWP.cpp:477
int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition: bit.h:307
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition: STLExtras.h:2491
int countr_one(T Value)
Count the number of ones from the least significant bit to the first zero bit.
Definition: bit.h:260
LLVM_ABI void diagnoseDontCall(const CallInst &CI)
auto successors(const MachineBasicBlock *BB)
LLVM_ABI MVT getMVTForLLT(LLT Ty)
Get a rough equivalent of an MVT for a given LLT.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2155
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:252
gep_type_iterator gep_type_end(const User *GEP)
MachineBasicBlock::iterator findSplitPointForStackProtector(MachineBasicBlock *BB, const TargetInstrInfo &TII)
Find the split point at which to splice the end of BB into its success stack protector check machine ...
LLVM_ABI LLT getLLTForMVT(MVT Ty)
Get a rough equivalent of an LLT for a given MVT.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition: bit.h:157
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
Definition: Local.h:252
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1751
LLVM_ABI llvm::SmallVector< int, 16 > createStrideMask(unsigned Start, unsigned Stride, unsigned VF)
Create a stride shuffle mask.
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:428
void computeValueLLTs(const DataLayout &DL, Type &Ty, SmallVectorImpl< LLT > &ValueTys, SmallVectorImpl< uint64_t > *Offsets=nullptr, uint64_t StartingOffset=0)
computeValueLLTs - Given an LLVM IR type, compute a sequence of LLTs that represent all the individua...
Definition: Analysis.cpp:149
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition: Error.cpp:167
auto succ_size(const MachineBasicBlock *BB)
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:82
@ Success
The lock was released successfully.
@ Global
Append to llvm.global_dtors.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
LLVM_ABI void getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU)
Modify analysis usage so it preserves passes required for the SelectionDAG fallback.
Definition: Utils.cpp:1185
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:2013
LLVM_ABI llvm::SmallVector< int, 16 > createInterleaveMask(unsigned VF, unsigned NumVecs)
Create an interleave shuffle mask.
@ FMul
Product of floats.
@ Sub
Subtraction of integers.
bool isAsynchronousEHPersonality(EHPersonality Pers)
Returns true if this personality function catches asynchronous exceptions.
LLVM_ABI std::optional< RoundingMode > convertStrToRoundingMode(StringRef)
Returns a valid RoundingMode enumerator when given a string that is valid as input in constrained int...
Definition: FPEnv.cpp:24
gep_type_iterator gep_type_begin(const User *GEP)
GlobalValue * ExtractTypeInfo(Value *V)
ExtractTypeInfo - Returns the type info, possibly bitcast, encoded in V.
Definition: Analysis.cpp:185
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition: Alignment.h:212
LLVM_ABI LLT getLLTForType(Type &Ty, const DataLayout &DL)
Construct a low-level type based on an LLVM type.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:858
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition: Metadata.h:760
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
Pair of physical register and lane mask.
This class contains a discriminated union of information about pointers in memory operands,...
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static bool canHandle(const Instruction *I, const TargetLibraryInfo &TLI)
This structure is used to communicate between SelectionDAGBuilder and SDISel for the code generation ...
struct PredInfoPair PredInfo