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