LLVM 24.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"
55#include "llvm/IR/Analysis.h"
56#include "llvm/IR/BasicBlock.h"
57#include "llvm/IR/CFG.h"
58#include "llvm/IR/Constant.h"
59#include "llvm/IR/Constants.h"
60#include "llvm/IR/DataLayout.h"
63#include "llvm/IR/Function.h"
65#include "llvm/IR/InlineAsm.h"
66#include "llvm/IR/InstrTypes.h"
69#include "llvm/IR/Intrinsics.h"
70#include "llvm/IR/IntrinsicsAMDGPU.h"
71#include "llvm/IR/LLVMContext.h"
72#include "llvm/IR/Metadata.h"
74#include "llvm/IR/Statepoint.h"
75#include "llvm/IR/Type.h"
76#include "llvm/IR/User.h"
77#include "llvm/IR/Value.h"
79#include "llvm/MC/MCContext.h"
80#include "llvm/Pass.h"
83#include "llvm/Support/Debug.h"
90#include <algorithm>
91#include <cassert>
92#include <cstdint>
93#include <iterator>
94#include <optional>
95#include <string>
96#include <utility>
97#include <vector>
98
99#define DEBUG_TYPE "irtranslator"
100
101using namespace llvm;
102
103static cl::opt<bool>
104 EnableCSEInIRTranslator("enable-cse-in-irtranslator",
105 cl::desc("Should enable CSE in irtranslator"),
106 cl::Optional, cl::init(false));
107
108namespace llvm {
109
111 /// Interface used to lower the everything related to calls.
112 const CallLowering *CLI = nullptr;
113
114 SSPLayoutInfo *SPInfo = nullptr;
115
116 /// This class contains the mapping between the Values to vreg related data.
117 class ValueToVRegInfo {
118 public:
119 ValueToVRegInfo() = default;
120
121 using VRegListT = SmallVector<Register, 1>;
122 using OffsetListT = SmallVector<uint64_t, 1>;
123
124 using const_vreg_iterator =
126 using const_offset_iterator =
128
129 inline const_vreg_iterator vregs_end() const { return ValToVRegs.end(); }
130
131 VRegListT *getVRegs(const Value &V) {
132 auto It = ValToVRegs.find(&V);
133 if (It != ValToVRegs.end())
134 return It->second;
135
136 return insertVRegs(V);
137 }
138
139 OffsetListT *getOffsets(const Value &V) {
140 auto It = TypeToOffsets.find(V.getType());
141 if (It != TypeToOffsets.end())
142 return It->second;
143
144 return insertOffsets(V);
145 }
146
147 const_vreg_iterator findVRegs(const Value &V) const {
148 return ValToVRegs.find(&V);
149 }
150
151 bool contains(const Value &V) const { return ValToVRegs.contains(&V); }
152
153 void reset() {
154 ValToVRegs.clear();
155 TypeToOffsets.clear();
156 VRegAlloc.DestroyAll();
157 OffsetAlloc.DestroyAll();
158 }
159
160 private:
161 VRegListT *insertVRegs(const Value &V) {
162 assert(!ValToVRegs.contains(&V) && "Value already exists");
163
164 // We placement new using our fast allocator since we never try to free
165 // the vectors until translation is finished.
166 auto *VRegList = new (VRegAlloc.Allocate()) VRegListT();
167 ValToVRegs[&V] = VRegList;
168 return VRegList;
169 }
170
171 OffsetListT *insertOffsets(const Value &V) {
172 assert(!TypeToOffsets.contains(V.getType()) && "Type already exists");
173
174 auto *OffsetList = new (OffsetAlloc.Allocate()) OffsetListT();
175 TypeToOffsets[V.getType()] = OffsetList;
176 return OffsetList;
177 }
180
181 // We store pointers to vectors here since references may be invalidated
182 // while we hold them if we stored the vectors directly.
185 };
186
187 /// Mapping of the values of the current LLVM IR function to the related
188 /// virtual registers and offsets.
189 ValueToVRegInfo VMap;
190
191 // One BasicBlock can be translated to multiple MachineBasicBlocks. For such
192 // BasicBlocks translated to multiple MachineBasicBlocks, MachinePreds retains
193 // a mapping between the edges arriving at the BasicBlock to the corresponding
194 // created MachineBasicBlocks. Some BasicBlocks that get translated to a
195 // single MachineBasicBlock may also end up in this Map.
196 using CFGEdge = std::pair<const BasicBlock *, const BasicBlock *>;
198
199 // List of stubbed PHI instructions, for values and basic blocks to be filled
200 // in once all MachineBasicBlocks have been created.
202 PendingPHIs;
203
204 /// Record of what frame index has been allocated to specified allocas for
205 /// this function.
207
208 SwiftErrorValueTracking SwiftError;
209
210 /// \name Methods for translating form LLVM IR to MachineInstr.
211 /// \see ::translate for general information on the translate methods.
212 /// @{
213
214 /// Translate \p Inst into its corresponding MachineInstr instruction(s).
215 /// Insert the newly translated instruction(s) right where the CurBuilder
216 /// is set.
217 ///
218 /// The general algorithm is:
219 /// 1. Look for a virtual register for each operand or
220 /// create one.
221 /// 2 Update the VMap accordingly.
222 /// 2.alt. For constant arguments, if they are compile time constants,
223 /// produce an immediate in the right operand and do not touch
224 /// ValToReg. Actually we will go with a virtual register for each
225 /// constants because it may be expensive to actually materialize the
226 /// constant. Moreover, if the constant spans on several instructions,
227 /// CSE may not catch them.
228 /// => Update ValToVReg and remember that we saw a constant in Constants.
229 /// We will materialize all the constants in finalize.
230 /// Note: we would need to do something so that we can recognize such operand
231 /// as constants.
232 /// 3. Create the generic instruction.
233 ///
234 /// \return true if the translation succeeded.
235 bool translate(const Instruction &Inst);
236
237 /// Materialize \p C into virtual-register \p Reg. The generic instructions
238 /// performing this materialization will be inserted into the entry block of
239 /// the function.
240 ///
241 /// \return true if the materialization succeeded.
242 bool translate(const Constant &C, Register Reg);
243
244 /// Examine any debug-info attached to the instruction (in the form of
245 /// DbgRecords) and translate it.
246 void translateDbgInfo(const Instruction &Inst, MachineIRBuilder &MIRBuilder);
247
248 /// Translate a debug-info record of a dbg.value into a DBG_* instruction.
249 /// Pass in all the contents of the record, rather than relying on how it's
250 /// stored.
251 void translateDbgValueRecord(Value *V, bool HasArgList,
252 const DILocalVariable *Variable,
254 const DebugLoc &DL,
255 MachineIRBuilder &MIRBuilder);
256
257 /// Translate a debug-info record of a dbg.declare into an indirect DBG_*
258 /// instruction. Pass in all the contents of the record, rather than relying
259 /// on how it's stored.
260 void translateDbgDeclareRecord(Value *Address, bool HasArgList,
261 const DILocalVariable *Variable,
263 const DebugLoc &DL,
264 MachineIRBuilder &MIRBuilder);
265
266 // Translate U as a copy of V.
267 bool translateCopy(const User &U, const Value &V,
268 MachineIRBuilder &MIRBuilder);
269 bool translateCopy(const User &U, Register Src, MachineIRBuilder &MIRBuilder);
270
271 /// Translate an LLVM bitcast into generic IR. Either a COPY or a G_BITCAST is
272 /// emitted.
273 bool translateBitCast(const User &U, MachineIRBuilder &MIRBuilder);
274
275 /// Translate an LLVM load instruction into generic IR.
276 bool translateLoad(const User &U, MachineIRBuilder &MIRBuilder);
277
278 /// Translate an LLVM store instruction into generic IR.
279 bool translateStore(const User &U, MachineIRBuilder &MIRBuilder);
280
281 /// Translate an LLVM string intrinsic (memcpy, memset, ...).
282 bool translateMemFunc(const CallInst &CI, MachineIRBuilder &MIRBuilder,
283 unsigned Opcode);
284
285 /// Translate an LLVM trap intrinsic (trap, debugtrap, ubsantrap).
286 bool translateTrap(const CallInst &U, MachineIRBuilder &MIRBuilder,
287 unsigned Opcode);
288
289 // Translate @llvm.vector.interleave2 and
290 // @llvm.vector.deinterleave2 intrinsics for fixed-width vector
291 // types into vector shuffles.
292 bool translateVectorInterleave2Intrinsic(const CallInst &CI,
293 MachineIRBuilder &MIRBuilder);
294 bool translateVectorDeinterleave2Intrinsic(const CallInst &CI,
295 MachineIRBuilder &MIRBuilder);
296
297 void getStackGuard(Register DstReg, MachineIRBuilder &MIRBuilder);
298
299 bool translateOverflowIntrinsic(const CallInst &CI, unsigned Op,
300 MachineIRBuilder &MIRBuilder);
301 bool translateFixedPointIntrinsic(unsigned Op, const CallInst &CI,
302 MachineIRBuilder &MIRBuilder);
303
304 /// Helper function for translateSimpleIntrinsic.
305 /// \return The generic opcode for \p IntrinsicID if \p IntrinsicID is a
306 /// simple intrinsic (ceil, fabs, etc.). Otherwise, returns
307 /// Intrinsic::not_intrinsic.
308 unsigned getSimpleIntrinsicOpcode(Intrinsic::ID ID);
309
310 /// Translates the intrinsics defined in getSimpleIntrinsicOpcode.
311 /// \return true if the translation succeeded.
312 bool translateSimpleIntrinsic(const CallInst &CI, Intrinsic::ID ID,
313 MachineIRBuilder &MIRBuilder);
314
315 bool translateConstrainedFPIntrinsic(const ConstrainedFPIntrinsic &FPI,
316 MachineIRBuilder &MIRBuilder);
317
318 bool translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
319 MachineIRBuilder &MIRBuilder);
320
321 /// Returns the single livein physical register Arg was lowered to, if
322 /// possible.
323 std::optional<MCRegister> getArgPhysReg(Argument &Arg);
324
325 /// If debug-info targets an Argument and its expression is an EntryValue,
326 /// lower it as either an entry in the MF debug table (dbg.declare), or a
327 /// DBG_VALUE targeting the corresponding livein register for that Argument
328 /// (dbg.value).
329 bool translateIfEntryValueArgument(bool isDeclare, Value *Arg,
330 const DILocalVariable *Var,
331 const DIExpression *Expr,
332 const DebugLoc &DL,
333 MachineIRBuilder &MIRBuilder);
334
335 bool translateInlineAsm(const CallBase &CB, MachineIRBuilder &MIRBuilder);
336
337 /// Common code for translating normal calls or invokes.
338 bool translateCallBase(const CallBase &CB, MachineIRBuilder &MIRBuilder);
339
340 /// Translate call instruction.
341 /// \pre \p U is a call instruction.
342 bool translateCall(const User &U, MachineIRBuilder &MIRBuilder);
343
344 bool translateIntrinsic(
345 const CallBase &CB, Intrinsic::ID ID, MachineIRBuilder &MIRBuilder,
346 ArrayRef<TargetLowering::IntrinsicInfo> TgtMemIntrinsicInfos = {});
347
348 /// When an invoke or a cleanupret unwinds to the next EH pad, there are
349 /// many places it could ultimately go. In the IR, we have a single unwind
350 /// destination, but in the machine CFG, we enumerate all the possible blocks.
351 /// This function skips over imaginary basic blocks that hold catchswitch
352 /// instructions, and finds all the "real" machine
353 /// basic block destinations. As those destinations may not be successors of
354 /// EHPadBB, here we also calculate the edge probability to those
355 /// destinations. The passed-in Prob is the edge probability to EHPadBB.
356 bool findUnwindDestinations(
357 const BasicBlock *EHPadBB, BranchProbability Prob,
358 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
359 &UnwindDests);
360
361 bool translateInvoke(const User &U, MachineIRBuilder &MIRBuilder);
362
363 bool translateCallBr(const User &U, MachineIRBuilder &MIRBuilder);
364
365 bool translateLandingPad(const User &U, MachineIRBuilder &MIRBuilder);
366
367 /// Translate one of LLVM's cast instructions into MachineInstrs, with the
368 /// given generic Opcode.
369 bool translateCast(unsigned Opcode, const User &U,
370 MachineIRBuilder &MIRBuilder);
371
372 /// Translate a phi instruction.
373 bool translatePHI(const User &U, MachineIRBuilder &MIRBuilder);
374
375 /// Translate a comparison (icmp or fcmp) instruction or constant.
376 bool translateCompare(const User &U, MachineIRBuilder &MIRBuilder);
377
378 /// Translate an integer compare instruction (or constant).
379 bool translateICmp(const User &U, MachineIRBuilder &MIRBuilder) {
380 return translateCompare(U, MIRBuilder);
381 }
382
383 /// Translate a floating-point compare instruction (or constant).
384 bool translateFCmp(const User &U, MachineIRBuilder &MIRBuilder) {
385 return translateCompare(U, MIRBuilder);
386 }
387
388 /// Add remaining operands onto phis we've translated. Executed after all
389 /// MachineBasicBlocks for the function have been created.
390 void finishPendingPhis();
391
392 /// Translate \p Inst into a unary operation \p Opcode.
393 /// \pre \p U is a unary operation.
394 bool translateUnaryOp(unsigned Opcode, const User &U,
395 MachineIRBuilder &MIRBuilder);
396
397 /// Translate \p Inst into a binary operation \p Opcode.
398 /// \pre \p U is a binary operation.
399 bool translateBinaryOp(unsigned Opcode, const User &U,
400 MachineIRBuilder &MIRBuilder);
401
402 /// If the set of cases should be emitted as a series of branches, return
403 /// true. If we should emit this as a bunch of and/or'd together conditions,
404 /// return false.
405 bool shouldEmitAsBranches(const std::vector<SwitchCG::CaseBlock> &Cases);
406 /// Helper method for findMergedConditions.
407 /// This function emits a branch and is used at the leaves of an OR or an
408 /// AND operator tree.
409 void emitBranchForMergedCondition(const Value *Cond, MachineBasicBlock *TBB,
411 MachineBasicBlock *CurBB,
412 MachineBasicBlock *SwitchBB,
413 BranchProbability TProb,
414 BranchProbability FProb, bool InvertCond);
415 /// Used during condbr translation to find trees of conditions that can be
416 /// optimized.
417 void findMergedConditions(const Value *Cond, MachineBasicBlock *TBB,
419 MachineBasicBlock *SwitchBB,
421 BranchProbability FProb, bool InvertCond);
422
423 /// Translate branch (br) instruction.
424 /// \pre \p U is a branch instruction.
425 bool translateUncondBr(const User &U, MachineIRBuilder &MIRBuilder);
426 bool translateCondBr(const User &U, MachineIRBuilder &MIRBuilder);
427
428 // Begin switch lowering functions.
429 bool emitJumpTableHeader(SwitchCG::JumpTable &JT,
431 MachineBasicBlock *HeaderBB);
432 void emitJumpTable(SwitchCG::JumpTable &JT, MachineBasicBlock *MBB);
433
434 void emitSwitchCase(SwitchCG::CaseBlock &CB, MachineBasicBlock *SwitchBB,
435 MachineIRBuilder &MIB);
436
437 /// Generate for the BitTest header block, which precedes each sequence of
438 /// BitTestCases.
439 void emitBitTestHeader(SwitchCG::BitTestBlock &BTB,
440 MachineBasicBlock *SwitchMBB);
441 /// Generate code to produces one "bit test" for a given BitTestCase \p B.
442 void emitBitTestCase(SwitchCG::BitTestBlock &BB, MachineBasicBlock *NextMBB,
443 BranchProbability BranchProbToNext, Register Reg,
445
446 void splitWorkItem(SwitchCG::SwitchWorkList &WorkList,
448 MachineBasicBlock *SwitchMBB, MachineIRBuilder &MIB);
449
450 bool lowerJumpTableWorkItem(
452 MachineBasicBlock *CurMBB, MachineBasicBlock *DefaultMBB,
455 MachineBasicBlock *Fallthrough, bool FallthroughUnreachable);
456
457 bool lowerSwitchRangeWorkItem(SwitchCG::CaseClusterIt I, Value *Cond,
458 MachineBasicBlock *Fallthrough,
459 bool FallthroughUnreachable,
460 BranchProbability UnhandledProbs,
461 MachineBasicBlock *CurMBB,
462 MachineIRBuilder &MIB,
463 MachineBasicBlock *SwitchMBB);
464
465 bool lowerBitTestWorkItem(
467 MachineBasicBlock *CurMBB, MachineBasicBlock *DefaultMBB,
469 BranchProbability DefaultProb, BranchProbability UnhandledProbs,
471 bool FallthroughUnreachable);
472
473 bool lowerSwitchWorkItem(SwitchCG::SwitchWorkListItem W, Value *Cond,
474 MachineBasicBlock *SwitchMBB,
475 MachineBasicBlock *DefaultMBB,
476 MachineIRBuilder &MIB);
477
478 bool translateSwitch(const User &U, MachineIRBuilder &MIRBuilder);
479 // End switch lowering section.
480
481 bool translateIndirectBr(const User &U, MachineIRBuilder &MIRBuilder);
482
483 bool translateExtractValue(const User &U, MachineIRBuilder &MIRBuilder);
484
485 bool translateInsertValue(const User &U, MachineIRBuilder &MIRBuilder);
486
487 bool translateSelect(const User &U, MachineIRBuilder &MIRBuilder);
488
489 bool translateGetElementPtr(const User &U, MachineIRBuilder &MIRBuilder);
490
491 bool translateAlloca(const User &U, MachineIRBuilder &MIRBuilder);
492
493 /// Translate return (ret) instruction.
494 /// The target needs to implement CallLowering::lowerReturn for
495 /// this to succeed.
496 /// \pre \p U is a return instruction.
497 bool translateRet(const User &U, MachineIRBuilder &MIRBuilder);
498
499 bool translateFNeg(const User &U, MachineIRBuilder &MIRBuilder);
500
501 bool translateAdd(const User &U, MachineIRBuilder &MIRBuilder) {
502 return translateBinaryOp(TargetOpcode::G_ADD, U, MIRBuilder);
503 }
504 bool translateSub(const User &U, MachineIRBuilder &MIRBuilder) {
505 return translateBinaryOp(TargetOpcode::G_SUB, U, MIRBuilder);
506 }
507 bool translateAnd(const User &U, MachineIRBuilder &MIRBuilder) {
508 return translateBinaryOp(TargetOpcode::G_AND, U, MIRBuilder);
509 }
510 bool translateMul(const User &U, MachineIRBuilder &MIRBuilder) {
511 return translateBinaryOp(TargetOpcode::G_MUL, U, MIRBuilder);
512 }
513 bool translateOr(const User &U, MachineIRBuilder &MIRBuilder) {
514 return translateBinaryOp(TargetOpcode::G_OR, U, MIRBuilder);
515 }
516 bool translateXor(const User &U, MachineIRBuilder &MIRBuilder) {
517 return translateBinaryOp(TargetOpcode::G_XOR, U, MIRBuilder);
518 }
519
520 bool translateUDiv(const User &U, MachineIRBuilder &MIRBuilder) {
521 return translateBinaryOp(TargetOpcode::G_UDIV, U, MIRBuilder);
522 }
523 bool translateSDiv(const User &U, MachineIRBuilder &MIRBuilder) {
524 return translateBinaryOp(TargetOpcode::G_SDIV, U, MIRBuilder);
525 }
526 bool translateURem(const User &U, MachineIRBuilder &MIRBuilder) {
527 return translateBinaryOp(TargetOpcode::G_UREM, U, MIRBuilder);
528 }
529 bool translateSRem(const User &U, MachineIRBuilder &MIRBuilder) {
530 return translateBinaryOp(TargetOpcode::G_SREM, U, MIRBuilder);
531 }
532 bool translateIntToPtr(const User &U, MachineIRBuilder &MIRBuilder) {
533 return translateCast(TargetOpcode::G_INTTOPTR, U, MIRBuilder);
534 }
535 bool translatePtrToInt(const User &U, MachineIRBuilder &MIRBuilder) {
536 return translateCast(TargetOpcode::G_PTRTOINT, U, MIRBuilder);
537 }
538 bool translatePtrToAddr(const User &U, MachineIRBuilder &MIRBuilder) {
539 // FIXME: this is not correct for pointers with addr width != pointer width
540 return translatePtrToInt(U, MIRBuilder);
541 }
542 bool translateTrunc(const User &U, MachineIRBuilder &MIRBuilder) {
543 return translateCast(TargetOpcode::G_TRUNC, U, MIRBuilder);
544 }
545 bool translateFPTrunc(const User &U, MachineIRBuilder &MIRBuilder) {
546 return translateCast(TargetOpcode::G_FPTRUNC, U, MIRBuilder);
547 }
548 bool translateFPExt(const User &U, MachineIRBuilder &MIRBuilder) {
549 return translateCast(TargetOpcode::G_FPEXT, U, MIRBuilder);
550 }
551 bool translateFPToUI(const User &U, MachineIRBuilder &MIRBuilder) {
552 return translateCast(TargetOpcode::G_FPTOUI, U, MIRBuilder);
553 }
554 bool translateFPToSI(const User &U, MachineIRBuilder &MIRBuilder) {
555 return translateCast(TargetOpcode::G_FPTOSI, U, MIRBuilder);
556 }
557 bool translateUIToFP(const User &U, MachineIRBuilder &MIRBuilder) {
558 return translateCast(TargetOpcode::G_UITOFP, U, MIRBuilder);
559 }
560 bool translateSIToFP(const User &U, MachineIRBuilder &MIRBuilder) {
561 return translateCast(TargetOpcode::G_SITOFP, U, MIRBuilder);
562 }
563 bool translateUnreachable(const User &U, MachineIRBuilder &MIRBuilder);
564
565 bool translateSExt(const User &U, MachineIRBuilder &MIRBuilder) {
566 return translateCast(TargetOpcode::G_SEXT, U, MIRBuilder);
567 }
568
569 bool translateZExt(const User &U, MachineIRBuilder &MIRBuilder) {
570 return translateCast(TargetOpcode::G_ZEXT, U, MIRBuilder);
571 }
572
573 bool translateShl(const User &U, MachineIRBuilder &MIRBuilder) {
574 return translateBinaryOp(TargetOpcode::G_SHL, U, MIRBuilder);
575 }
576 bool translateLShr(const User &U, MachineIRBuilder &MIRBuilder) {
577 return translateBinaryOp(TargetOpcode::G_LSHR, U, MIRBuilder);
578 }
579 bool translateAShr(const User &U, MachineIRBuilder &MIRBuilder) {
580 return translateBinaryOp(TargetOpcode::G_ASHR, U, MIRBuilder);
581 }
582
583 bool translateFAdd(const User &U, MachineIRBuilder &MIRBuilder) {
584 return translateBinaryOp(TargetOpcode::G_FADD, U, MIRBuilder);
585 }
586 bool translateFSub(const User &U, MachineIRBuilder &MIRBuilder) {
587 return translateBinaryOp(TargetOpcode::G_FSUB, U, MIRBuilder);
588 }
589 bool translateFMul(const User &U, MachineIRBuilder &MIRBuilder) {
590 return translateBinaryOp(TargetOpcode::G_FMUL, U, MIRBuilder);
591 }
592 bool translateFDiv(const User &U, MachineIRBuilder &MIRBuilder) {
593 return translateBinaryOp(TargetOpcode::G_FDIV, U, MIRBuilder);
594 }
595 bool translateFRem(const User &U, MachineIRBuilder &MIRBuilder) {
596 return translateBinaryOp(TargetOpcode::G_FREM, U, MIRBuilder);
597 }
598
599 bool translateVAArg(const User &U, MachineIRBuilder &MIRBuilder);
600
601 bool translateInsertElement(const User &U, MachineIRBuilder &MIRBuilder);
602 bool translateInsertVector(const User &U, MachineIRBuilder &MIRBuilder);
603
604 bool translateExtractElement(const User &U, MachineIRBuilder &MIRBuilder);
605 bool translateExtractVector(const User &U, MachineIRBuilder &MIRBuilder);
606
607 bool translateShuffleVector(const User &U, MachineIRBuilder &MIRBuilder);
608
609 bool translateAtomicCmpXchg(const User &U, MachineIRBuilder &MIRBuilder);
610 bool translateAtomicRMW(const User &U, MachineIRBuilder &MIRBuilder);
611 bool translateFence(const User &U, MachineIRBuilder &MIRBuilder);
612 bool translateFreeze(const User &U, MachineIRBuilder &MIRBuilder);
613
614 // Stubs to keep the compiler happy while we implement the rest of the
615 // translation.
616 bool translateResume(const User &U, MachineIRBuilder &MIRBuilder) {
617 return false;
618 }
619 bool translateCleanupRet(const User &U, MachineIRBuilder &MIRBuilder) {
620 return false;
621 }
622 bool translateCatchRet(const User &U, MachineIRBuilder &MIRBuilder) {
623 return false;
624 }
625 bool translateCatchSwitch(const User &U, MachineIRBuilder &MIRBuilder) {
626 return false;
627 }
628 bool translateAddrSpaceCast(const User &U, MachineIRBuilder &MIRBuilder) {
629 return translateCast(TargetOpcode::G_ADDRSPACE_CAST, U, MIRBuilder);
630 }
631 bool translateCleanupPad(const User &U, MachineIRBuilder &MIRBuilder) {
632 return false;
633 }
634 bool translateCatchPad(const User &U, MachineIRBuilder &MIRBuilder) {
635 return false;
636 }
637 bool translateUserOp1(const User &U, MachineIRBuilder &MIRBuilder) {
638 return false;
639 }
640 bool translateUserOp2(const User &U, MachineIRBuilder &MIRBuilder) {
641 return false;
642 }
643
644 bool translateConvergenceControlIntrinsic(const CallInst &CI,
645 Intrinsic::ID ID,
646 MachineIRBuilder &MIRBuilder);
647
648 /// @}
649
650 // Builder for machine instruction a la IRBuilder.
651 // I.e., compared to regular MIBuilder, this one also inserts the instruction
652 // in the current block, it can creates block, etc., basically a kind of
653 // IRBuilder, but for Machine IR.
654 // CSEMIRBuilder CurBuilder;
655 std::unique_ptr<MachineIRBuilder> CurBuilder;
656
657 // Builder set to the entry block (just after ABI lowering instructions). Used
658 // as a convenient location for Constants.
659 // CSEMIRBuilder EntryBuilder;
660 std::unique_ptr<MachineIRBuilder> EntryBuilder;
661
662 // The MachineFunction currently being translated.
663 MachineFunction *MF = nullptr;
664
665 /// MachineRegisterInfo used to create virtual registers.
666 MachineRegisterInfo *MRI = nullptr;
667
668 const DataLayout *DL = nullptr;
669
670 CodeGenOptLevel OptLevel;
671
672 /// Current optimization remark emitter. Used to report failures.
673 std::unique_ptr<OptimizationRemarkEmitter> ORE;
674
675 AAResults *AA = nullptr;
676 AssumptionCache *AC = nullptr;
677 const TargetLibraryInfo *LibInfo = nullptr;
678 const LibcallLoweringInfo *Libcalls = nullptr;
679 const TargetLowering *TLI = nullptr;
680 FunctionLoweringInfo FuncInfo;
681
682 // True when either the Target Machine specifies no optimizations or the
683 // function has the optnone attribute.
684 bool EnableOpts = false;
685
686 /// True when the block contains a tail call. This allows the IRTranslator to
687 /// stop translating such blocks early.
688 bool HasTailCall = false;
689
690 StackProtectorDescriptor SPDescriptor;
691
692 bool mayTranslateUserTypes(const User &U) const;
693
694 /// Switch analysis and optimization.
695 class GISelSwitchLowering : public SwitchCG::SwitchLowering {
696 public:
697 GISelSwitchLowering(IRTranslatorImpl *irt, FunctionLoweringInfo &funcinfo)
698 : SwitchLowering(funcinfo), IRT(irt) {
699 assert(irt && "irt is null!");
700 }
701
702 void addSuccessorWithProb(
705 IRT->addSuccessorWithProb(Src, Dst, Prob);
706 }
707
708 ~GISelSwitchLowering() override = default;
709
710 private:
711 IRTranslatorImpl *IRT;
712 };
713
714 std::unique_ptr<GISelSwitchLowering> SL;
715
716 // * Insert all the code needed to materialize the constants
717 // at the proper place. E.g., Entry block or dominator block
718 // of each constant depending on how fancy we want to be.
719 // * Clear the different maps.
720 void finalizeFunction();
721
722 // Processing steps done per block. E.g. emitting jump tables, stack
723 // protectors etc. Returns true if no errors, false if there was a problem
724 // that caused an abort.
725 bool finalizeBasicBlock(const BasicBlock &BB, MachineBasicBlock &MBB);
726
727 /// Codegen a new tail for a stack protector check ParentMBB which has had its
728 /// tail spliced into a stack protector check success bb.
729 ///
730 /// For a high level explanation of how this fits into the stack protector
731 /// generation see the comment on the declaration of class
732 /// StackProtectorDescriptor.
733 ///
734 /// \return true if there were no problems.
735 bool emitSPDescriptorParent(StackProtectorDescriptor &SPD,
736 MachineBasicBlock *ParentBB);
737
738 /// Codegen the failure basic block for a stack protector check.
739 ///
740 /// A failure stack protector machine basic block consists simply of a call to
741 /// __stack_chk_fail().
742 ///
743 /// For a high level explanation of how this fits into the stack protector
744 /// generation see the comment on the declaration of class
745 /// StackProtectorDescriptor.
746 ///
747 /// \return true if there were no problems.
748 bool emitSPDescriptorFailure(StackProtectorDescriptor &SPD,
749 MachineBasicBlock *FailureBB);
750
751 /// Get the VRegs that represent \p Val.
752 /// Non-aggregate types have just one corresponding VReg and the list can be
753 /// used as a single "unsigned". Aggregates get flattened. If such VRegs do
754 /// not exist, they are created.
755 ArrayRef<Register> getOrCreateVRegs(const Value &Val);
756
757 Register getOrCreateVReg(const Value &Val) {
758 auto Regs = getOrCreateVRegs(Val);
759 if (Regs.empty())
760 return 0;
761 assert(Regs.size() == 1 &&
762 "attempt to get single VReg for aggregate or void");
763 return Regs[0];
764 }
765
766 Register getOrCreateConvergenceTokenVReg(const Value &Token) {
767 assert(Token.getType()->isTokenTy());
768 auto &Regs = *VMap.getVRegs(Token);
769 if (!Regs.empty()) {
770 assert(Regs.size() == 1 &&
771 "Expected a single register for convergence tokens.");
772 return Regs[0];
773 }
774
775 auto Reg = MRI->createGenericVirtualRegister(LLT::token());
776 Regs.push_back(Reg);
777 auto &Offsets = *VMap.getOffsets(Token);
778 if (Offsets.empty())
779 Offsets.push_back(0);
780 return Reg;
781 }
782
783 /// Allocate some vregs and offsets in the VMap. Then populate just the
784 /// offsets while leaving the vregs empty.
785 ValueToVRegInfo::VRegListT &allocateVRegs(const Value &Val);
786
787 /// Get the frame index that represents \p Val.
788 /// If such VReg does not exist, it is created.
789 int getOrCreateFrameIndex(const AllocaInst &AI);
790
791 /// Get the alignment of the given memory operation instruction. This will
792 /// either be the explicitly specified value or the ABI-required alignment for
793 /// the type being accessed (according to the Module's DataLayout).
794 Align getMemOpAlign(const Instruction &I);
795
796 /// Get the MachineBasicBlock that represents \p BB. Specifically, the block
797 /// returned will be the head of the translated block (suitable for branch
798 /// destinations).
799 MachineBasicBlock &getMBB(const BasicBlock &BB);
800
801 /// Record \p NewPred as a Machine predecessor to `Edge.second`, corresponding
802 /// to `Edge.first` at the IR level. This is used when IRTranslation creates
803 /// multiple MachineBasicBlocks for a given IR block and the CFG is no longer
804 /// represented simply by the IR-level CFG.
805 void addMachineCFGPred(CFGEdge Edge, MachineBasicBlock *NewPred);
806
807 /// Returns the Machine IR predecessors for the given IR CFG edge. Usually
808 /// this is just the single MachineBasicBlock corresponding to the predecessor
809 /// in the IR. More complex lowering can result in multiple MachineBasicBlocks
810 /// preceding the original though (e.g. switch instructions).
811 SmallVector<MachineBasicBlock *, 1> getMachinePredBBs(CFGEdge Edge) {
812 auto RemappedEdge = MachinePreds.find(Edge);
813 if (RemappedEdge != MachinePreds.end())
814 return RemappedEdge->second;
815 return SmallVector<MachineBasicBlock *, 4>(1, &getMBB(*Edge.first));
816 }
817
818 /// Return branch probability calculated by BranchProbabilityInfo for IR
819 /// blocks.
820 BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
821 const MachineBasicBlock *Dst) const;
822
823 void addSuccessorWithProb(
826
827public:
829 : OptLevel(OptLevel) {}
830
831 // Algo:
832 // CallLowering = MF.subtarget.getCallLowering()
833 // F = MF.getParent()
834 // MIRBuilder.reset(MF)
835 // getMBB(F.getEntryBB())
836 // CallLowering->translateArguments(MIRBuilder, F, ValToVReg)
837 // for each bb in F
838 // getMBB(bb)
839 // for each inst in bb
840 // if (!translate(MIRBuilder, inst, ValToVReg, ConstantToSequence))
841 // reportFatalUsageError("Don't know how to translate input");
842 // finalize()
844 function_ref<GISelCSEInfo *()> GetCSEInfo,
845 bool ShouldSkipOpts,
846 function_ref<AAResults *()> GetAAResults,
848 function_ref<AssumptionCache *()> GetAC,
849 TargetLibraryInfo *LibraryInfo,
850 const LibcallLoweringInfo *LibcallInfo,
851 SSPLayoutInfo *StackProtectorInfo);
852};
853
854} // namespace llvm
855
857
859 "IRTranslator LLVM IR -> MI", false, false)
866 "IRTranslator LLVM IR -> MI", false, false)
867
871 MF.getProperties().setFailedISel();
872 bool IsGlobalISelAbortEnabled =
873 MF.getTarget().Options.GlobalISelAbort == GlobalISelAbortMode::Enable;
874
875 // Print the function name explicitly if we don't have a debug location (which
876 // makes the diagnostic less useful) or if we're going to emit a raw error.
877 if (!R.getLocation().isValid() || IsGlobalISelAbortEnabled)
878 R << (" (in function: " + MF.getName() + ")").str();
879
880 if (IsGlobalISelAbortEnabled)
881 report_fatal_error(Twine(R.getMsg()));
882 else
883 ORE.emit(R);
884}
885
887 : MachineFunctionPass(ID), OptLevel(OptLevel),
888 Impl(std::make_unique<IRTranslatorImpl>(OptLevel)) {}
889
891
892#ifndef NDEBUG
893namespace {
894/// Verify that every instruction created has the same DILocation as the
895/// instruction being translated.
896class DILocationVerifier : public GISelChangeObserver {
897 const Instruction *CurrInst = nullptr;
898
899public:
900 DILocationVerifier() = default;
901 ~DILocationVerifier() override = default;
902
903 const Instruction *getCurrentInst() const { return CurrInst; }
904 void setCurrentInst(const Instruction *Inst) { CurrInst = Inst; }
905
906 void erasingInstr(MachineInstr &MI) override {}
907 void changingInstr(MachineInstr &MI) override {}
908 void changedInstr(MachineInstr &MI) override {}
909
910 void createdInstr(MachineInstr &MI) override {
911 assert(getCurrentInst() && "Inserted instruction without a current MI");
912
913 // Only print the check message if we're actually checking it.
914#ifndef NDEBUG
915 LLVM_DEBUG(dbgs() << "Checking DILocation from " << *CurrInst
916 << " was copied to " << MI);
917#endif
918 // We allow insts in the entry block to have no debug loc because
919 // they could have originated from constants, and we don't want a jumpy
920 // debug experience.
921 assert((CurrInst->getDebugLoc() == MI.getDebugLoc() ||
922 (MI.getParent()->isEntryBlock() && !MI.getDebugLoc()) ||
923 (MI.isDebugInstr())) &&
924 "Line info was not transferred to all instructions");
925 }
926};
927} // namespace
928#endif // ifndef NDEBUG
929
946
947IRTranslatorImpl::ValueToVRegInfo::VRegListT &
948IRTranslatorImpl::allocateVRegs(const Value &Val) {
949 auto VRegsIt = VMap.findVRegs(Val);
950 if (VRegsIt != VMap.vregs_end())
951 return *VRegsIt->second;
952 auto *Regs = VMap.getVRegs(Val);
953 auto *Offsets = VMap.getOffsets(Val);
954 SmallVector<LLT, 4> SplitTys;
955 computeValueLLTs(*DL, *Val.getType(), SplitTys,
956 Offsets->empty() ? Offsets : nullptr);
957 for (unsigned i = 0; i < SplitTys.size(); ++i)
958 Regs->push_back(0);
959 return *Regs;
960}
961
962ArrayRef<Register> IRTranslatorImpl::getOrCreateVRegs(const Value &Val) {
963 auto VRegsIt = VMap.findVRegs(Val);
964 if (VRegsIt != VMap.vregs_end())
965 return *VRegsIt->second;
966
967 if (Val.getType()->isVoidTy())
968 return *VMap.getVRegs(Val);
969
970 // Create entry for this type.
971 auto *VRegs = VMap.getVRegs(Val);
972 auto *Offsets = VMap.getOffsets(Val);
973
974 if (!Val.getType()->isTokenTy())
975 assert(Val.getType()->isSized() &&
976 "Don't know how to create an empty vreg");
977
978 // Fast-path values that lower to a single vreg.
979 if (!Val.getType()->isAggregateType()) {
980 LLT Ty = getLLTForType(*Val.getType(), *DL);
981 if (Offsets->empty())
982 Offsets->push_back(0);
983 VRegs->push_back(MRI->createGenericVirtualRegister(Ty));
984 if (isa<Constant>(Val)) {
985 bool Success = translate(cast<Constant>(Val), VRegs->front());
986 if (!Success) {
987 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
989 &MF->getFunction().getEntryBlock());
990 R << "unable to translate constant: " << ore::NV("Type", Val.getType());
991 reportTranslationError(*MF, *ORE, R);
992 }
993 }
994 return *VRegs;
995 }
996
997 SmallVector<LLT, 4> SplitTys;
998 computeValueLLTs(*DL, *Val.getType(), SplitTys,
999 Offsets->empty() ? Offsets : nullptr);
1000
1001 if (!isa<Constant>(Val)) {
1002 for (auto Ty : SplitTys)
1003 VRegs->push_back(MRI->createGenericVirtualRegister(Ty));
1004 return *VRegs;
1005 }
1006
1007 // UndefValue, ConstantAggregateZero
1008 auto &C = cast<Constant>(Val);
1009 unsigned Idx = 0;
1010 while (auto Elt = C.getAggregateElement(Idx++)) {
1011 auto EltRegs = getOrCreateVRegs(*Elt);
1012 llvm::append_range(*VRegs, EltRegs);
1013 }
1014
1015 return *VRegs;
1016}
1017
1018int IRTranslatorImpl::getOrCreateFrameIndex(const AllocaInst &AI) {
1019 auto [MapEntry, Inserted] = FrameIndices.try_emplace(&AI);
1020 if (!Inserted)
1021 return MapEntry->second;
1022
1023 TypeSize TySize = AI.getAllocationSize(*DL).value_or(TypeSize::getZero());
1024 uint64_t Size = TySize.getKnownMinValue();
1025
1026 // Always allocate at least one byte.
1027 Size = std::max<uint64_t>(Size, 1u);
1028
1029 int &FI = MapEntry->second;
1030 FI = MF->getFrameInfo().CreateStackObject(Size, AI.getAlign(), false, &AI);
1031
1032 // Scalable vectors and structures that contain scalable vectors may
1033 // need a special StackID to distinguish them from other (fixed size)
1034 // stack objects.
1035 if (TySize.isScalable()) {
1036 auto StackID =
1037 MF->getSubtarget().getFrameLowering()->getStackIDForScalableVectors();
1038 MF->getFrameInfo().setStackID(FI, StackID);
1039 }
1040
1041 return FI;
1042}
1043
1044Align IRTranslatorImpl::getMemOpAlign(const Instruction &I) {
1045 if (const StoreInst *SI = dyn_cast<StoreInst>(&I))
1046 return SI->getAlign();
1047 if (const LoadInst *LI = dyn_cast<LoadInst>(&I))
1048 return LI->getAlign();
1049 if (const AtomicCmpXchgInst *AI = dyn_cast<AtomicCmpXchgInst>(&I))
1050 return AI->getAlign();
1051 if (const AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(&I))
1052 return AI->getAlign();
1053
1054 OptimizationRemarkMissed R("gisel-irtranslator", "", &I);
1055 R << "unable to translate memop: " << ore::NV("Opcode", &I);
1056 reportTranslationError(*MF, *ORE, R);
1057 return Align(1);
1058}
1059
1060MachineBasicBlock &IRTranslatorImpl::getMBB(const BasicBlock &BB) {
1061 MachineBasicBlock *MBB = FuncInfo.getMBB(&BB);
1062 assert(MBB && "BasicBlock was not encountered before");
1063 return *MBB;
1064}
1065
1066void IRTranslatorImpl::addMachineCFGPred(CFGEdge Edge,
1067 MachineBasicBlock *NewPred) {
1068 assert(NewPred && "new predecessor must be a real MachineBasicBlock");
1069 MachinePreds[Edge].push_back(NewPred);
1070}
1071
1072bool IRTranslatorImpl::translateBinaryOp(unsigned Opcode, const User &U,
1073 MachineIRBuilder &MIRBuilder) {
1074 if (!mayTranslateUserTypes(U))
1075 return false;
1076
1077 // Get or create a virtual register for each value.
1078 // Unless the value is a Constant => loadimm cst?
1079 // or inline constant each time?
1080 // Creation of a virtual register needs to have a size.
1081 Register Op0 = getOrCreateVReg(*U.getOperand(0));
1082 Register Op1 = getOrCreateVReg(*U.getOperand(1));
1083 Register Res = getOrCreateVReg(U);
1084 uint32_t Flags = 0;
1085 if (isa<Instruction>(U)) {
1086 const Instruction &I = cast<Instruction>(U);
1088 }
1089
1090 MIRBuilder.buildInstr(Opcode, {Res}, {Op0, Op1}, Flags);
1091 return true;
1092}
1093
1094bool IRTranslatorImpl::translateUnaryOp(unsigned Opcode, const User &U,
1095 MachineIRBuilder &MIRBuilder) {
1096 if (!mayTranslateUserTypes(U))
1097 return false;
1098
1099 Register Op0 = getOrCreateVReg(*U.getOperand(0));
1100 Register Res = getOrCreateVReg(U);
1101 uint32_t Flags = 0;
1102 if (isa<Instruction>(U)) {
1103 const Instruction &I = cast<Instruction>(U);
1105 }
1106 MIRBuilder.buildInstr(Opcode, {Res}, {Op0}, Flags);
1107 return true;
1108}
1109
1110bool IRTranslatorImpl::translateFNeg(const User &U,
1111 MachineIRBuilder &MIRBuilder) {
1112 return translateUnaryOp(TargetOpcode::G_FNEG, U, MIRBuilder);
1113}
1114
1115bool IRTranslatorImpl::translateCompare(const User &U,
1116 MachineIRBuilder &MIRBuilder) {
1117 if (!mayTranslateUserTypes(U))
1118 return false;
1119
1120 auto *CI = cast<CmpInst>(&U);
1121 Register Op0 = getOrCreateVReg(*U.getOperand(0));
1122 Register Op1 = getOrCreateVReg(*U.getOperand(1));
1123 Register Res = getOrCreateVReg(U);
1124 CmpInst::Predicate Pred = CI->getPredicate();
1126 if (CmpInst::isIntPredicate(Pred))
1127 MIRBuilder.buildICmp(Pred, Res, Op0, Op1, Flags);
1128 else if (Pred == CmpInst::FCMP_FALSE)
1129 MIRBuilder.buildCopy(
1130 Res, getOrCreateVReg(*Constant::getNullValue(U.getType())));
1131 else if (Pred == CmpInst::FCMP_TRUE)
1132 MIRBuilder.buildCopy(
1133 Res, getOrCreateVReg(*Constant::getAllOnesValue(U.getType())));
1134 else
1135 MIRBuilder.buildFCmp(Pred, Res, Op0, Op1, Flags);
1136
1137 return true;
1138}
1139
1140bool IRTranslatorImpl::translateRet(const User &U,
1141 MachineIRBuilder &MIRBuilder) {
1142 const ReturnInst &RI = cast<ReturnInst>(U);
1143 const Value *Ret = RI.getReturnValue();
1144 if (Ret && DL->getTypeStoreSize(Ret->getType()).isZero())
1145 Ret = nullptr;
1146
1147 ArrayRef<Register> VRegs;
1148 if (Ret)
1149 VRegs = getOrCreateVRegs(*Ret);
1150
1151 Register SwiftErrorVReg = 0;
1152 if (CLI->supportSwiftError() && SwiftError.getFunctionArg()) {
1153 SwiftErrorVReg = SwiftError.getOrCreateVRegUseAt(
1154 &RI, &MIRBuilder.getMBB(), SwiftError.getFunctionArg());
1155 }
1156
1157 // The target may mess up with the insertion point, but
1158 // this is not important as a return is the last instruction
1159 // of the block anyway.
1160 return CLI->lowerReturn(MIRBuilder, Ret, VRegs, FuncInfo, SwiftErrorVReg);
1161}
1162
1163void IRTranslatorImpl::emitBranchForMergedCondition(
1165 MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB,
1166 BranchProbability TProb, BranchProbability FProb, bool InvertCond) {
1167 // If the leaf of the tree is a comparison, merge the condition into
1168 // the caseblock.
1169 if (const CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
1170 CmpInst::Predicate Condition;
1171 if (const ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
1172 Condition = InvertCond ? IC->getInversePredicate() : IC->getPredicate();
1173 } else {
1174 const FCmpInst *FC = cast<FCmpInst>(Cond);
1175 Condition = InvertCond ? FC->getInversePredicate() : FC->getPredicate();
1176 }
1177
1178 SwitchCG::CaseBlock CB(Condition, false, BOp->getOperand(0),
1179 BOp->getOperand(1), nullptr, TBB, FBB, CurBB,
1180 CurBuilder->getDebugLoc(), TProb, FProb);
1181 SL->SwitchCases.push_back(CB);
1182 return;
1183 }
1184
1185 // Create a CaseBlock record representing this branch.
1187 SwitchCG::CaseBlock CB(
1188 Pred, false, Cond, ConstantInt::getTrue(MF->getFunction().getContext()),
1189 nullptr, TBB, FBB, CurBB, CurBuilder->getDebugLoc(), TProb, FProb);
1190 SL->SwitchCases.push_back(CB);
1191}
1192
1193static bool isValInBlock(const Value *V, const BasicBlock *BB) {
1194 if (const Instruction *I = dyn_cast<Instruction>(V))
1195 return I->getParent() == BB;
1196 return true;
1197}
1198
1199void IRTranslatorImpl::findMergedConditions(
1201 MachineBasicBlock *CurBB, MachineBasicBlock *SwitchBB,
1203 BranchProbability FProb, bool InvertCond) {
1204 using namespace PatternMatch;
1205 assert((Opc == Instruction::And || Opc == Instruction::Or) &&
1206 "Expected Opc to be AND/OR");
1207 // Skip over not part of the tree and remember to invert op and operands at
1208 // next level.
1209 Value *NotCond;
1210 if (match(Cond, m_OneUse(m_Not(m_Value(NotCond)))) &&
1211 isValInBlock(NotCond, CurBB->getBasicBlock())) {
1212 findMergedConditions(NotCond, TBB, FBB, CurBB, SwitchBB, Opc, TProb, FProb,
1213 !InvertCond);
1214 return;
1215 }
1216
1218 const Value *BOpOp0, *BOpOp1;
1219 // Compute the effective opcode for Cond, taking into account whether it needs
1220 // to be inverted, e.g.
1221 // and (not (or A, B)), C
1222 // gets lowered as
1223 // and (and (not A, not B), C)
1225 if (BOp) {
1226 BOpc = match(BOp, m_LogicalAnd(m_Value(BOpOp0), m_Value(BOpOp1)))
1227 ? Instruction::And
1228 : (match(BOp, m_LogicalOr(m_Value(BOpOp0), m_Value(BOpOp1)))
1229 ? Instruction::Or
1231 if (InvertCond) {
1232 if (BOpc == Instruction::And)
1233 BOpc = Instruction::Or;
1234 else if (BOpc == Instruction::Or)
1235 BOpc = Instruction::And;
1236 }
1237 }
1238
1239 // If this node is not part of the or/and tree, emit it as a branch.
1240 // Note that all nodes in the tree should have same opcode.
1241 bool BOpIsInOrAndTree = BOpc && BOpc == Opc && BOp->hasOneUse();
1242 if (!BOpIsInOrAndTree || BOp->getParent() != CurBB->getBasicBlock() ||
1243 !isValInBlock(BOpOp0, CurBB->getBasicBlock()) ||
1244 !isValInBlock(BOpOp1, CurBB->getBasicBlock())) {
1245 emitBranchForMergedCondition(Cond, TBB, FBB, CurBB, SwitchBB, TProb, FProb,
1246 InvertCond);
1247 return;
1248 }
1249
1250 // Create TmpBB after CurBB.
1251 MachineFunction::iterator BBI(CurBB);
1252 MachineBasicBlock *TmpBB =
1253 MF->CreateMachineBasicBlock(CurBB->getBasicBlock());
1254 CurBB->getParent()->insert(++BBI, TmpBB);
1255
1256 if (Opc == Instruction::Or) {
1257 // Codegen X | Y as:
1258 // BB1:
1259 // jmp_if_X TBB
1260 // jmp TmpBB
1261 // TmpBB:
1262 // jmp_if_Y TBB
1263 // jmp FBB
1264 //
1265
1266 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
1267 // The requirement is that
1268 // TrueProb for BB1 + (FalseProb for BB1 * TrueProb for TmpBB)
1269 // = TrueProb for original BB.
1270 // Assuming the original probabilities are A and B, one choice is to set
1271 // BB1's probabilities to A/2 and A/2+B, and set TmpBB's probabilities to
1272 // A/(1+B) and 2B/(1+B). This choice assumes that
1273 // TrueProb for BB1 == FalseProb for BB1 * TrueProb for TmpBB.
1274 // Another choice is to assume TrueProb for BB1 equals to TrueProb for
1275 // TmpBB, but the math is more complicated.
1276
1277 auto NewTrueProb = TProb / 2;
1278 auto NewFalseProb = TProb / 2 + FProb;
1279 // Emit the LHS condition.
1280 findMergedConditions(BOpOp0, TBB, TmpBB, CurBB, SwitchBB, Opc, NewTrueProb,
1281 NewFalseProb, InvertCond);
1282
1283 // Normalize A/2 and B to get A/(1+B) and 2B/(1+B).
1284 SmallVector<BranchProbability, 2> Probs{TProb / 2, FProb};
1286 // Emit the RHS condition into TmpBB.
1287 findMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
1288 Probs[1], InvertCond);
1289 } else {
1290 assert(Opc == Instruction::And && "Unknown merge op!");
1291 // Codegen X & Y as:
1292 // BB1:
1293 // jmp_if_X TmpBB
1294 // jmp FBB
1295 // TmpBB:
1296 // jmp_if_Y TBB
1297 // jmp FBB
1298 //
1299 // This requires creation of TmpBB after CurBB.
1300
1301 // We have flexibility in setting Prob for BB1 and Prob for TmpBB.
1302 // The requirement is that
1303 // FalseProb for BB1 + (TrueProb for BB1 * FalseProb for TmpBB)
1304 // = FalseProb for original BB.
1305 // Assuming the original probabilities are A and B, one choice is to set
1306 // BB1's probabilities to A+B/2 and B/2, and set TmpBB's probabilities to
1307 // 2A/(1+A) and B/(1+A). This choice assumes that FalseProb for BB1 ==
1308 // TrueProb for BB1 * FalseProb for TmpBB.
1309
1310 auto NewTrueProb = TProb + FProb / 2;
1311 auto NewFalseProb = FProb / 2;
1312 // Emit the LHS condition.
1313 findMergedConditions(BOpOp0, TmpBB, FBB, CurBB, SwitchBB, Opc, NewTrueProb,
1314 NewFalseProb, InvertCond);
1315
1316 // Normalize A and B/2 to get 2A/(1+A) and B/(1+A).
1317 SmallVector<BranchProbability, 2> Probs{TProb, FProb / 2};
1319 // Emit the RHS condition into TmpBB.
1320 findMergedConditions(BOpOp1, TBB, FBB, TmpBB, SwitchBB, Opc, Probs[0],
1321 Probs[1], InvertCond);
1322 }
1323}
1324
1325bool IRTranslatorImpl::shouldEmitAsBranches(
1326 const std::vector<SwitchCG::CaseBlock> &Cases) {
1327 // For multiple cases, it's better to emit as branches.
1328 if (Cases.size() != 2)
1329 return true;
1330
1331 // If this is two comparisons of the same values or'd or and'd together, they
1332 // will get folded into a single comparison, so don't emit two blocks.
1333 if ((Cases[0].CmpLHS == Cases[1].CmpLHS &&
1334 Cases[0].CmpRHS == Cases[1].CmpRHS) ||
1335 (Cases[0].CmpRHS == Cases[1].CmpLHS &&
1336 Cases[0].CmpLHS == Cases[1].CmpRHS)) {
1337 return false;
1338 }
1339
1340 // Handle: (X != null) | (Y != null) --> (X|Y) != 0
1341 // Handle: (X == null) & (Y == null) --> (X|Y) == 0
1342 if (Cases[0].CmpRHS == Cases[1].CmpRHS &&
1343 Cases[0].PredInfo.Pred == Cases[1].PredInfo.Pred &&
1344 isa<Constant>(Cases[0].CmpRHS) &&
1345 cast<Constant>(Cases[0].CmpRHS)->isNullValue()) {
1346 if (Cases[0].PredInfo.Pred == CmpInst::ICMP_EQ &&
1347 Cases[0].TrueBB == Cases[1].ThisBB)
1348 return false;
1349 if (Cases[0].PredInfo.Pred == CmpInst::ICMP_NE &&
1350 Cases[0].FalseBB == Cases[1].ThisBB)
1351 return false;
1352 }
1353
1354 return true;
1355}
1356
1357bool IRTranslatorImpl::translateUncondBr(const User &U,
1358 MachineIRBuilder &MIRBuilder) {
1359 const UncondBrInst &BrInst = cast<UncondBrInst>(U);
1360 auto &CurMBB = MIRBuilder.getMBB();
1361 auto *Succ0MBB = &getMBB(*BrInst.getSuccessor(0));
1362
1363 // If the unconditional target is the layout successor, fallthrough.
1364 if (OptLevel == CodeGenOptLevel::None || !CurMBB.isLayoutSuccessor(Succ0MBB))
1365 MIRBuilder.buildBr(*Succ0MBB);
1366
1367 // Link successors.
1368 for (const BasicBlock *Succ : successors(&BrInst))
1369 CurMBB.addSuccessor(&getMBB(*Succ));
1370 return true;
1371}
1372
1373bool IRTranslatorImpl::translateCondBr(const User &U,
1374 MachineIRBuilder &MIRBuilder) {
1375 const CondBrInst &BrInst = cast<CondBrInst>(U);
1376 auto &CurMBB = MIRBuilder.getMBB();
1377 auto *Succ0MBB = &getMBB(*BrInst.getSuccessor(0));
1378
1379 // If this condition is one of the special cases we handle, do special stuff
1380 // now.
1381 const Value *CondVal = BrInst.getCondition();
1382 MachineBasicBlock *Succ1MBB = &getMBB(*BrInst.getSuccessor(1));
1383
1384 // If this is a series of conditions that are or'd or and'd together, emit
1385 // this as a sequence of branches instead of setcc's with and/or operations.
1386 // As long as jumps are not expensive (exceptions for multi-use logic ops,
1387 // unpredictable branches, and vector extracts because those jumps are likely
1388 // expensive for any target), this should improve performance.
1389 // For example, instead of something like:
1390 // cmp A, B
1391 // C = seteq
1392 // cmp D, E
1393 // F = setle
1394 // or C, F
1395 // jnz foo
1396 // Emit:
1397 // cmp A, B
1398 // je foo
1399 // cmp D, E
1400 // jle foo
1401 using namespace PatternMatch;
1402 const Instruction *CondI = dyn_cast<Instruction>(CondVal);
1403 if (!TLI->isJumpExpensive() && CondI && CondI->hasOneUse() &&
1404 !BrInst.hasMetadata(LLVMContext::MD_unpredictable)) {
1406 Value *Vec;
1407 const Value *BOp0, *BOp1;
1408 if (match(CondI, m_LogicalAnd(m_Value(BOp0), m_Value(BOp1))))
1409 Opcode = Instruction::And;
1410 else if (match(CondI, m_LogicalOr(m_Value(BOp0), m_Value(BOp1))))
1411 Opcode = Instruction::Or;
1412
1413 if (Opcode && !(match(BOp0, m_ExtractElt(m_Value(Vec), m_Value())) &&
1414 match(BOp1, m_ExtractElt(m_Specific(Vec), m_Value())))) {
1415 findMergedConditions(CondI, Succ0MBB, Succ1MBB, &CurMBB, &CurMBB, Opcode,
1416 getEdgeProbability(&CurMBB, Succ0MBB),
1417 getEdgeProbability(&CurMBB, Succ1MBB),
1418 /*InvertCond=*/false);
1419 assert(SL->SwitchCases[0].ThisBB == &CurMBB && "Unexpected lowering!");
1420
1421 // Allow some cases to be rejected.
1422 if (shouldEmitAsBranches(SL->SwitchCases)) {
1423 // Emit the branch for this block.
1424 emitSwitchCase(SL->SwitchCases[0], &CurMBB, *CurBuilder);
1425 SL->SwitchCases.erase(SL->SwitchCases.begin());
1426 return true;
1427 }
1428
1429 // Okay, we decided not to do this, remove any inserted MBB's and clear
1430 // SwitchCases.
1431 for (unsigned I = 1, E = SL->SwitchCases.size(); I != E; ++I)
1432 MF->erase(SL->SwitchCases[I].ThisBB);
1433
1434 SL->SwitchCases.clear();
1435 }
1436 }
1437
1438 // Create a CaseBlock record representing this branch.
1439 SwitchCG::CaseBlock CB(CmpInst::ICMP_EQ, false, CondVal,
1440 ConstantInt::getTrue(MF->getFunction().getContext()),
1441 nullptr, Succ0MBB, Succ1MBB, &CurMBB,
1442 CurBuilder->getDebugLoc());
1443
1444 // Use emitSwitchCase to actually insert the fast branch sequence for this
1445 // cond branch.
1446 emitSwitchCase(CB, &CurMBB, *CurBuilder);
1447 return true;
1448}
1449
1450void IRTranslatorImpl::addSuccessorWithProb(MachineBasicBlock *Src,
1451 MachineBasicBlock *Dst,
1452 BranchProbability Prob) {
1453 if (!FuncInfo.BPI) {
1454 Src->addSuccessorWithoutProb(Dst);
1455 return;
1456 }
1457 if (Prob.isUnknown())
1458 Prob = getEdgeProbability(Src, Dst);
1459 Src->addSuccessor(Dst, Prob);
1460}
1461
1463IRTranslatorImpl::getEdgeProbability(const MachineBasicBlock *Src,
1464 const MachineBasicBlock *Dst) const {
1465 const BasicBlock *SrcBB = Src->getBasicBlock();
1466 const BasicBlock *DstBB = Dst->getBasicBlock();
1467 if (!FuncInfo.BPI) {
1468 // If BPI is not available, set the default probability as 1 / N, where N is
1469 // the number of successors.
1470 auto SuccSize = std::max<uint32_t>(succ_size(SrcBB), 1);
1471 return BranchProbability(1, SuccSize);
1472 }
1473 return FuncInfo.BPI->getEdgeProbability(SrcBB, DstBB);
1474}
1475
1476bool IRTranslatorImpl::translateSwitch(const User &U, MachineIRBuilder &MIB) {
1477 using namespace SwitchCG;
1478 // Extract cases from the switch.
1479 const SwitchInst &SI = cast<SwitchInst>(U);
1480 BranchProbabilityInfo *BPI = FuncInfo.BPI;
1481 CaseClusterVector Clusters;
1482 Clusters.reserve(SI.getNumCases());
1483 for (const auto &I : SI.cases()) {
1484 MachineBasicBlock *Succ = &getMBB(*I.getCaseSuccessor());
1485 assert(Succ && "Could not find successor mbb in mapping");
1486 const ConstantInt *CaseVal = I.getCaseValue();
1487 BranchProbability Prob =
1488 BPI ? BPI->getEdgeProbability(SI.getParent(), I.getSuccessorIndex())
1489 : BranchProbability(1, SI.getNumCases() + 1);
1490 Clusters.push_back(CaseCluster::range(CaseVal, CaseVal, Succ, Prob));
1491 }
1492
1493 MachineBasicBlock *DefaultMBB = &getMBB(*SI.getDefaultDest());
1494
1495 // Cluster adjacent cases with the same destination. We do this at all
1496 // optimization levels because it's cheap to do and will make codegen faster
1497 // if there are many clusters.
1498 sortAndRangeify(Clusters);
1499
1500 MachineBasicBlock *SwitchMBB = &getMBB(*SI.getParent());
1501
1502 // If there is only the default destination, jump there directly.
1503 if (Clusters.empty()) {
1504 SwitchMBB->addSuccessor(DefaultMBB);
1505 if (DefaultMBB != SwitchMBB->getNextNode())
1506 MIB.buildBr(*DefaultMBB);
1507 return true;
1508 }
1509
1510 SL->findJumpTables(Clusters, &SI, std::nullopt, DefaultMBB, nullptr, nullptr);
1511 SL->findBitTestClusters(Clusters, &SI);
1512
1513 LLVM_DEBUG({
1514 dbgs() << "Case clusters: ";
1515 for (const CaseCluster &C : Clusters) {
1516 if (C.Kind == CC_JumpTable)
1517 dbgs() << "JT:";
1518 if (C.Kind == CC_BitTests)
1519 dbgs() << "BT:";
1520
1521 C.Low->getValue().print(dbgs(), true);
1522 if (C.Low != C.High) {
1523 dbgs() << '-';
1524 C.High->getValue().print(dbgs(), true);
1525 }
1526 dbgs() << ' ';
1527 }
1528 dbgs() << '\n';
1529 });
1530
1531 assert(!Clusters.empty());
1532 SwitchWorkList WorkList;
1533 CaseClusterIt First = Clusters.begin();
1534 CaseClusterIt Last = Clusters.end() - 1;
1535 auto DefaultProb = getEdgeProbability(SwitchMBB, DefaultMBB);
1536 WorkList.push_back({SwitchMBB, First, Last, nullptr, nullptr, DefaultProb});
1537
1538 while (!WorkList.empty()) {
1539 SwitchWorkListItem W = WorkList.pop_back_val();
1540
1541 unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
1542 // For optimized builds, lower large range as a balanced binary tree.
1543 if (NumClusters > 3 &&
1544 MF->getTarget().getOptLevel() != CodeGenOptLevel::None &&
1545 !DefaultMBB->getParent()->getFunction().hasMinSize()) {
1546 splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB, MIB);
1547 continue;
1548 }
1549
1550 if (!lowerSwitchWorkItem(W, SI.getCondition(), SwitchMBB, DefaultMBB, MIB))
1551 return false;
1552 }
1553 return true;
1554}
1555
1556void IRTranslatorImpl::splitWorkItem(SwitchCG::SwitchWorkList &WorkList,
1558 Value *Cond, MachineBasicBlock *SwitchMBB,
1559 MachineIRBuilder &MIB) {
1560 using namespace SwitchCG;
1561 assert(W.FirstCluster->Low->getValue().slt(W.LastCluster->Low->getValue()) &&
1562 "Clusters not sorted?");
1563 assert(W.LastCluster - W.FirstCluster + 1 >= 2 && "Too small to split!");
1564
1565 auto [LastLeft, FirstRight, LeftProb, RightProb] =
1566 SL->computeSplitWorkItemInfo(W);
1567
1568 // Use the first element on the right as pivot since we will make less-than
1569 // comparisons against it.
1570 CaseClusterIt PivotCluster = FirstRight;
1571 assert(PivotCluster > W.FirstCluster);
1572 assert(PivotCluster <= W.LastCluster);
1573
1574 CaseClusterIt FirstLeft = W.FirstCluster;
1575 CaseClusterIt LastRight = W.LastCluster;
1576
1577 const ConstantInt *Pivot = PivotCluster->Low;
1578
1579 // New blocks will be inserted immediately after the current one.
1581 ++BBI;
1582
1583 // We will branch to the LHS if Value < Pivot. If LHS is a single cluster,
1584 // we can branch to its destination directly if it's squeezed exactly in
1585 // between the known lower bound and Pivot - 1.
1586 MachineBasicBlock *LeftMBB;
1587 if (FirstLeft == LastLeft && FirstLeft->Kind == CC_Range &&
1588 FirstLeft->Low == W.GE &&
1589 (FirstLeft->High->getValue() + 1LL) == Pivot->getValue()) {
1590 LeftMBB = FirstLeft->MBB;
1591 } else {
1592 LeftMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
1593 FuncInfo.MF->insert(BBI, LeftMBB);
1594 WorkList.push_back(
1595 {LeftMBB, FirstLeft, LastLeft, W.GE, Pivot, W.DefaultProb / 2});
1596 }
1597
1598 // Similarly, we will branch to the RHS if Value >= Pivot. If RHS is a
1599 // single cluster, RHS.Low == Pivot, and we can branch to its destination
1600 // directly if RHS.High equals the current upper bound.
1601 MachineBasicBlock *RightMBB;
1602 if (FirstRight == LastRight && FirstRight->Kind == CC_Range && W.LT &&
1603 (FirstRight->High->getValue() + 1ULL) == W.LT->getValue()) {
1604 RightMBB = FirstRight->MBB;
1605 } else {
1606 RightMBB = FuncInfo.MF->CreateMachineBasicBlock(W.MBB->getBasicBlock());
1607 FuncInfo.MF->insert(BBI, RightMBB);
1608 WorkList.push_back(
1609 {RightMBB, FirstRight, LastRight, Pivot, W.LT, W.DefaultProb / 2});
1610 }
1611
1612 // Create the CaseBlock record that will be used to lower the branch.
1613 CaseBlock CB(ICmpInst::Predicate::ICMP_SLT, false, Cond, Pivot, nullptr,
1614 LeftMBB, RightMBB, W.MBB, MIB.getDebugLoc(), LeftProb,
1615 RightProb);
1616
1617 if (W.MBB == SwitchMBB)
1618 emitSwitchCase(CB, SwitchMBB, MIB);
1619 else
1620 SL->SwitchCases.push_back(CB);
1621}
1622
1623void IRTranslatorImpl::emitJumpTable(SwitchCG::JumpTable &JT,
1625 // Emit the code for the jump table
1626 assert(JT.Reg && "Should lower JT Header first!");
1627 MachineIRBuilder MIB(*MBB->getParent());
1628 MIB.setMBB(*MBB);
1629 MIB.setDebugLoc(CurBuilder->getDebugLoc());
1630
1631 Type *PtrIRTy = PointerType::getUnqual(MF->getFunction().getContext());
1632 const LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
1633
1634 auto Table = MIB.buildJumpTable(PtrTy, JT.JTI);
1635 MIB.buildBrJT(Table.getReg(0), JT.JTI, JT.Reg);
1636}
1637
1638bool IRTranslatorImpl::emitJumpTableHeader(SwitchCG::JumpTable &JT,
1640 MachineBasicBlock *HeaderBB) {
1641 MachineIRBuilder MIB(*HeaderBB->getParent());
1642 MIB.setMBB(*HeaderBB);
1643 MIB.setDebugLoc(CurBuilder->getDebugLoc());
1644
1645 const Value &SValue = *JTH.SValue;
1646 // Subtract the lowest switch case value from the value being switched on.
1647 const LLT SwitchTy = getLLTForType(*SValue.getType(), *DL);
1648 Register SwitchOpReg = getOrCreateVReg(SValue);
1649 auto FirstCst = MIB.buildConstant(SwitchTy, JTH.First);
1650 auto Sub = MIB.buildSub({SwitchTy}, SwitchOpReg, FirstCst);
1651
1652 // This value may be smaller or larger than the target's pointer type, and
1653 // therefore require extension or truncating.
1654 auto *PtrIRTy = PointerType::getUnqual(SValue.getContext());
1655 const LLT PtrScalarTy = LLT::integer(DL->getTypeSizeInBits(PtrIRTy));
1656 auto Index = MIB.buildZExtOrTrunc(PtrScalarTy, Sub);
1657
1658 JT.Reg = Index.getReg(0);
1659
1660 if (JTH.FallthroughUnreachable) {
1661 if (JT.MBB != HeaderBB->getNextNode())
1662 MIB.buildBr(*JT.MBB);
1663 return true;
1664 }
1665
1666 // Emit the range check for the jump table, and branch to the default block
1667 // for the switch statement if the value being switched on exceeds the
1668 // largest case in the switch.
1669 auto Cst = getOrCreateVReg(
1670 *ConstantInt::get(SValue.getType(), JTH.Last - JTH.First));
1671 auto Cmp = MIB.buildICmp(CmpInst::ICMP_UGT, LLT::integer(1), Sub, Cst);
1672
1673 auto BrCond = MIB.buildBrCond(Cmp.getReg(0), *JT.Default);
1674
1675 // Avoid emitting unnecessary branches to the next block.
1676 if (JT.MBB != HeaderBB->getNextNode())
1677 BrCond = MIB.buildBr(*JT.MBB);
1678 return true;
1679}
1680
1681void IRTranslatorImpl::emitSwitchCase(SwitchCG::CaseBlock &CB,
1682 MachineBasicBlock *SwitchBB,
1683 MachineIRBuilder &MIB) {
1684 Register CondLHS = getOrCreateVReg(*CB.CmpLHS);
1685 Register Cond;
1686 DebugLoc OldDbgLoc = MIB.getDebugLoc();
1687 MIB.setDebugLoc(CB.DbgLoc);
1688 MIB.setMBB(*CB.ThisBB);
1689
1690 if (CB.PredInfo.NoCmp) {
1691 // Branch or fall through to TrueBB.
1692 addSuccessorWithProb(CB.ThisBB, CB.TrueBB, CB.TrueProb);
1693 addMachineCFGPred({SwitchBB->getBasicBlock(), CB.TrueBB->getBasicBlock()},
1694 CB.ThisBB);
1696 if (CB.TrueBB != CB.ThisBB->getNextNode())
1697 MIB.buildBr(*CB.TrueBB);
1698 MIB.setDebugLoc(OldDbgLoc);
1699 return;
1700 }
1701
1702 const LLT i1Ty = LLT::integer(1);
1703 // Build the compare.
1704 if (!CB.CmpMHS) {
1705 const auto *CI = dyn_cast<ConstantInt>(CB.CmpRHS);
1706 // For conditional branch lowering, we might try to do something silly like
1707 // emit an G_ICMP to compare an existing G_ICMP i1 result with true. If so,
1708 // just re-use the existing condition vreg.
1709 if (MRI->getType(CondLHS).getSizeInBits() == 1 && CI && CI->isOne() &&
1711 Cond = CondLHS;
1712 } else {
1713 Register CondRHS = getOrCreateVReg(*CB.CmpRHS);
1715 Cond =
1716 MIB.buildFCmp(CB.PredInfo.Pred, i1Ty, CondLHS, CondRHS).getReg(0);
1717 else
1718 Cond =
1719 MIB.buildICmp(CB.PredInfo.Pred, i1Ty, CondLHS, CondRHS).getReg(0);
1720 }
1721 } else {
1723 "Can only handle SLE ranges");
1724
1725 const APInt& Low = cast<ConstantInt>(CB.CmpLHS)->getValue();
1726 const APInt& High = cast<ConstantInt>(CB.CmpRHS)->getValue();
1727
1728 Register CmpOpReg = getOrCreateVReg(*CB.CmpMHS);
1729 if (cast<ConstantInt>(CB.CmpLHS)->isMinValue(true)) {
1730 Register CondRHS = getOrCreateVReg(*CB.CmpRHS);
1731 Cond =
1732 MIB.buildICmp(CmpInst::ICMP_SLE, i1Ty, CmpOpReg, CondRHS).getReg(0);
1733 } else {
1734 const LLT CmpTy = MRI->getType(CmpOpReg);
1735 auto Sub = MIB.buildSub({CmpTy}, CmpOpReg, CondLHS);
1736 auto Diff = MIB.buildConstant(CmpTy, High - Low);
1737 Cond = MIB.buildICmp(CmpInst::ICMP_ULE, i1Ty, Sub, Diff).getReg(0);
1738 }
1739 }
1740
1741 // Update successor info
1742 addSuccessorWithProb(CB.ThisBB, CB.TrueBB, CB.TrueProb);
1743
1744 addMachineCFGPred({SwitchBB->getBasicBlock(), CB.TrueBB->getBasicBlock()},
1745 CB.ThisBB);
1746
1747 // TrueBB and FalseBB are always different unless the incoming IR is
1748 // degenerate. This only happens when running llc on weird IR.
1749 if (CB.TrueBB != CB.FalseBB)
1750 addSuccessorWithProb(CB.ThisBB, CB.FalseBB, CB.FalseProb);
1752
1753 addMachineCFGPred({SwitchBB->getBasicBlock(), CB.FalseBB->getBasicBlock()},
1754 CB.ThisBB);
1755
1756 MIB.buildBrCond(Cond, *CB.TrueBB);
1757 MIB.buildBr(*CB.FalseBB);
1758 MIB.setDebugLoc(OldDbgLoc);
1759}
1760
1761bool IRTranslatorImpl::lowerJumpTableWorkItem(
1763 MachineBasicBlock *CurMBB, MachineBasicBlock *DefaultMBB,
1766 MachineBasicBlock *Fallthrough, bool FallthroughUnreachable) {
1767 using namespace SwitchCG;
1768 MachineFunction *CurMF = SwitchMBB->getParent();
1769 // FIXME: Optimize away range check based on pivot comparisons.
1770 JumpTableHeader *JTH = &SL->JTCases[I->JTCasesIndex].first;
1771 SwitchCG::JumpTable *JT = &SL->JTCases[I->JTCasesIndex].second;
1772 BranchProbability DefaultProb = W.DefaultProb;
1773
1774 // The jump block hasn't been inserted yet; insert it here.
1775 MachineBasicBlock *JumpMBB = JT->MBB;
1776 CurMF->insert(BBI, JumpMBB);
1777
1778 // Since the jump table block is separate from the switch block, we need
1779 // to keep track of it as a machine predecessor to the default block,
1780 // otherwise we lose the phi edges.
1781 addMachineCFGPred({SwitchMBB->getBasicBlock(), DefaultMBB->getBasicBlock()},
1782 CurMBB);
1783 addMachineCFGPred({SwitchMBB->getBasicBlock(), DefaultMBB->getBasicBlock()},
1784 JumpMBB);
1785
1786 auto JumpProb = I->Prob;
1787 auto FallthroughProb = UnhandledProbs;
1788
1789 // If the default statement is a target of the jump table, we evenly
1790 // distribute the default probability to successors of CurMBB. Also
1791 // update the probability on the edge from JumpMBB to Fallthrough.
1792 for (MachineBasicBlock::succ_iterator SI = JumpMBB->succ_begin(),
1793 SE = JumpMBB->succ_end();
1794 SI != SE; ++SI) {
1795 if (*SI == DefaultMBB) {
1796 JumpProb += DefaultProb / 2;
1797 FallthroughProb -= DefaultProb / 2;
1798 JumpMBB->setSuccProbability(SI, DefaultProb / 2);
1799 JumpMBB->normalizeSuccProbs();
1800 } else {
1801 // Also record edges from the jump table block to it's successors.
1802 addMachineCFGPred({SwitchMBB->getBasicBlock(), (*SI)->getBasicBlock()},
1803 JumpMBB);
1804 }
1805 }
1806
1807 if (FallthroughUnreachable)
1808 JTH->FallthroughUnreachable = true;
1809
1810 if (!JTH->FallthroughUnreachable)
1811 addSuccessorWithProb(CurMBB, Fallthrough, FallthroughProb);
1812 addSuccessorWithProb(CurMBB, JumpMBB, JumpProb);
1813 CurMBB->normalizeSuccProbs();
1814
1815 // The jump table header will be inserted in our current block, do the
1816 // range check, and fall through to our fallthrough block.
1817 JTH->HeaderBB = CurMBB;
1818 JT->Default = Fallthrough; // FIXME: Move Default to JumpTableHeader.
1819
1820 // If we're in the right place, emit the jump table header right now.
1821 if (CurMBB == SwitchMBB) {
1822 if (!emitJumpTableHeader(*JT, *JTH, CurMBB))
1823 return false;
1824 JTH->Emitted = true;
1825 }
1826 return true;
1827}
1828bool IRTranslatorImpl::lowerSwitchRangeWorkItem(
1830 bool FallthroughUnreachable, BranchProbability UnhandledProbs,
1831 MachineBasicBlock *CurMBB, MachineIRBuilder &MIB,
1832 MachineBasicBlock *SwitchMBB) {
1833 using namespace SwitchCG;
1834 const Value *RHS, *LHS, *MHS;
1835 CmpInst::Predicate Pred;
1836 if (I->Low == I->High) {
1837 // Check Cond == I->Low.
1838 Pred = CmpInst::ICMP_EQ;
1839 LHS = Cond;
1840 RHS = I->Low;
1841 MHS = nullptr;
1842 } else {
1843 // Check I->Low <= Cond <= I->High.
1844 Pred = CmpInst::ICMP_SLE;
1845 LHS = I->Low;
1846 MHS = Cond;
1847 RHS = I->High;
1848 }
1849
1850 // If Fallthrough is unreachable, fold away the comparison.
1851 // The false probability is the sum of all unhandled cases.
1852 CaseBlock CB(Pred, FallthroughUnreachable, LHS, RHS, MHS, I->MBB, Fallthrough,
1853 CurMBB, MIB.getDebugLoc(), I->Prob, UnhandledProbs);
1854
1855 emitSwitchCase(CB, SwitchMBB, MIB);
1856 return true;
1857}
1858
1859void IRTranslatorImpl::emitBitTestHeader(SwitchCG::BitTestBlock &B,
1860 MachineBasicBlock *SwitchBB) {
1861 MachineIRBuilder &MIB = *CurBuilder;
1862 MIB.setMBB(*SwitchBB);
1863
1864 // Subtract the minimum value.
1865 Register SwitchOpReg = getOrCreateVReg(*B.SValue);
1866
1867 LLT SwitchOpTy = MRI->getType(SwitchOpReg);
1868 Register MinValReg = MIB.buildConstant(SwitchOpTy, B.First).getReg(0);
1869 auto RangeSub = MIB.buildSub(SwitchOpTy, SwitchOpReg, MinValReg);
1870
1871 Type *PtrIRTy = PointerType::getUnqual(MF->getFunction().getContext());
1872 const LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
1873
1874 LLT MaskTy = SwitchOpTy;
1875 if (MaskTy.getSizeInBits() > PtrTy.getSizeInBits() ||
1877 MaskTy = LLT::integer(PtrTy.getSizeInBits());
1878 else {
1879 // Ensure that the type will fit the mask value.
1880 for (const SwitchCG::BitTestCase &Case : B.Cases) {
1881 if (!isUIntN(SwitchOpTy.getSizeInBits(), Case.Mask)) {
1882 // Switch table case range are encoded into series of masks.
1883 // Just use pointer type, it's guaranteed to fit.
1884 MaskTy = LLT::integer(PtrTy.getSizeInBits());
1885 break;
1886 }
1887 }
1888 }
1889 Register SubReg = RangeSub.getReg(0);
1890 if (SwitchOpTy != MaskTy)
1891 SubReg = MIB.buildZExtOrTrunc(MaskTy, SubReg).getReg(0);
1892
1893 B.RegVT = getMVTForLLT(MaskTy);
1894 B.Reg = SubReg;
1895
1896 MachineBasicBlock *MBB = B.Cases[0].ThisBB;
1897
1898 if (!B.FallthroughUnreachable)
1899 addSuccessorWithProb(SwitchBB, B.Default, B.DefaultProb);
1900 addSuccessorWithProb(SwitchBB, MBB, B.Prob);
1901
1902 SwitchBB->normalizeSuccProbs();
1903
1904 if (!B.FallthroughUnreachable) {
1905 // Conditional branch to the default block.
1906 auto RangeCst = MIB.buildConstant(SwitchOpTy, B.Range);
1907 auto RangeCmp = MIB.buildICmp(CmpInst::Predicate::ICMP_UGT, LLT::integer(1),
1908 RangeSub, RangeCst);
1909 MIB.buildBrCond(RangeCmp, *B.Default);
1910 }
1911
1912 // Avoid emitting unnecessary branches to the next block.
1913 if (MBB != SwitchBB->getNextNode())
1914 MIB.buildBr(*MBB);
1915}
1916
1917void IRTranslatorImpl::emitBitTestCase(SwitchCG::BitTestBlock &BB,
1918 MachineBasicBlock *NextMBB,
1919 BranchProbability BranchProbToNext,
1921 MachineBasicBlock *SwitchBB) {
1922 MachineIRBuilder &MIB = *CurBuilder;
1923 MIB.setMBB(*SwitchBB);
1924
1925 LLT SwitchTy = getLLTForMVT(BB.RegVT);
1926 Register Cmp;
1927 unsigned PopCount = llvm::popcount(B.Mask);
1928 if (PopCount == 1) {
1929 // Testing for a single bit; just compare the shift count with what it
1930 // would need to be to shift a 1 bit in that position.
1931 auto MaskTrailingZeros =
1932 MIB.buildConstant(SwitchTy, llvm::countr_zero(B.Mask));
1934 MaskTrailingZeros)
1935 .getReg(0);
1936 } else if (PopCount == BB.Range) {
1937 // There is only one zero bit in the range, test for it directly.
1938 auto MaskTrailingOnes =
1939 MIB.buildConstant(SwitchTy, llvm::countr_one(B.Mask));
1940 Cmp =
1941 MIB.buildICmp(CmpInst::ICMP_NE, LLT::integer(1), Reg, MaskTrailingOnes)
1942 .getReg(0);
1943 } else {
1944 // Make desired shift.
1945 auto CstOne = MIB.buildConstant(SwitchTy, 1);
1946 auto SwitchVal = MIB.buildShl(SwitchTy, CstOne, Reg);
1947
1948 // Emit bit tests and jumps.
1949 auto CstMask = MIB.buildConstant(SwitchTy, B.Mask);
1950 auto AndOp = MIB.buildAnd(SwitchTy, SwitchVal, CstMask);
1951 auto CstZero = MIB.buildConstant(SwitchTy, 0);
1952 Cmp = MIB.buildICmp(CmpInst::ICMP_NE, LLT::integer(1), AndOp, CstZero)
1953 .getReg(0);
1954 }
1955
1956 // The branch probability from SwitchBB to B.TargetBB is B.ExtraProb.
1957 addSuccessorWithProb(SwitchBB, B.TargetBB, B.ExtraProb);
1958 // The branch probability from SwitchBB to NextMBB is BranchProbToNext.
1959 addSuccessorWithProb(SwitchBB, NextMBB, BranchProbToNext);
1960 // It is not guaranteed that the sum of B.ExtraProb and BranchProbToNext is
1961 // one as they are relative probabilities (and thus work more like weights),
1962 // and hence we need to normalize them to let the sum of them become one.
1963 SwitchBB->normalizeSuccProbs();
1964
1965 // Record the fact that the IR edge from the header to the bit test target
1966 // will go through our new block. Neeeded for PHIs to have nodes added.
1967 addMachineCFGPred({BB.Parent->getBasicBlock(), B.TargetBB->getBasicBlock()},
1968 SwitchBB);
1969
1970 MIB.buildBrCond(Cmp, *B.TargetBB);
1971
1972 // Avoid emitting unnecessary branches to the next block.
1973 if (NextMBB != SwitchBB->getNextNode())
1974 MIB.buildBr(*NextMBB);
1975}
1976
1977bool IRTranslatorImpl::lowerBitTestWorkItem(
1979 MachineBasicBlock *CurMBB, MachineBasicBlock *DefaultMBB,
1981 BranchProbability DefaultProb, BranchProbability UnhandledProbs,
1983 bool FallthroughUnreachable) {
1984 using namespace SwitchCG;
1985 MachineFunction *CurMF = SwitchMBB->getParent();
1986 // FIXME: Optimize away range check based on pivot comparisons.
1987 BitTestBlock *BTB = &SL->BitTestCases[I->BTCasesIndex];
1988 // The bit test blocks haven't been inserted yet; insert them here.
1989 for (BitTestCase &BTC : BTB->Cases)
1990 CurMF->insert(BBI, BTC.ThisBB);
1991
1992 // Fill in fields of the BitTestBlock.
1993 BTB->Parent = CurMBB;
1994 BTB->Default = Fallthrough;
1995
1996 BTB->DefaultProb = UnhandledProbs;
1997 // If the cases in bit test don't form a contiguous range, we evenly
1998 // distribute the probability on the edge to Fallthrough to two
1999 // successors of CurMBB.
2000 if (!BTB->ContiguousRange) {
2001 BTB->Prob += DefaultProb / 2;
2002 BTB->DefaultProb -= DefaultProb / 2;
2003 }
2004
2005 if (FallthroughUnreachable)
2006 BTB->FallthroughUnreachable = true;
2007
2008 // If we're in the right place, emit the bit test header right now.
2009 if (CurMBB == SwitchMBB) {
2010 emitBitTestHeader(*BTB, SwitchMBB);
2011 BTB->Emitted = true;
2012 }
2013 return true;
2014}
2015
2016bool IRTranslatorImpl::lowerSwitchWorkItem(SwitchCG::SwitchWorkListItem W,
2017 Value *Cond,
2018 MachineBasicBlock *SwitchMBB,
2019 MachineBasicBlock *DefaultMBB,
2020 MachineIRBuilder &MIB) {
2021 using namespace SwitchCG;
2022 MachineFunction *CurMF = FuncInfo.MF;
2023 MachineBasicBlock *NextMBB = nullptr;
2025 if (++BBI != FuncInfo.MF->end())
2026 NextMBB = &*BBI;
2027
2028 if (EnableOpts) {
2029 // Here, we order cases by probability so the most likely case will be
2030 // checked first. However, two clusters can have the same probability in
2031 // which case their relative ordering is non-deterministic. So we use Low
2032 // as a tie-breaker as clusters are guaranteed to never overlap.
2033 llvm::sort(W.FirstCluster, W.LastCluster + 1,
2034 [](const CaseCluster &a, const CaseCluster &b) {
2035 return a.Prob != b.Prob
2036 ? a.Prob > b.Prob
2037 : a.Low->getValue().slt(b.Low->getValue());
2038 });
2039
2040 // Rearrange the case blocks so that the last one falls through if possible
2041 // without changing the order of probabilities.
2042 for (CaseClusterIt I = W.LastCluster; I > W.FirstCluster;) {
2043 --I;
2044 if (I->Prob > W.LastCluster->Prob)
2045 break;
2046 if (I->Kind == CC_Range && I->MBB == NextMBB) {
2047 std::swap(*I, *W.LastCluster);
2048 break;
2049 }
2050 }
2051 }
2052
2053 // Compute total probability.
2054 BranchProbability DefaultProb = W.DefaultProb;
2055 BranchProbability UnhandledProbs = DefaultProb;
2056 for (CaseClusterIt I = W.FirstCluster; I <= W.LastCluster; ++I)
2057 UnhandledProbs += I->Prob;
2058
2059 MachineBasicBlock *CurMBB = W.MBB;
2060 for (CaseClusterIt I = W.FirstCluster, E = W.LastCluster; I <= E; ++I) {
2061 bool FallthroughUnreachable = false;
2062 MachineBasicBlock *Fallthrough;
2063 if (I == W.LastCluster) {
2064 // For the last cluster, fall through to the default destination.
2065 Fallthrough = DefaultMBB;
2066 FallthroughUnreachable = isa<UnreachableInst>(
2067 DefaultMBB->getBasicBlock()->getFirstNonPHIOrDbg());
2068 } else {
2069 Fallthrough = CurMF->CreateMachineBasicBlock(CurMBB->getBasicBlock());
2070 CurMF->insert(BBI, Fallthrough);
2071 }
2072 UnhandledProbs -= I->Prob;
2073
2074 switch (I->Kind) {
2075 case CC_BitTests: {
2076 if (!lowerBitTestWorkItem(W, SwitchMBB, CurMBB, DefaultMBB, MIB, BBI,
2077 DefaultProb, UnhandledProbs, I, Fallthrough,
2078 FallthroughUnreachable)) {
2079 LLVM_DEBUG(dbgs() << "Failed to lower bit test for switch");
2080 return false;
2081 }
2082 break;
2083 }
2084
2085 case CC_JumpTable: {
2086 if (!lowerJumpTableWorkItem(W, SwitchMBB, CurMBB, DefaultMBB, MIB, BBI,
2087 UnhandledProbs, I, Fallthrough,
2088 FallthroughUnreachable)) {
2089 LLVM_DEBUG(dbgs() << "Failed to lower jump table");
2090 return false;
2091 }
2092 break;
2093 }
2094 case CC_Range: {
2095 if (!lowerSwitchRangeWorkItem(I, Cond, Fallthrough,
2096 FallthroughUnreachable, UnhandledProbs,
2097 CurMBB, MIB, SwitchMBB)) {
2098 LLVM_DEBUG(dbgs() << "Failed to lower switch range");
2099 return false;
2100 }
2101 break;
2102 }
2103 }
2104 CurMBB = Fallthrough;
2105 }
2106
2107 return true;
2108}
2109
2110bool IRTranslatorImpl::translateIndirectBr(const User &U,
2111 MachineIRBuilder &MIRBuilder) {
2112 const IndirectBrInst &BrInst = cast<IndirectBrInst>(U);
2113
2114 const Register Tgt = getOrCreateVReg(*BrInst.getAddress());
2115 MIRBuilder.buildBrIndirect(Tgt);
2116
2117 // Link successors.
2118 SmallPtrSet<const BasicBlock *, 32> AddedSuccessors;
2119 MachineBasicBlock &CurBB = MIRBuilder.getMBB();
2120 for (const BasicBlock *Succ : successors(&BrInst)) {
2121 // It's legal for indirectbr instructions to have duplicate blocks in the
2122 // destination list. We don't allow this in MIR. Skip anything that's
2123 // already a successor.
2124 if (!AddedSuccessors.insert(Succ).second)
2125 continue;
2126 CurBB.addSuccessor(&getMBB(*Succ));
2127 }
2128
2129 return true;
2130}
2131
2132static bool isSwiftError(const Value *V) {
2133 if (auto Arg = dyn_cast<Argument>(V))
2134 return Arg->hasSwiftErrorAttr();
2135 if (auto AI = dyn_cast<AllocaInst>(V))
2136 return AI->isSwiftError();
2137 return false;
2138}
2139
2140bool IRTranslatorImpl::translateLoad(const User &U,
2141 MachineIRBuilder &MIRBuilder) {
2142 const LoadInst &LI = cast<LoadInst>(U);
2143 TypeSize StoreSize = DL->getTypeStoreSize(LI.getType());
2144 if (StoreSize.isZero())
2145 return true;
2146
2147 ArrayRef<Register> Regs = getOrCreateVRegs(LI);
2148 Register Base = getOrCreateVReg(*LI.getPointerOperand());
2149 AAMDNodes AAInfo = LI.getAAMetadata();
2150
2151 const Value *Ptr = LI.getPointerOperand();
2152
2153 if (CLI->supportSwiftError() && isSwiftError(Ptr)) {
2154 assert(Regs.size() == 1 && "swifterror should be single pointer");
2155 Register VReg =
2156 SwiftError.getOrCreateVRegUseAt(&LI, &MIRBuilder.getMBB(), Ptr);
2157 MIRBuilder.buildCopy(Regs[0], VReg);
2158 return true;
2159 }
2160
2162 TLI->getLoadMemOperandFlags(LI, *DL, AC, LibInfo, OptLevel);
2163 if (AA && !(Flags & MachineMemOperand::MOInvariant)) {
2164 if (AA->pointsToConstantMemory(
2165 MemoryLocation(Ptr, LocationSize::precise(StoreSize), AAInfo))) {
2167 }
2168 }
2169
2170 // Fast-path the common single-register load.
2171 if (Regs.size() == 1) {
2172 auto *MMO = MF->getMachineMemOperand(
2173 MachinePointerInfo(LI.getPointerOperand()), Flags,
2174 MRI->getType(Regs[0]), getMemOpAlign(LI),
2175 MMOMetadata(AAInfo, LI.getMetadata(LLVMContext::MD_range)),
2176 LI.getSyncScopeID(), LI.getOrdering());
2177 MIRBuilder.buildLoad(Regs[0], Base, *MMO);
2178 return true;
2179 }
2180
2181 ArrayRef<uint64_t> Offsets = *VMap.getOffsets(LI);
2182 Type *OffsetIRTy = DL->getIndexType(Ptr->getType());
2183 LLT OffsetTy = getLLTForType(*OffsetIRTy, *DL);
2184 for (unsigned i = 0; i < Regs.size(); ++i) {
2185 Register Addr;
2186 MIRBuilder.materializeObjectPtrOffset(Addr, Base, OffsetTy, Offsets[i]);
2187
2188 MachinePointerInfo Ptr(LI.getPointerOperand(), Offsets[i]);
2189 Align BaseAlign = getMemOpAlign(LI);
2190 auto *MMO =
2191 MF->getMachineMemOperand(Ptr, Flags, MRI->getType(Regs[i]),
2192 commonAlignment(BaseAlign, Offsets[i]), AAInfo,
2193 LI.getSyncScopeID(), LI.getOrdering());
2194 MIRBuilder.buildLoad(Regs[i], Addr, *MMO);
2195 }
2196
2197 return true;
2198}
2199
2200bool IRTranslatorImpl::translateStore(const User &U,
2201 MachineIRBuilder &MIRBuilder) {
2202 const StoreInst &SI = cast<StoreInst>(U);
2203 if (DL->getTypeStoreSize(SI.getValueOperand()->getType()).isZero())
2204 return true;
2205
2206 ArrayRef<Register> Vals = getOrCreateVRegs(*SI.getValueOperand());
2207 Register Base = getOrCreateVReg(*SI.getPointerOperand());
2208
2209 if (CLI->supportSwiftError() && isSwiftError(SI.getPointerOperand())) {
2210 assert(Vals.size() == 1 && "swifterror should be single pointer");
2211
2212 Register VReg = SwiftError.getOrCreateVRegDefAt(&SI, &MIRBuilder.getMBB(),
2213 SI.getPointerOperand());
2214 MIRBuilder.buildCopy(VReg, Vals[0]);
2215 return true;
2216 }
2217
2218 MachineMemOperand::Flags Flags = TLI->getStoreMemOperandFlags(SI, *DL);
2219 // Fast-path the common single-register store.
2220 if (Vals.size() == 1) {
2221 auto *MMO = MF->getMachineMemOperand(
2222 MachinePointerInfo(SI.getPointerOperand()), Flags,
2223 MRI->getType(Vals[0]), getMemOpAlign(SI), SI.getAAMetadata(),
2224 SI.getSyncScopeID(), SI.getOrdering());
2225 MIRBuilder.buildStore(Vals[0], Base, *MMO);
2226 return true;
2227 }
2228
2229 ArrayRef<uint64_t> Offsets = *VMap.getOffsets(*SI.getValueOperand());
2230 Type *OffsetIRTy = DL->getIndexType(SI.getPointerOperandType());
2231 LLT OffsetTy = getLLTForType(*OffsetIRTy, *DL);
2232 for (unsigned i = 0; i < Vals.size(); ++i) {
2233 Register Addr;
2234 MIRBuilder.materializeObjectPtrOffset(Addr, Base, OffsetTy, Offsets[i]);
2235
2236 MachinePointerInfo Ptr(SI.getPointerOperand(), Offsets[i]);
2237 Align BaseAlign = getMemOpAlign(SI);
2238 auto *MMO = MF->getMachineMemOperand(Ptr, Flags, MRI->getType(Vals[i]),
2239 commonAlignment(BaseAlign, Offsets[i]),
2240 SI.getAAMetadata(),
2241 SI.getSyncScopeID(), SI.getOrdering());
2242 MIRBuilder.buildStore(Vals[i], Addr, *MMO);
2243 }
2244 return true;
2245}
2246
2248 const Value *Src = U.getOperand(0);
2249 Type *Int32Ty = Type::getInt32Ty(U.getContext());
2250
2251 // getIndexedOffsetInType is designed for GEPs, so the first index is the
2252 // usual array element rather than looking into the actual aggregate.
2254 Indices.push_back(ConstantInt::get(Int32Ty, 0));
2255
2256 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(&U)) {
2257 for (auto Idx : EVI->indices())
2258 Indices.push_back(ConstantInt::get(Int32Ty, Idx));
2259 } else if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(&U)) {
2260 for (auto Idx : IVI->indices())
2261 Indices.push_back(ConstantInt::get(Int32Ty, Idx));
2262 } else {
2263 llvm::append_range(Indices, drop_begin(U.operands()));
2264 }
2265
2266 return static_cast<uint64_t>(
2267 DL.getIndexedOffsetInType(Src->getType(), Indices));
2268}
2269
2270bool IRTranslatorImpl::translateExtractValue(const User &U,
2271 MachineIRBuilder &MIRBuilder) {
2272 const Value *Src = U.getOperand(0);
2274 ArrayRef<Register> SrcRegs = getOrCreateVRegs(*Src);
2275 ArrayRef<uint64_t> Offsets = *VMap.getOffsets(*Src);
2276 unsigned Idx = llvm::lower_bound(Offsets, Offset) - Offsets.begin();
2277 auto &DstRegs = allocateVRegs(U);
2278
2279 for (unsigned i = 0; i < DstRegs.size(); ++i)
2280 DstRegs[i] = SrcRegs[Idx++];
2281
2282 return true;
2283}
2284
2285bool IRTranslatorImpl::translateInsertValue(const User &U,
2286 MachineIRBuilder &MIRBuilder) {
2287 const Value *Src = U.getOperand(0);
2289 auto &DstRegs = allocateVRegs(U);
2290 ArrayRef<uint64_t> DstOffsets = *VMap.getOffsets(U);
2291 ArrayRef<Register> SrcRegs = getOrCreateVRegs(*Src);
2292 ArrayRef<Register> InsertedRegs = getOrCreateVRegs(*U.getOperand(1));
2293 auto *InsertedIt = InsertedRegs.begin();
2294
2295 for (unsigned i = 0; i < DstRegs.size(); ++i) {
2296 if (DstOffsets[i] >= Offset && InsertedIt != InsertedRegs.end())
2297 DstRegs[i] = *InsertedIt++;
2298 else
2299 DstRegs[i] = SrcRegs[i];
2300 }
2301
2302 return true;
2303}
2304
2305bool IRTranslatorImpl::translateSelect(const User &U,
2306 MachineIRBuilder &MIRBuilder) {
2307 Register Tst = getOrCreateVReg(*U.getOperand(0));
2308 ArrayRef<Register> ResRegs = getOrCreateVRegs(U);
2309 ArrayRef<Register> Op0Regs = getOrCreateVRegs(*U.getOperand(1));
2310 ArrayRef<Register> Op1Regs = getOrCreateVRegs(*U.getOperand(2));
2311
2312 uint32_t Flags = 0;
2313 if (const SelectInst *SI = dyn_cast<SelectInst>(&U))
2315
2316 for (unsigned i = 0; i < ResRegs.size(); ++i) {
2317 MIRBuilder.buildSelect(ResRegs[i], Tst, Op0Regs[i], Op1Regs[i], Flags);
2318 }
2319
2320 return true;
2321}
2322
2323bool IRTranslatorImpl::translateCopy(const User &U, const Value &V,
2324 MachineIRBuilder &MIRBuilder) {
2325 return translateCopy(U, getOrCreateVReg(V), MIRBuilder);
2326}
2327
2328bool IRTranslatorImpl::translateCopy(const User &U, Register Src,
2329 MachineIRBuilder &MIRBuilder) {
2330 auto &Regs = *VMap.getVRegs(U);
2331 if (Regs.empty()) {
2332 Regs.push_back(Src);
2333 VMap.getOffsets(U)->push_back(0);
2334 } else {
2335 // If we already assigned a vreg for this instruction, we can't change that.
2336 // Emit a copy to satisfy the users we already emitted.
2337 MIRBuilder.buildCopy(Regs[0], Src);
2338 }
2339 return true;
2340}
2341
2342bool IRTranslatorImpl::translateBitCast(const User &U,
2343 MachineIRBuilder &MIRBuilder) {
2344 Type *SrcTy = U.getOperand(0)->getType();
2345 Type *DstTy = U.getType();
2346
2347 // If we're bitcasting to the source type, we can reuse the source vreg.
2348 if (getLLTForType(*SrcTy, *DL) == getLLTForType(*DstTy, *DL)) {
2349 // If the source is a ConstantInt then it was probably created by
2350 // ConstantHoisting and we should leave it alone.
2351 if (isa<ConstantInt>(U.getOperand(0)))
2352 return translateCast(TargetOpcode::G_CONSTANT_FOLD_BARRIER, U,
2353 MIRBuilder);
2354 return translateCopy(U, *U.getOperand(0), MIRBuilder);
2355 }
2356
2357 // Only the scalar byte<->ptr crossing is redirected to G_INTTOPTR/G_PTRTOINT,
2358 // which is the well-typed MIR shape for that boundary. Vector byte<->ptr
2359 // (e.g. <N x b32> -> ptr produced by mixed-type load coalescing) and other
2360 // legacy ptr/non-ptr IR bitcasts (AMDGPU iN<->p3 kernarg packing, etc.)
2361 // keep their historical G_BITCAST lowering — G_INTTOPTR has no vector-src
2362 // -> scalar-ptr form, and downstream passes already handle G_BITCAST.
2363 if (DstTy->isPointerTy() && SrcTy->isByteTy())
2364 return translateCast(TargetOpcode::G_INTTOPTR, U, MIRBuilder);
2365 if (SrcTy->isPointerTy() && DstTy->isByteTy())
2366 return translateCast(TargetOpcode::G_PTRTOINT, U, MIRBuilder);
2367
2368 return translateCast(TargetOpcode::G_BITCAST, U, MIRBuilder);
2369}
2370
2371bool IRTranslatorImpl::translateCast(unsigned Opcode, const User &U,
2372 MachineIRBuilder &MIRBuilder) {
2373 if (!mayTranslateUserTypes(U))
2374 return false;
2375
2376 uint32_t Flags = 0;
2377 if (const Instruction *I = dyn_cast<Instruction>(&U))
2379
2380 Register Op = getOrCreateVReg(*U.getOperand(0));
2381 Register Res = getOrCreateVReg(U);
2382 MIRBuilder.buildInstr(Opcode, {Res}, {Op}, Flags);
2383 return true;
2384}
2385
2386bool IRTranslatorImpl::translateGetElementPtr(const User &U,
2387 MachineIRBuilder &MIRBuilder) {
2388 Value &Op0 = *U.getOperand(0);
2389 Register BaseReg = getOrCreateVReg(Op0);
2390 Type *PtrIRTy = Op0.getType();
2391 LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
2392 Type *OffsetIRTy = DL->getIndexType(PtrIRTy);
2393 LLT OffsetTy = getLLTForType(*OffsetIRTy, *DL);
2394
2395 uint32_t PtrAddFlags = 0;
2396 // Each PtrAdd generated to implement the GEP inherits its nuw, nusw, inbounds
2397 // flags.
2398 if (const Instruction *I = dyn_cast<Instruction>(&U))
2400
2401 auto PtrAddFlagsWithConst = [&](int64_t Offset) {
2402 // For nusw/inbounds GEP with an offset that is nonnegative when interpreted
2403 // as signed, assume there is no unsigned overflow.
2404 if (Offset >= 0 && (PtrAddFlags & MachineInstr::MIFlag::NoUSWrap))
2405 return PtrAddFlags | MachineInstr::MIFlag::NoUWrap;
2406 return PtrAddFlags;
2407 };
2408
2409 // Normalize Vector GEP - all scalar operands should be converted to the
2410 // splat vector.
2411 unsigned VectorWidth = 0;
2412
2413 // True if we should use a splat vector; using VectorWidth alone is not
2414 // sufficient.
2415 bool WantSplatVector = false;
2416 if (auto *VT = dyn_cast<VectorType>(U.getType())) {
2417 VectorWidth = cast<FixedVectorType>(VT)->getNumElements();
2418 // We don't produce 1 x N vectors; those are treated as scalars.
2419 WantSplatVector = VectorWidth > 1;
2420 }
2421
2422 if (cast<GEPOperator>(U).hasAllZeroIndices())
2423 return translateCopy(U, BaseReg, MIRBuilder);
2424
2425 // We might need to splat the base pointer into a vector if the offsets
2426 // are vectors.
2427 if (WantSplatVector && !PtrTy.isVector()) {
2428 BaseReg = MIRBuilder
2429 .buildSplatBuildVector(LLT::fixed_vector(VectorWidth, PtrTy),
2430 BaseReg)
2431 .getReg(0);
2432 PtrIRTy = FixedVectorType::get(PtrIRTy, VectorWidth);
2433 PtrTy = getLLTForType(*PtrIRTy, *DL);
2434 OffsetIRTy = DL->getIndexType(PtrIRTy);
2435 OffsetTy = getLLTForType(*OffsetIRTy, *DL);
2436 }
2437
2438 int64_t Offset = 0;
2439 for (gep_type_iterator GTI = gep_type_begin(&U), E = gep_type_end(&U);
2440 GTI != E; ++GTI) {
2441 const Value *Idx = GTI.getOperand();
2442 if (StructType *StTy = GTI.getStructTypeOrNull()) {
2443 unsigned Field = cast<Constant>(Idx)->getUniqueInteger().getZExtValue();
2444 Offset += DL->getStructLayout(StTy)->getElementOffset(Field);
2445 continue;
2446 } else {
2447 uint64_t ElementSize = GTI.getSequentialElementStride(*DL);
2448
2449 // If this is a scalar constant or a splat vector of constants,
2450 // handle it quickly.
2451 if (const auto *CI = dyn_cast<ConstantInt>(Idx)) {
2452 if (std::optional<int64_t> Val = CI->getValue().trySExtValue()) {
2453 Offset += ElementSize * *Val;
2454 continue;
2455 }
2456 }
2457
2458 if (Offset != 0) {
2459 auto OffsetMIB = MIRBuilder.buildConstant({OffsetTy}, Offset);
2460 BaseReg = MIRBuilder
2461 .buildPtrAdd(PtrTy, BaseReg, OffsetMIB.getReg(0),
2462 PtrAddFlagsWithConst(Offset))
2463 .getReg(0);
2464 Offset = 0;
2465 }
2466
2467 Register IdxReg = getOrCreateVReg(*Idx);
2468 LLT IdxTy = MRI->getType(IdxReg);
2469 if (IdxTy != OffsetTy) {
2470 if (!IdxTy.isVector() && WantSplatVector) {
2471 IdxReg = MIRBuilder
2473 IdxReg)
2474 .getReg(0);
2475 }
2476
2477 IdxReg = MIRBuilder.buildSExtOrTrunc(OffsetTy, IdxReg).getReg(0);
2478 }
2479
2480 // N = N + Idx * ElementSize;
2481 // Avoid doing it for ElementSize of 1.
2482 Register GepOffsetReg;
2483 if (ElementSize != 1) {
2484 auto ElementSizeMIB = MIRBuilder.buildConstant(
2485 getLLTForType(*OffsetIRTy, *DL), ElementSize);
2486
2487 // The multiplication is NUW if the GEP is NUW and NSW if the GEP is
2488 // NUSW.
2489 uint32_t ScaleFlags = PtrAddFlags & MachineInstr::MIFlag::NoUWrap;
2490 if (PtrAddFlags & MachineInstr::MIFlag::NoUSWrap)
2491 ScaleFlags |= MachineInstr::MIFlag::NoSWrap;
2492
2493 GepOffsetReg =
2494 MIRBuilder.buildMul(OffsetTy, IdxReg, ElementSizeMIB, ScaleFlags)
2495 .getReg(0);
2496 } else {
2497 GepOffsetReg = IdxReg;
2498 }
2499
2500 BaseReg =
2501 MIRBuilder.buildPtrAdd(PtrTy, BaseReg, GepOffsetReg, PtrAddFlags)
2502 .getReg(0);
2503 }
2504 }
2505
2506 if (Offset != 0) {
2507 auto OffsetMIB =
2508 MIRBuilder.buildConstant(OffsetTy, Offset);
2509
2510 MIRBuilder.buildPtrAdd(getOrCreateVReg(U), BaseReg, OffsetMIB.getReg(0),
2511 PtrAddFlagsWithConst(Offset));
2512 return true;
2513 }
2514
2515 return translateCopy(U, BaseReg, MIRBuilder);
2516}
2517
2518bool IRTranslatorImpl::translateMemFunc(const CallInst &CI,
2519 MachineIRBuilder &MIRBuilder,
2520 unsigned Opcode) {
2521 const Value *SrcPtr = CI.getArgOperand(1);
2522 // If the source is undef, then just emit a nop.
2523 if (isa<UndefValue>(SrcPtr))
2524 return true;
2525
2527
2528 unsigned MinPtrSize = UINT_MAX;
2529 for (auto AI = CI.arg_begin(), AE = CI.arg_end(); std::next(AI) != AE; ++AI) {
2530 Register SrcReg = getOrCreateVReg(**AI);
2531 LLT SrcTy = MRI->getType(SrcReg);
2532 if (SrcTy.isPointer())
2533 MinPtrSize = std::min<unsigned>(SrcTy.getSizeInBits(), MinPtrSize);
2534 SrcRegs.push_back(SrcReg);
2535 }
2536
2537 LLT SizeTy = LLT::integer(MinPtrSize);
2538
2539 // The size operand should be the minimum of the pointer sizes.
2540 Register &SizeOpReg = SrcRegs[SrcRegs.size() - 1];
2541 if (MRI->getType(SizeOpReg) != SizeTy)
2542 SizeOpReg = MIRBuilder.buildZExtOrTrunc(SizeTy, SizeOpReg).getReg(0);
2543
2544 auto ICall = MIRBuilder.buildInstr(Opcode);
2545 for (Register SrcReg : SrcRegs)
2546 ICall.addUse(SrcReg);
2547
2548 Align DstAlign;
2549 Align SrcAlign;
2550 unsigned IsVol =
2551 cast<ConstantInt>(CI.getArgOperand(CI.arg_size() - 1))->getZExtValue();
2552
2553 ConstantInt *CopySize = nullptr;
2554
2555 if (auto *MCI = dyn_cast<MemCpyInst>(&CI)) {
2556 DstAlign = MCI->getDestAlign().valueOrOne();
2557 SrcAlign = MCI->getSourceAlign().valueOrOne();
2558 CopySize = dyn_cast<ConstantInt>(MCI->getArgOperand(2));
2559 } else if (auto *MMI = dyn_cast<MemMoveInst>(&CI)) {
2560 DstAlign = MMI->getDestAlign().valueOrOne();
2561 SrcAlign = MMI->getSourceAlign().valueOrOne();
2562 CopySize = dyn_cast<ConstantInt>(MMI->getArgOperand(2));
2563 } else {
2564 auto *MSI = cast<MemSetInst>(&CI);
2565 DstAlign = MSI->getDestAlign().valueOrOne();
2566 }
2567
2568 if (Opcode != TargetOpcode::G_MEMCPY_INLINE &&
2569 Opcode != TargetOpcode::G_MEMSET_INLINE) {
2570 // We need to propagate the tail call flag from the IR inst as an argument.
2571 // Otherwise, we have to pessimize and assume later that we cannot tail call
2572 // any memory intrinsics.
2573 ICall.addImm(CI.isTailCall() ? 1 : 0);
2574 }
2575
2576 // Create mem operands to store the alignment and volatile info.
2579 if (IsVol) {
2580 LoadFlags |= MachineMemOperand::MOVolatile;
2581 StoreFlags |= MachineMemOperand::MOVolatile;
2582 }
2583
2584 AAMDNodes AAInfo = CI.getAAMetadata();
2585 if (AA && CopySize &&
2586 AA->pointsToConstantMemory(MemoryLocation(
2587 SrcPtr, LocationSize::precise(CopySize->getZExtValue()), AAInfo))) {
2588 LoadFlags |= MachineMemOperand::MOInvariant;
2589
2590 // FIXME: pointsToConstantMemory probably does not imply dereferenceable,
2591 // but the previous usage implied it did. Probably should check
2592 // isDereferenceableAndAlignedPointer.
2594 }
2595
2596 ICall.addMemOperand(
2597 MF->getMachineMemOperand(MachinePointerInfo(CI.getArgOperand(0)),
2598 StoreFlags, 1, DstAlign, AAInfo));
2599 if (Opcode != TargetOpcode::G_MEMSET &&
2600 Opcode != TargetOpcode::G_MEMSET_INLINE)
2601 ICall.addMemOperand(MF->getMachineMemOperand(
2602 MachinePointerInfo(SrcPtr), LoadFlags, 1, SrcAlign, AAInfo));
2603
2604 return true;
2605}
2606
2607bool IRTranslatorImpl::translateTrap(const CallInst &CI,
2608 MachineIRBuilder &MIRBuilder,
2609 unsigned Opcode) {
2610 StringRef TrapFuncName =
2611 CI.getAttributes().getFnAttr("trap-func-name").getValueAsString();
2612 if (TrapFuncName.empty()) {
2613 if (Opcode == TargetOpcode::G_UBSANTRAP) {
2614 uint64_t Code = cast<ConstantInt>(CI.getOperand(0))->getZExtValue();
2615 MIRBuilder.buildInstr(Opcode, {}, ArrayRef<llvm::SrcOp>{Code});
2616 } else {
2617 MIRBuilder.buildInstr(Opcode);
2618 }
2619 return true;
2620 }
2621
2622 CallLowering::CallLoweringInfo Info;
2623 if (Opcode == TargetOpcode::G_UBSANTRAP)
2624 Info.OrigArgs.push_back({getOrCreateVRegs(*CI.getArgOperand(0)),
2625 CI.getArgOperand(0)->getType(), 0});
2626
2627 Info.Callee = MachineOperand::CreateES(TrapFuncName.data());
2628 Info.CB = &CI;
2629 Info.OrigRet = {Register(), Type::getVoidTy(CI.getContext()), 0};
2630 return CLI->lowerCall(MIRBuilder, Info);
2631}
2632
2633bool IRTranslatorImpl::translateVectorInterleave2Intrinsic(
2634 const CallInst &CI, MachineIRBuilder &MIRBuilder) {
2635 assert(CI.getIntrinsicID() == Intrinsic::vector_interleave2 &&
2636 "This function can only be called on the interleave2 intrinsic!");
2637 // Canonicalize interleave2 to G_SHUFFLE_VECTOR (similar to SelectionDAG).
2638 Register Op0 = getOrCreateVReg(*CI.getOperand(0));
2639 Register Op1 = getOrCreateVReg(*CI.getOperand(1));
2640 Register Res = getOrCreateVReg(CI);
2641
2642 LLT OpTy = MRI->getType(Op0);
2643 MIRBuilder.buildShuffleVector(Res, Op0, Op1,
2645
2646 return true;
2647}
2648
2649bool IRTranslatorImpl::translateVectorDeinterleave2Intrinsic(
2650 const CallInst &CI, MachineIRBuilder &MIRBuilder) {
2651 assert(CI.getIntrinsicID() == Intrinsic::vector_deinterleave2 &&
2652 "This function can only be called on the deinterleave2 intrinsic!");
2653 // Canonicalize deinterleave2 to shuffles that extract sub-vectors (similar to
2654 // SelectionDAG).
2655 Register Op = getOrCreateVReg(*CI.getOperand(0));
2656 auto Undef = MIRBuilder.buildUndef(MRI->getType(Op));
2657 ArrayRef<Register> Res = getOrCreateVRegs(CI);
2658
2659 LLT ResTy = MRI->getType(Res[0]);
2660 if (ResTy.isScalar()) {
2661 MIRBuilder.buildExtractVectorElementConstant(Res[0], Op, 0);
2662 MIRBuilder.buildExtractVectorElementConstant(Res[1], Op, 1);
2663
2664 return true;
2665 }
2666
2667 assert(ResTy.isVector() && "Expected vector result type");
2668 MIRBuilder.buildShuffleVector(Res[0], Op, Undef,
2669 createStrideMask(0, 2, ResTy.getNumElements()));
2670 MIRBuilder.buildShuffleVector(Res[1], Op, Undef,
2671 createStrideMask(1, 2, ResTy.getNumElements()));
2672
2673 return true;
2674}
2675
2676void IRTranslatorImpl::getStackGuard(Register DstReg,
2677 MachineIRBuilder &MIRBuilder) {
2678 Value *Global =
2679 TLI->getSDagStackGuard(*MF->getFunction().getParent(), *Libcalls);
2680 if (!Global) {
2681 LLVMContext &Ctx = MIRBuilder.getContext();
2682 Ctx.diagnose(DiagnosticInfoGeneric("unable to lower stackguard"));
2683 MIRBuilder.buildUndef(DstReg);
2684 return;
2685 }
2686
2687 const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
2688 MRI->setRegClass(DstReg, TRI->getPointerRegClass());
2689 auto MIB =
2690 MIRBuilder.buildInstr(TargetOpcode::LOAD_STACK_GUARD, {DstReg}, {});
2691
2692 unsigned AddrSpace = Global->getType()->getPointerAddressSpace();
2693 LLT PtrTy = LLT::pointer(AddrSpace, DL->getPointerSizeInBits(AddrSpace));
2694
2695 MachinePointerInfo MPInfo(Global);
2698 MachineMemOperand *MemRef = MF->getMachineMemOperand(
2699 MPInfo, Flags, PtrTy, DL->getPointerABIAlignment(AddrSpace));
2700 MIB.setMemRefs({MemRef});
2701}
2702
2703bool IRTranslatorImpl::translateOverflowIntrinsic(
2704 const CallInst &CI, unsigned Op, MachineIRBuilder &MIRBuilder) {
2705 ArrayRef<Register> ResRegs = getOrCreateVRegs(CI);
2706 MIRBuilder.buildInstr(
2707 Op, {ResRegs[0], ResRegs[1]},
2708 {getOrCreateVReg(*CI.getOperand(0)), getOrCreateVReg(*CI.getOperand(1))});
2709
2710 return true;
2711}
2712
2713bool IRTranslatorImpl::translateFixedPointIntrinsic(
2714 unsigned Op, const CallInst &CI, MachineIRBuilder &MIRBuilder) {
2715 Register Dst = getOrCreateVReg(CI);
2716 Register Src0 = getOrCreateVReg(*CI.getOperand(0));
2717 Register Src1 = getOrCreateVReg(*CI.getOperand(1));
2718 uint64_t Scale = cast<ConstantInt>(CI.getOperand(2))->getZExtValue();
2719 MIRBuilder.buildInstr(Op, {Dst}, { Src0, Src1, Scale });
2720 return true;
2721}
2722
2723unsigned IRTranslatorImpl::getSimpleIntrinsicOpcode(Intrinsic::ID ID) {
2724 switch (ID) {
2725 default:
2726 break;
2727 case Intrinsic::acos:
2728 return TargetOpcode::G_FACOS;
2729 case Intrinsic::asin:
2730 return TargetOpcode::G_FASIN;
2731 case Intrinsic::atan:
2732 return TargetOpcode::G_FATAN;
2733 case Intrinsic::atan2:
2734 return TargetOpcode::G_FATAN2;
2735 case Intrinsic::bswap:
2736 return TargetOpcode::G_BSWAP;
2737 case Intrinsic::bitreverse:
2738 return TargetOpcode::G_BITREVERSE;
2739 case Intrinsic::clmul:
2740 return TargetOpcode::G_CLMUL;
2741 case Intrinsic::fshl:
2742 return TargetOpcode::G_FSHL;
2743 case Intrinsic::fshr:
2744 return TargetOpcode::G_FSHR;
2745 case Intrinsic::ceil:
2746 return TargetOpcode::G_FCEIL;
2747 case Intrinsic::cos:
2748 return TargetOpcode::G_FCOS;
2749 case Intrinsic::cosh:
2750 return TargetOpcode::G_FCOSH;
2751 case Intrinsic::ctpop:
2752 return TargetOpcode::G_CTPOP;
2753 case Intrinsic::exp:
2754 return TargetOpcode::G_FEXP;
2755 case Intrinsic::exp2:
2756 return TargetOpcode::G_FEXP2;
2757 case Intrinsic::exp10:
2758 return TargetOpcode::G_FEXP10;
2759 case Intrinsic::fabs:
2760 return TargetOpcode::G_FABS;
2761 case Intrinsic::copysign:
2762 return TargetOpcode::G_FCOPYSIGN;
2763 case Intrinsic::minnum:
2764 return TargetOpcode::G_FMINNUM;
2765 case Intrinsic::maxnum:
2766 return TargetOpcode::G_FMAXNUM;
2767 case Intrinsic::minimum:
2768 return TargetOpcode::G_FMINIMUM;
2769 case Intrinsic::maximum:
2770 return TargetOpcode::G_FMAXIMUM;
2771 case Intrinsic::minimumnum:
2772 return TargetOpcode::G_FMINIMUMNUM;
2773 case Intrinsic::maximumnum:
2774 return TargetOpcode::G_FMAXIMUMNUM;
2775 case Intrinsic::canonicalize:
2776 return TargetOpcode::G_FCANONICALIZE;
2777 case Intrinsic::floor:
2778 return TargetOpcode::G_FFLOOR;
2779 case Intrinsic::fma:
2780 return TargetOpcode::G_FMA;
2781 case Intrinsic::log:
2782 return TargetOpcode::G_FLOG;
2783 case Intrinsic::log2:
2784 return TargetOpcode::G_FLOG2;
2785 case Intrinsic::log10:
2786 return TargetOpcode::G_FLOG10;
2787 case Intrinsic::ldexp:
2788 return TargetOpcode::G_FLDEXP;
2789 case Intrinsic::nearbyint:
2790 return TargetOpcode::G_FNEARBYINT;
2791 case Intrinsic::pow:
2792 return TargetOpcode::G_FPOW;
2793 case Intrinsic::powi:
2794 return TargetOpcode::G_FPOWI;
2795 case Intrinsic::rint:
2796 return TargetOpcode::G_FRINT;
2797 case Intrinsic::round:
2798 return TargetOpcode::G_INTRINSIC_ROUND;
2799 case Intrinsic::roundeven:
2800 return TargetOpcode::G_INTRINSIC_ROUNDEVEN;
2801 case Intrinsic::sin:
2802 return TargetOpcode::G_FSIN;
2803 case Intrinsic::sinh:
2804 return TargetOpcode::G_FSINH;
2805 case Intrinsic::sqrt:
2806 return TargetOpcode::G_FSQRT;
2807 case Intrinsic::tan:
2808 return TargetOpcode::G_FTAN;
2809 case Intrinsic::tanh:
2810 return TargetOpcode::G_FTANH;
2811 case Intrinsic::trunc:
2812 return TargetOpcode::G_INTRINSIC_TRUNC;
2813 case Intrinsic::readcyclecounter:
2814 return TargetOpcode::G_READCYCLECOUNTER;
2815 case Intrinsic::readsteadycounter:
2816 return TargetOpcode::G_READSTEADYCOUNTER;
2817 case Intrinsic::ptrmask:
2818 return TargetOpcode::G_PTRMASK;
2819 case Intrinsic::lrint:
2820 return TargetOpcode::G_INTRINSIC_LRINT;
2821 case Intrinsic::llrint:
2822 return TargetOpcode::G_INTRINSIC_LLRINT;
2823 // FADD/FMUL require checking the FMF, so are handled elsewhere.
2824 case Intrinsic::vector_reduce_fmin:
2825 return TargetOpcode::G_VECREDUCE_FMIN;
2826 case Intrinsic::vector_reduce_fmax:
2827 return TargetOpcode::G_VECREDUCE_FMAX;
2828 case Intrinsic::vector_reduce_fminimum:
2829 return TargetOpcode::G_VECREDUCE_FMINIMUM;
2830 case Intrinsic::vector_reduce_fmaximum:
2831 return TargetOpcode::G_VECREDUCE_FMAXIMUM;
2832 case Intrinsic::vector_reduce_fminimumnum:
2833 return TargetOpcode::G_VECREDUCE_FMINIMUMNUM;
2834 case Intrinsic::vector_reduce_fmaximumnum:
2835 return TargetOpcode::G_VECREDUCE_FMAXIMUMNUM;
2836 case Intrinsic::vector_reduce_add:
2837 return TargetOpcode::G_VECREDUCE_ADD;
2838 case Intrinsic::vector_reduce_mul:
2839 return TargetOpcode::G_VECREDUCE_MUL;
2840 case Intrinsic::vector_reduce_and:
2841 return TargetOpcode::G_VECREDUCE_AND;
2842 case Intrinsic::vector_reduce_or:
2843 return TargetOpcode::G_VECREDUCE_OR;
2844 case Intrinsic::vector_reduce_xor:
2845 return TargetOpcode::G_VECREDUCE_XOR;
2846 case Intrinsic::vector_reduce_smax:
2847 return TargetOpcode::G_VECREDUCE_SMAX;
2848 case Intrinsic::vector_reduce_smin:
2849 return TargetOpcode::G_VECREDUCE_SMIN;
2850 case Intrinsic::vector_reduce_umax:
2851 return TargetOpcode::G_VECREDUCE_UMAX;
2852 case Intrinsic::vector_reduce_umin:
2853 return TargetOpcode::G_VECREDUCE_UMIN;
2854 case Intrinsic::experimental_vector_compress:
2855 return TargetOpcode::G_VECTOR_COMPRESS;
2856 case Intrinsic::lround:
2857 return TargetOpcode::G_LROUND;
2858 case Intrinsic::llround:
2859 return TargetOpcode::G_LLROUND;
2860 case Intrinsic::get_fpenv:
2861 return TargetOpcode::G_GET_FPENV;
2862 case Intrinsic::get_fpmode:
2863 return TargetOpcode::G_GET_FPMODE;
2864 }
2866}
2867
2868bool IRTranslatorImpl::translateSimpleIntrinsic(const CallInst &CI,
2869 Intrinsic::ID ID,
2870 MachineIRBuilder &MIRBuilder) {
2871
2872 unsigned Op = getSimpleIntrinsicOpcode(ID);
2873
2874 // Is this a simple intrinsic?
2876 return false;
2877
2878 // Yes. Let's translate it.
2880 for (const auto &Arg : CI.args())
2881 VRegs.push_back(getOrCreateVReg(*Arg));
2882
2883 MIRBuilder.buildInstr(Op, {getOrCreateVReg(CI)}, VRegs,
2885 return true;
2886}
2887
2888// TODO: Include ConstainedOps.def when all strict instructions are defined.
2890 switch (ID) {
2891 case Intrinsic::experimental_constrained_fadd:
2892 return TargetOpcode::G_STRICT_FADD;
2893 case Intrinsic::experimental_constrained_fsub:
2894 return TargetOpcode::G_STRICT_FSUB;
2895 case Intrinsic::experimental_constrained_fmul:
2896 return TargetOpcode::G_STRICT_FMUL;
2897 case Intrinsic::experimental_constrained_fdiv:
2898 return TargetOpcode::G_STRICT_FDIV;
2899 case Intrinsic::experimental_constrained_frem:
2900 return TargetOpcode::G_STRICT_FREM;
2901 case Intrinsic::experimental_constrained_fma:
2902 return TargetOpcode::G_STRICT_FMA;
2903 case Intrinsic::experimental_constrained_sqrt:
2904 return TargetOpcode::G_STRICT_FSQRT;
2905 case Intrinsic::experimental_constrained_ldexp:
2906 return TargetOpcode::G_STRICT_FLDEXP;
2907 case Intrinsic::experimental_constrained_fcmp:
2908 return TargetOpcode::G_STRICT_FCMP;
2909 case Intrinsic::experimental_constrained_fcmps:
2910 return TargetOpcode::G_STRICT_FCMPS;
2911 default:
2912 return 0;
2913 }
2914}
2915
2916bool IRTranslatorImpl::translateConstrainedFPIntrinsic(
2917 const ConstrainedFPIntrinsic &FPI, MachineIRBuilder &MIRBuilder) {
2919
2920 unsigned Opcode = getConstrainedOpcode(FPI.getIntrinsicID());
2921 if (!Opcode)
2922 return false;
2923
2927
2928 if (Opcode == TargetOpcode::G_STRICT_FCMP ||
2929 Opcode == TargetOpcode::G_STRICT_FCMPS) {
2930 auto *FPCmp = cast<ConstrainedFPCmpIntrinsic>(&FPI);
2931 Register Operand0 = getOrCreateVReg(*FPCmp->getArgOperand(0));
2932 Register Operand1 = getOrCreateVReg(*FPCmp->getArgOperand(1));
2933 Register Result = getOrCreateVReg(FPI);
2934 MIRBuilder.buildInstr(Opcode, {Result}, {}, Flags)
2935 .addPredicate(FPCmp->getPredicate())
2936 .addUse(Operand0)
2937 .addUse(Operand1);
2938 return true;
2939 }
2940
2942 for (unsigned I = 0, E = FPI.getNonMetadataArgCount(); I != E; ++I)
2943 VRegs.push_back(getOrCreateVReg(*FPI.getArgOperand(I)));
2944
2945 MIRBuilder.buildInstr(Opcode, {getOrCreateVReg(FPI)}, VRegs, Flags);
2946 return true;
2947}
2948
2949std::optional<MCRegister> IRTranslatorImpl::getArgPhysReg(Argument &Arg) {
2950 auto VRegs = getOrCreateVRegs(Arg);
2951 if (VRegs.size() != 1)
2952 return std::nullopt;
2953
2954 // Arguments are lowered as a copy of a livein physical register.
2955 auto *VRegDef = MF->getRegInfo().getVRegDef(VRegs[0]);
2956 if (!VRegDef || !VRegDef->isCopy())
2957 return std::nullopt;
2958 return VRegDef->getOperand(1).getReg().asMCReg();
2959}
2960
2961bool IRTranslatorImpl::translateIfEntryValueArgument(
2962 bool isDeclare, Value *Val, const DILocalVariable *Var,
2963 const DIExpression *Expr, const DebugLoc &DL,
2964 MachineIRBuilder &MIRBuilder) {
2965 auto *Arg = dyn_cast<Argument>(Val);
2966 if (!Arg)
2967 return false;
2968
2969 if (!Expr->isEntryValue())
2970 return false;
2971
2972 std::optional<MCRegister> PhysReg = getArgPhysReg(*Arg);
2973 if (!PhysReg) {
2974 LLVM_DEBUG(dbgs() << "Dropping dbg." << (isDeclare ? "declare" : "value")
2975 << ": expression is entry_value but "
2976 << "couldn't find a physical register\n");
2977 LLVM_DEBUG(dbgs() << *Var << "\n");
2978 return true;
2979 }
2980
2981 if (isDeclare) {
2982 // Append an op deref to account for the fact that this is a dbg_declare.
2983 Expr = DIExpression::append(Expr, dwarf::DW_OP_deref);
2984 MF->setVariableDbgInfo(Var, Expr, *PhysReg, DL);
2985 } else {
2986 MIRBuilder.buildDirectDbgValue(*PhysReg, Var, Expr);
2987 }
2988
2989 return true;
2990}
2991
2992static unsigned getConvOpcode(Intrinsic::ID ID) {
2993 switch (ID) {
2994 default:
2995 llvm_unreachable("Unexpected intrinsic");
2996 case Intrinsic::experimental_convergence_anchor:
2997 return TargetOpcode::CONVERGENCECTRL_ANCHOR;
2998 case Intrinsic::experimental_convergence_entry:
2999 return TargetOpcode::CONVERGENCECTRL_ENTRY;
3000 case Intrinsic::experimental_convergence_loop:
3001 return TargetOpcode::CONVERGENCECTRL_LOOP;
3002 }
3003}
3004
3005bool IRTranslatorImpl::translateConvergenceControlIntrinsic(
3006 const CallInst &CI, Intrinsic::ID ID, MachineIRBuilder &MIRBuilder) {
3007 MachineInstrBuilder MIB = MIRBuilder.buildInstr(getConvOpcode(ID));
3008 Register OutputReg = getOrCreateConvergenceTokenVReg(CI);
3009 MIB.addDef(OutputReg);
3010
3011 if (ID == Intrinsic::experimental_convergence_loop) {
3013 assert(Bundle && "Expected a convergence control token.");
3014 Register InputReg =
3015 getOrCreateConvergenceTokenVReg(*Bundle->Inputs[0].get());
3016 MIB.addUse(InputReg);
3017 }
3018
3019 return true;
3020}
3021
3022bool IRTranslatorImpl::translateKnownIntrinsic(const CallInst &CI,
3023 Intrinsic::ID ID,
3024 MachineIRBuilder &MIRBuilder) {
3025 if (auto *MI = dyn_cast<AnyMemIntrinsic>(&CI)) {
3026 if (ORE->enabled()) {
3027 if (MemoryOpRemark::canHandle(MI, *LibInfo)) {
3028 MemoryOpRemark R(*ORE, "gisel-irtranslator-memsize", *DL, *LibInfo);
3029 R.visit(MI);
3030 }
3031 }
3032 }
3033
3034 // If this is a simple intrinsic (that is, we just need to add a def of
3035 // a vreg, and uses for each arg operand, then translate it.
3036 if (translateSimpleIntrinsic(CI, ID, MIRBuilder))
3037 return true;
3038
3039 switch (ID) {
3040 default:
3041 break;
3042 case Intrinsic::lifetime_start:
3043 case Intrinsic::lifetime_end: {
3044 // No stack colouring in O0, discard region information.
3045 if (MF->getTarget().getOptLevel() == CodeGenOptLevel::None ||
3046 MF->getFunction().hasOptNone())
3047 return true;
3048
3049 unsigned Op = ID == Intrinsic::lifetime_start ? TargetOpcode::LIFETIME_START
3050 : TargetOpcode::LIFETIME_END;
3051
3052 const AllocaInst *AI = dyn_cast<AllocaInst>(CI.getArgOperand(0));
3053 if (!AI || !AI->isStaticAlloca())
3054 return true;
3055
3056 MIRBuilder.buildInstr(Op).addFrameIndex(getOrCreateFrameIndex(*AI));
3057 return true;
3058 }
3059 case Intrinsic::fake_use: {
3061 for (const auto &Arg : CI.args())
3062 llvm::append_range(VRegs, getOrCreateVRegs(*Arg));
3063 MIRBuilder.buildInstr(TargetOpcode::FAKE_USE, {}, VRegs);
3064 MF->setHasFakeUses(true);
3065 return true;
3066 }
3067 case Intrinsic::dbg_declare: {
3068 const DbgDeclareInst &DI = cast<DbgDeclareInst>(CI);
3069 assert(DI.getVariable() && "Missing variable");
3070 translateDbgDeclareRecord(DI.getAddress(), DI.hasArgList(), DI.getVariable(),
3071 DI.getExpression(), DI.getDebugLoc(), MIRBuilder);
3072 return true;
3073 }
3074 case Intrinsic::dbg_label: {
3075 const DbgLabelInst &DI = cast<DbgLabelInst>(CI);
3076 assert(DI.getLabel() && "Missing label");
3077
3079 MIRBuilder.getDebugLoc()) &&
3080 "Expected inlined-at fields to agree");
3081
3082 MIRBuilder.buildDbgLabel(DI.getLabel());
3083 return true;
3084 }
3085 case Intrinsic::vaend:
3086 // No target I know of cares about va_end. Certainly no in-tree target
3087 // does. Simplest intrinsic ever!
3088 return true;
3089 case Intrinsic::vastart: {
3090 Value *Ptr = CI.getArgOperand(0);
3091 unsigned ListSize = TLI->getVaListSizeInBits(*DL) / 8;
3092 Align Alignment = getKnownAlignment(Ptr, *DL);
3093
3094 MIRBuilder.buildInstr(TargetOpcode::G_VASTART, {}, {getOrCreateVReg(*Ptr)})
3095 .addMemOperand(MF->getMachineMemOperand(MachinePointerInfo(Ptr),
3097 ListSize, Alignment));
3098 return true;
3099 }
3100 case Intrinsic::dbg_assign:
3101 // A dbg.assign is a dbg.value with more information about stack locations,
3102 // typically produced during optimisation of variables with leaked
3103 // addresses. We can treat it like a normal dbg_value intrinsic here; to
3104 // benefit from the full analysis of stack/SSA locations, GlobalISel would
3105 // need to register for and use the AssignmentTrackingAnalysis pass.
3106 [[fallthrough]];
3107 case Intrinsic::dbg_value: {
3108 // This form of DBG_VALUE is target-independent.
3109 const DbgValueInst &DI = cast<DbgValueInst>(CI);
3110 translateDbgValueRecord(DI.getValue(), DI.hasArgList(), DI.getVariable(),
3111 DI.getExpression(), DI.getDebugLoc(), MIRBuilder);
3112 return true;
3113 }
3114 case Intrinsic::uadd_with_overflow:
3115 return translateOverflowIntrinsic(CI, TargetOpcode::G_UADDO, MIRBuilder);
3116 case Intrinsic::sadd_with_overflow:
3117 return translateOverflowIntrinsic(CI, TargetOpcode::G_SADDO, MIRBuilder);
3118 case Intrinsic::usub_with_overflow:
3119 return translateOverflowIntrinsic(CI, TargetOpcode::G_USUBO, MIRBuilder);
3120 case Intrinsic::ssub_with_overflow:
3121 return translateOverflowIntrinsic(CI, TargetOpcode::G_SSUBO, MIRBuilder);
3122 case Intrinsic::umul_with_overflow:
3123 return translateOverflowIntrinsic(CI, TargetOpcode::G_UMULO, MIRBuilder);
3124 case Intrinsic::smul_with_overflow:
3125 return translateOverflowIntrinsic(CI, TargetOpcode::G_SMULO, MIRBuilder);
3126 case Intrinsic::uadd_sat:
3127 return translateBinaryOp(TargetOpcode::G_UADDSAT, CI, MIRBuilder);
3128 case Intrinsic::sadd_sat:
3129 return translateBinaryOp(TargetOpcode::G_SADDSAT, CI, MIRBuilder);
3130 case Intrinsic::usub_sat:
3131 return translateBinaryOp(TargetOpcode::G_USUBSAT, CI, MIRBuilder);
3132 case Intrinsic::ssub_sat:
3133 return translateBinaryOp(TargetOpcode::G_SSUBSAT, CI, MIRBuilder);
3134 case Intrinsic::ushl_sat:
3135 return translateBinaryOp(TargetOpcode::G_USHLSAT, CI, MIRBuilder);
3136 case Intrinsic::sshl_sat:
3137 return translateBinaryOp(TargetOpcode::G_SSHLSAT, CI, MIRBuilder);
3138 case Intrinsic::umin:
3139 return translateBinaryOp(TargetOpcode::G_UMIN, CI, MIRBuilder);
3140 case Intrinsic::umax:
3141 return translateBinaryOp(TargetOpcode::G_UMAX, CI, MIRBuilder);
3142 case Intrinsic::smin:
3143 return translateBinaryOp(TargetOpcode::G_SMIN, CI, MIRBuilder);
3144 case Intrinsic::smax:
3145 return translateBinaryOp(TargetOpcode::G_SMAX, CI, MIRBuilder);
3146 case Intrinsic::abs:
3147 // TODO: Preserve "int min is poison" arg in GMIR?
3148 return translateUnaryOp(TargetOpcode::G_ABS, CI, MIRBuilder);
3149 case Intrinsic::smul_fix:
3150 return translateFixedPointIntrinsic(TargetOpcode::G_SMULFIX, CI, MIRBuilder);
3151 case Intrinsic::umul_fix:
3152 return translateFixedPointIntrinsic(TargetOpcode::G_UMULFIX, CI, MIRBuilder);
3153 case Intrinsic::smul_fix_sat:
3154 return translateFixedPointIntrinsic(TargetOpcode::G_SMULFIXSAT, CI, MIRBuilder);
3155 case Intrinsic::umul_fix_sat:
3156 return translateFixedPointIntrinsic(TargetOpcode::G_UMULFIXSAT, CI, MIRBuilder);
3157 case Intrinsic::sdiv_fix:
3158 return translateFixedPointIntrinsic(TargetOpcode::G_SDIVFIX, CI, MIRBuilder);
3159 case Intrinsic::udiv_fix:
3160 return translateFixedPointIntrinsic(TargetOpcode::G_UDIVFIX, CI, MIRBuilder);
3161 case Intrinsic::sdiv_fix_sat:
3162 return translateFixedPointIntrinsic(TargetOpcode::G_SDIVFIXSAT, CI, MIRBuilder);
3163 case Intrinsic::udiv_fix_sat:
3164 return translateFixedPointIntrinsic(TargetOpcode::G_UDIVFIXSAT, CI, MIRBuilder);
3165 case Intrinsic::fmuladd: {
3166 const TargetMachine &TM = MF->getTarget();
3167 Register Dst = getOrCreateVReg(CI);
3168 Register Op0 = getOrCreateVReg(*CI.getArgOperand(0));
3169 Register Op1 = getOrCreateVReg(*CI.getArgOperand(1));
3170 Register Op2 = getOrCreateVReg(*CI.getArgOperand(2));
3172 TLI->isFMAFasterThanFMulAndFAdd(*MF,
3173 TLI->getValueType(*DL, CI.getType()))) {
3174 // TODO: Revisit this to see if we should move this part of the
3175 // lowering to the combiner.
3176 MIRBuilder.buildFMA(Dst, Op0, Op1, Op2,
3178 } else {
3179 LLT Ty = getLLTForType(*CI.getType(), *DL);
3180 auto FMul = MIRBuilder.buildFMul(
3181 Ty, Op0, Op1, MachineInstr::copyFlagsFromInstruction(CI));
3182 MIRBuilder.buildFAdd(Dst, FMul, Op2,
3184 }
3185 return true;
3186 }
3187 case Intrinsic::frexp: {
3188 ArrayRef<Register> VRegs = getOrCreateVRegs(CI);
3189 MIRBuilder.buildFFrexp(VRegs[0], VRegs[1],
3190 getOrCreateVReg(*CI.getArgOperand(0)),
3192 return true;
3193 }
3194 case Intrinsic::modf: {
3195 ArrayRef<Register> VRegs = getOrCreateVRegs(CI);
3196 MIRBuilder.buildModf(VRegs[0], VRegs[1],
3197 getOrCreateVReg(*CI.getArgOperand(0)),
3199 return true;
3200 }
3201 case Intrinsic::sincos: {
3202 ArrayRef<Register> VRegs = getOrCreateVRegs(CI);
3203 MIRBuilder.buildFSincos(VRegs[0], VRegs[1],
3204 getOrCreateVReg(*CI.getArgOperand(0)),
3206 return true;
3207 }
3208 case Intrinsic::fptosi_sat:
3209 MIRBuilder.buildFPTOSI_SAT(getOrCreateVReg(CI),
3210 getOrCreateVReg(*CI.getArgOperand(0)));
3211 return true;
3212 case Intrinsic::fptoui_sat:
3213 MIRBuilder.buildFPTOUI_SAT(getOrCreateVReg(CI),
3214 getOrCreateVReg(*CI.getArgOperand(0)));
3215 return true;
3216 case Intrinsic::memcpy_inline:
3217 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMCPY_INLINE);
3218 case Intrinsic::memcpy:
3219 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMCPY);
3220 case Intrinsic::memmove:
3221 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMMOVE);
3222 case Intrinsic::memset:
3223 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMSET);
3224 case Intrinsic::memset_inline:
3225 return translateMemFunc(CI, MIRBuilder, TargetOpcode::G_MEMSET_INLINE);
3226 case Intrinsic::eh_typeid_for: {
3227 GlobalValue *GV = ExtractTypeInfo(CI.getArgOperand(0));
3228 Register Reg = getOrCreateVReg(CI);
3229 unsigned TypeID = MF->getTypeIDFor(GV);
3230 MIRBuilder.buildConstant(Reg, TypeID);
3231 return true;
3232 }
3233 case Intrinsic::objectsize:
3234 llvm_unreachable("llvm.objectsize.* should have been lowered already");
3235
3236 case Intrinsic::is_constant:
3237 llvm_unreachable("llvm.is.constant.* should have been lowered already");
3238
3239 case Intrinsic::stackguard:
3240 getStackGuard(getOrCreateVReg(CI), MIRBuilder);
3241 return true;
3242 case Intrinsic::stackprotector: {
3243 LLT PtrTy = getLLTForType(*CI.getArgOperand(0)->getType(), *DL);
3244 Register GuardVal;
3245 if (TLI->useLoadStackGuardNode(*CI.getModule())) {
3246 GuardVal = MRI->createGenericVirtualRegister(PtrTy);
3247 getStackGuard(GuardVal, MIRBuilder);
3248 } else
3249 GuardVal = getOrCreateVReg(*CI.getArgOperand(0)); // The guard's value.
3250
3251 AllocaInst *Slot = cast<AllocaInst>(CI.getArgOperand(1));
3252 int FI = getOrCreateFrameIndex(*Slot);
3253 MF->getFrameInfo().setStackProtectorIndex(FI);
3254
3255 MIRBuilder.buildStore(
3256 GuardVal, getOrCreateVReg(*Slot),
3257 *MF->getMachineMemOperand(MachinePointerInfo::getFixedStack(*MF, FI),
3260 PtrTy, Align(8)));
3261 return true;
3262 }
3263 case Intrinsic::stacksave: {
3264 MIRBuilder.buildInstr(TargetOpcode::G_STACKSAVE, {getOrCreateVReg(CI)}, {});
3265 return true;
3266 }
3267 case Intrinsic::stackrestore: {
3268 MIRBuilder.buildInstr(TargetOpcode::G_STACKRESTORE, {},
3269 {getOrCreateVReg(*CI.getArgOperand(0))});
3270 return true;
3271 }
3272 case Intrinsic::cttz:
3273 case Intrinsic::ctlz: {
3274 ConstantInt *Cst = cast<ConstantInt>(CI.getArgOperand(1));
3275 bool isTrailing = ID == Intrinsic::cttz;
3276 unsigned Opcode = isTrailing ? Cst->isZero()
3277 ? TargetOpcode::G_CTTZ
3278 : TargetOpcode::G_CTTZ_ZERO_POISON
3279 : Cst->isZero() ? TargetOpcode::G_CTLZ
3280 : TargetOpcode::G_CTLZ_ZERO_POISON;
3281 MIRBuilder.buildInstr(Opcode, {getOrCreateVReg(CI)},
3282 {getOrCreateVReg(*CI.getArgOperand(0))});
3283 return true;
3284 }
3285 case Intrinsic::invariant_start: {
3286 MIRBuilder.buildUndef(getOrCreateVReg(CI));
3287 return true;
3288 }
3289 case Intrinsic::invariant_end:
3290 return true;
3291 case Intrinsic::expect:
3292 case Intrinsic::expect_with_probability:
3293 case Intrinsic::annotation:
3294 case Intrinsic::ptr_annotation:
3295 case Intrinsic::launder_invariant_group:
3296 case Intrinsic::strip_invariant_group:
3297 case Intrinsic::threadlocal_address: {
3298 // Drop the intrinsic, but forward the value.
3299 MIRBuilder.buildCopy(getOrCreateVReg(CI),
3300 getOrCreateVReg(*CI.getArgOperand(0)));
3301 return true;
3302 }
3303 case Intrinsic::assume:
3304 case Intrinsic::experimental_noalias_scope_decl:
3305 case Intrinsic::var_annotation:
3306 case Intrinsic::sideeffect:
3307 // Discard annotate attributes, assumptions, and artificial side-effects.
3308 return true;
3309 case Intrinsic::read_volatile_register:
3310 case Intrinsic::read_register: {
3311 Value *Arg = CI.getArgOperand(0);
3312 MIRBuilder
3313 .buildInstr(TargetOpcode::G_READ_REGISTER, {getOrCreateVReg(CI)}, {})
3314 .addMetadata(cast<MDNode>(cast<MetadataAsValue>(Arg)->getMetadata()));
3315 return true;
3316 }
3317 case Intrinsic::write_register: {
3318 Value *Arg = CI.getArgOperand(0);
3319 MIRBuilder.buildInstr(TargetOpcode::G_WRITE_REGISTER)
3320 .addMetadata(cast<MDNode>(cast<MetadataAsValue>(Arg)->getMetadata()))
3321 .addUse(getOrCreateVReg(*CI.getArgOperand(1)));
3322 return true;
3323 }
3324 case Intrinsic::localescape: {
3325 MachineBasicBlock &EntryMBB = MF->front();
3326 StringRef EscapedName = GlobalValue::dropLLVMManglingEscape(MF->getName());
3327
3328 // Directly emit some LOCAL_ESCAPE machine instrs. Label assignment emission
3329 // is the same on all targets.
3330 for (unsigned Idx = 0, E = CI.arg_size(); Idx < E; ++Idx) {
3331 Value *Arg = CI.getArgOperand(Idx)->stripPointerCasts();
3332 if (isa<ConstantPointerNull>(Arg))
3333 continue; // Skip null pointers. They represent a hole in index space.
3334
3335 int FI = getOrCreateFrameIndex(*cast<AllocaInst>(Arg));
3336 MCSymbol *FrameAllocSym =
3337 MF->getContext().getOrCreateFrameAllocSymbol(EscapedName, Idx);
3338
3339 // This should be inserted at the start of the entry block.
3340 auto LocalEscape =
3341 MIRBuilder.buildInstrNoInsert(TargetOpcode::LOCAL_ESCAPE)
3342 .addSym(FrameAllocSym)
3343 .addFrameIndex(FI);
3344
3345 EntryMBB.insert(EntryMBB.begin(), LocalEscape);
3346 }
3347
3348 return true;
3349 }
3350 case Intrinsic::vector_reduce_fadd:
3351 case Intrinsic::vector_reduce_fmul: {
3352 // Need to check for the reassoc flag to decide whether we want a
3353 // sequential reduction opcode or not.
3354 Register Dst = getOrCreateVReg(CI);
3355 Register ScalarSrc = getOrCreateVReg(*CI.getArgOperand(0));
3356 Register VecSrc = getOrCreateVReg(*CI.getArgOperand(1));
3357 unsigned Opc = 0;
3358 if (!CI.hasAllowReassoc()) {
3359 // The sequential ordering case.
3360 Opc = ID == Intrinsic::vector_reduce_fadd
3361 ? TargetOpcode::G_VECREDUCE_SEQ_FADD
3362 : TargetOpcode::G_VECREDUCE_SEQ_FMUL;
3363 if (!MRI->getType(VecSrc).isVector())
3364 Opc = ID == Intrinsic::vector_reduce_fadd ? TargetOpcode::G_FADD
3365 : TargetOpcode::G_FMUL;
3366 MIRBuilder.buildInstr(Opc, {Dst}, {ScalarSrc, VecSrc},
3368 return true;
3369 }
3370 // We split the operation into a separate G_FADD/G_FMUL + the reduce,
3371 // since the associativity doesn't matter.
3372 unsigned ScalarOpc;
3373 if (ID == Intrinsic::vector_reduce_fadd) {
3374 Opc = TargetOpcode::G_VECREDUCE_FADD;
3375 ScalarOpc = TargetOpcode::G_FADD;
3376 } else {
3377 Opc = TargetOpcode::G_VECREDUCE_FMUL;
3378 ScalarOpc = TargetOpcode::G_FMUL;
3379 }
3380 LLT DstTy = MRI->getType(Dst);
3381 auto Rdx = MIRBuilder.buildInstr(
3382 Opc, {DstTy}, {VecSrc}, MachineInstr::copyFlagsFromInstruction(CI));
3383 MIRBuilder.buildInstr(ScalarOpc, {Dst}, {ScalarSrc, Rdx},
3385
3386 return true;
3387 }
3388 case Intrinsic::trap:
3389 return translateTrap(CI, MIRBuilder, TargetOpcode::G_TRAP);
3390 case Intrinsic::debugtrap:
3391 return translateTrap(CI, MIRBuilder, TargetOpcode::G_DEBUGTRAP);
3392 case Intrinsic::ubsantrap:
3393 return translateTrap(CI, MIRBuilder, TargetOpcode::G_UBSANTRAP);
3394 case Intrinsic::allow_runtime_check:
3395 case Intrinsic::allow_ubsan_check:
3396 MIRBuilder.buildCopy(getOrCreateVReg(CI),
3397 getOrCreateVReg(*ConstantInt::getTrue(CI.getType())));
3398 return true;
3399 case Intrinsic::amdgcn_cs_chain:
3400 case Intrinsic::amdgcn_call_whole_wave:
3401 return translateCallBase(CI, MIRBuilder);
3402 case Intrinsic::fptrunc_round: {
3404
3405 // Convert the metadata argument to a constant integer
3406 Metadata *MD = cast<MetadataAsValue>(CI.getArgOperand(1))->getMetadata();
3407 std::optional<RoundingMode> RoundMode =
3408 convertStrToRoundingMode(cast<MDString>(MD)->getString());
3409
3410 // Add the Rounding mode as an integer
3411 MIRBuilder
3412 .buildInstr(TargetOpcode::G_INTRINSIC_FPTRUNC_ROUND,
3413 {getOrCreateVReg(CI)},
3414 {getOrCreateVReg(*CI.getArgOperand(0))}, Flags)
3415 .addImm((int)*RoundMode);
3416
3417 return true;
3418 }
3419 case Intrinsic::is_fpclass: {
3420 Value *FpValue = CI.getOperand(0);
3421 ConstantInt *TestMaskValue = cast<ConstantInt>(CI.getOperand(1));
3422
3423 MIRBuilder
3424 .buildInstr(TargetOpcode::G_IS_FPCLASS, {getOrCreateVReg(CI)},
3425 {getOrCreateVReg(*FpValue)})
3426 .addImm(TestMaskValue->getZExtValue());
3427
3428 return true;
3429 }
3430 case Intrinsic::set_fpenv: {
3431 Value *FPEnv = CI.getOperand(0);
3432 MIRBuilder.buildSetFPEnv(getOrCreateVReg(*FPEnv));
3433 return true;
3434 }
3435 case Intrinsic::reset_fpenv:
3436 MIRBuilder.buildResetFPEnv();
3437 return true;
3438 case Intrinsic::set_fpmode: {
3439 Value *FPState = CI.getOperand(0);
3440 MIRBuilder.buildSetFPMode(getOrCreateVReg(*FPState));
3441 return true;
3442 }
3443 case Intrinsic::reset_fpmode:
3444 MIRBuilder.buildResetFPMode();
3445 return true;
3446 case Intrinsic::get_rounding:
3447 MIRBuilder.buildGetRounding(getOrCreateVReg(CI));
3448 return true;
3449 case Intrinsic::set_rounding:
3450 MIRBuilder.buildSetRounding(getOrCreateVReg(*CI.getOperand(0)));
3451 return true;
3452 case Intrinsic::vscale: {
3453 MIRBuilder.buildVScale(getOrCreateVReg(CI), 1);
3454 return true;
3455 }
3456 case Intrinsic::scmp:
3457 MIRBuilder.buildSCmp(getOrCreateVReg(CI),
3458 getOrCreateVReg(*CI.getOperand(0)),
3459 getOrCreateVReg(*CI.getOperand(1)));
3460 return true;
3461 case Intrinsic::ucmp:
3462 MIRBuilder.buildUCmp(getOrCreateVReg(CI),
3463 getOrCreateVReg(*CI.getOperand(0)),
3464 getOrCreateVReg(*CI.getOperand(1)));
3465 return true;
3466 case Intrinsic::vector_extract:
3467 return translateExtractVector(CI, MIRBuilder);
3468 case Intrinsic::vector_insert:
3469 return translateInsertVector(CI, MIRBuilder);
3470 case Intrinsic::stepvector: {
3471 MIRBuilder.buildStepVector(getOrCreateVReg(CI), 1);
3472 return true;
3473 }
3474 case Intrinsic::prefetch: {
3475 Value *Addr = CI.getOperand(0);
3476 unsigned RW = cast<ConstantInt>(CI.getOperand(1))->getZExtValue();
3477 unsigned Locality = cast<ConstantInt>(CI.getOperand(2))->getZExtValue();
3478 unsigned CacheType = cast<ConstantInt>(CI.getOperand(3))->getZExtValue();
3479
3481 auto &MMO = *MF->getMachineMemOperand(MachinePointerInfo(Addr), Flags,
3482 LLT(), Align());
3483
3484 MIRBuilder.buildPrefetch(getOrCreateVReg(*Addr), RW, Locality, CacheType,
3485 MMO);
3486
3487 return true;
3488 }
3489
3490 case Intrinsic::vector_interleave2:
3491 case Intrinsic::vector_deinterleave2: {
3492 // Both intrinsics have at least one operand.
3493 Value *Op0 = CI.getOperand(0);
3494 LLT ResTy = getLLTForType(*Op0->getType(), MIRBuilder.getDataLayout());
3495 if (!ResTy.isFixedVector())
3496 return false;
3497
3498 if (CI.getIntrinsicID() == Intrinsic::vector_interleave2)
3499 return translateVectorInterleave2Intrinsic(CI, MIRBuilder);
3500
3501 return translateVectorDeinterleave2Intrinsic(CI, MIRBuilder);
3502 }
3503
3504#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \
3505 case Intrinsic::INTRINSIC:
3506#include "llvm/IR/ConstrainedOps.def"
3507 return translateConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(CI),
3508 MIRBuilder);
3509 case Intrinsic::experimental_convergence_anchor:
3510 case Intrinsic::experimental_convergence_entry:
3511 case Intrinsic::experimental_convergence_loop:
3512 return translateConvergenceControlIntrinsic(CI, ID, MIRBuilder);
3513 case Intrinsic::reloc_none: {
3514 Metadata *MD = cast<MetadataAsValue>(CI.getArgOperand(0))->getMetadata();
3515 StringRef SymbolName = cast<MDString>(MD)->getString();
3516 MIRBuilder.buildInstr(TargetOpcode::RELOC_NONE)
3518 return true;
3519 }
3520 }
3521 return false;
3522}
3523
3524bool IRTranslatorImpl::translateInlineAsm(const CallBase &CB,
3525 MachineIRBuilder &MIRBuilder) {
3526 if (!mayTranslateUserTypes(CB))
3527 return false;
3528
3529 const InlineAsmLowering *ALI = MF->getSubtarget().getInlineAsmLowering();
3530
3531 if (!ALI) {
3532 LLVM_DEBUG(
3533 dbgs() << "Inline asm lowering is not supported for this target yet\n");
3534 return false;
3535 }
3536
3537 return ALI->lowerInlineAsm(
3538 MIRBuilder, CB, [&](const Value &Val) { return getOrCreateVRegs(Val); });
3539}
3540
3541bool IRTranslatorImpl::translateCallBase(const CallBase &CB,
3542 MachineIRBuilder &MIRBuilder) {
3543 ArrayRef<Register> Res = getOrCreateVRegs(CB);
3544
3546 Register SwiftInVReg = 0;
3547 Register SwiftErrorVReg = 0;
3548 for (const auto &Arg : CB.args()) {
3549 if (CLI->supportSwiftError() && isSwiftError(Arg)) {
3550 assert(SwiftInVReg == 0 && "Expected only one swift error argument");
3551 LLT Ty = getLLTForType(*Arg->getType(), *DL);
3552 SwiftInVReg = MRI->createGenericVirtualRegister(Ty);
3553 MIRBuilder.buildCopy(SwiftInVReg, SwiftError.getOrCreateVRegUseAt(
3554 &CB, &MIRBuilder.getMBB(), Arg));
3555 Args.emplace_back(ArrayRef(SwiftInVReg));
3556 SwiftErrorVReg =
3557 SwiftError.getOrCreateVRegDefAt(&CB, &MIRBuilder.getMBB(), Arg);
3558 continue;
3559 }
3560 Args.push_back(getOrCreateVRegs(*Arg));
3561 }
3562
3563 if (auto *CI = dyn_cast<CallInst>(&CB)) {
3564 if (ORE->enabled()) {
3565 if (MemoryOpRemark::canHandle(CI, *LibInfo)) {
3566 MemoryOpRemark R(*ORE, "gisel-irtranslator-memsize", *DL, *LibInfo);
3567 R.visit(CI);
3568 }
3569 }
3570 }
3571
3572 std::optional<CallLowering::PtrAuthInfo> PAI;
3573 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_ptrauth)) {
3574 // Functions should never be ptrauth-called directly.
3575 assert(!CB.getCalledFunction() && "invalid direct ptrauth call");
3576
3577 const Value *Key = Bundle->Inputs[0];
3578 const Value *Discriminator = Bundle->Inputs[1];
3579
3580 // Look through ptrauth constants to try to eliminate the matching bundle
3581 // and turn this into a direct call with no ptrauth.
3582 // CallLowering will use the raw pointer if it doesn't find the PAI.
3583 const auto *CalleeCPA = dyn_cast<ConstantPtrAuth>(CB.getCalledOperand());
3584 if (!CalleeCPA || !isa<Function>(CalleeCPA->getPointer()) ||
3585 !CalleeCPA->isKnownCompatibleWith(Key, Discriminator, *DL)) {
3586 // If we can't make it direct, package the bundle into PAI.
3587 Register DiscReg = getOrCreateVReg(*Discriminator);
3588 PAI = CallLowering::PtrAuthInfo{cast<ConstantInt>(Key)->getZExtValue(),
3589 DiscReg};
3590 }
3591 }
3592
3593 Register ConvergenceCtrlToken = 0;
3594 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
3595 const auto &Token = *Bundle->Inputs[0].get();
3596 ConvergenceCtrlToken = getOrCreateConvergenceTokenVReg(Token);
3597 }
3598
3599 // We don't set HasCalls on MFI here yet because call lowering may decide to
3600 // optimize into tail calls. Instead, we defer that to selection where a final
3601 // scan is done to check if any instructions are calls.
3602 bool Success = CLI->lowerCall(
3603 MIRBuilder, CB, Res, Args, SwiftErrorVReg, PAI, ConvergenceCtrlToken,
3604 [&]() { return getOrCreateVReg(*CB.getCalledOperand()); });
3605
3606 // Check if we just inserted a tail call.
3607 if (Success) {
3608 assert(!HasTailCall && "Can't tail call return twice from block?");
3609 const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
3610 HasTailCall = TII->isTailCall(*std::prev(MIRBuilder.getInsertPt()));
3611 }
3612
3613 return Success;
3614}
3615
3616bool IRTranslatorImpl::translateCall(const User &U,
3617 MachineIRBuilder &MIRBuilder) {
3618 if (!mayTranslateUserTypes(U))
3619 return false;
3620
3621 const CallInst &CI = cast<CallInst>(U);
3622 const Function *F = CI.getCalledFunction();
3623
3624 // FIXME: support Windows dllimport function calls and calls through
3625 // weak symbols.
3626 if (F && (F->hasDLLImportStorageClass() ||
3627 (MF->getTarget().getTargetTriple().isOSWindows() &&
3628 F->hasExternalWeakLinkage())))
3629 return false;
3630
3631 // FIXME: support control flow guard targets.
3633 return false;
3634
3635 // FIXME: support statepoints and related.
3637 return false;
3638
3639 if (CI.isInlineAsm())
3640 return translateInlineAsm(CI, MIRBuilder);
3641
3642 Intrinsic::ID ID = F ? F->getIntrinsicID() : Intrinsic::not_intrinsic;
3643 if (!F || ID == Intrinsic::not_intrinsic) {
3644 if (translateCallBase(CI, MIRBuilder)) {
3645 diagnoseDontCall(CI);
3646 return true;
3647 }
3648 return false;
3649 }
3650
3651 assert(ID != Intrinsic::not_intrinsic && "unknown intrinsic");
3652
3653 if (!MF->getSubtarget().isIntrinsicSupported(ID)) {
3654 const Function &Fn = MF->getFunction();
3655 Fn.getContext().diagnose(
3656 DiagnosticInfoUnsupportedTargetIntrinsic(Fn, ID, CI.getDebugLoc()));
3657 }
3658
3659 if (translateKnownIntrinsic(CI, ID, MIRBuilder))
3660 return true;
3661
3663 TLI->getTgtMemIntrinsic(Infos, CI, *MF, ID);
3664
3665 return translateIntrinsic(CI, ID, MIRBuilder, Infos);
3666}
3667
3668/// Translate a call or callbr to an intrinsic.
3669bool IRTranslatorImpl::translateIntrinsic(
3670 const CallBase &CB, Intrinsic::ID ID, MachineIRBuilder &MIRBuilder,
3671 ArrayRef<TargetLowering::IntrinsicInfo> TgtMemIntrinsicInfos) {
3672 if (!MF->getSubtarget().isIntrinsicSupported(ID)) {
3673 const Function &F = MF->getFunction();
3674 F.getContext().diagnose(
3675 DiagnosticInfoUnsupportedTargetIntrinsic(F, ID, CB.getDebugLoc()));
3676 }
3677
3678 ArrayRef<Register> ResultRegs;
3679 if (!CB.getType()->isVoidTy())
3680 ResultRegs = getOrCreateVRegs(CB);
3681
3682 // Ignore the callsite attributes. Backend code is most likely not expecting
3683 // an intrinsic to sometimes have side effects and sometimes not.
3684 MachineInstrBuilder MIB = MIRBuilder.buildIntrinsic(ID, ResultRegs);
3685 if (isa<FPMathOperator>(CB))
3686 MIB->copyIRFlags(CB);
3687
3688 for (const auto &Arg : enumerate(CB.args())) {
3689 // If this is required to be an immediate, don't materialize it in a
3690 // register.
3691 if (CB.paramHasAttr(Arg.index(), Attribute::ImmArg)) {
3692 if (ConstantInt *CI = dyn_cast<ConstantInt>(Arg.value())) {
3693 // imm arguments are more convenient than cimm (and realistically
3694 // probably sufficient), so use them.
3695 assert(CI->getBitWidth() <= 64 &&
3696 "large intrinsic immediates not handled");
3697 MIB.addImm(CI->getSExtValue());
3698 } else {
3699 MIB.addFPImm(cast<ConstantFP>(Arg.value()));
3700 }
3701 } else if (auto *MDVal = dyn_cast<MetadataAsValue>(Arg.value())) {
3702 auto *MD = MDVal->getMetadata();
3703 auto *MDN = dyn_cast<MDNode>(MD);
3704 if (!MDN) {
3705 if (auto *ConstMD = dyn_cast<ConstantAsMetadata>(MD))
3706 MDN = MDNode::get(MF->getFunction().getContext(), ConstMD);
3707 else // This was probably an MDString.
3708 return false;
3709 }
3710 MIB.addMetadata(MDN);
3711 } else {
3712 ArrayRef<Register> VRegs = getOrCreateVRegs(*Arg.value());
3713 if (VRegs.size() > 1)
3714 return false;
3715 MIB.addUse(VRegs[0]);
3716 }
3717 }
3718
3719 // Add MachineMemOperands for each memory access described by the target.
3720 for (const auto &Info : TgtMemIntrinsicInfos) {
3721 Align Alignment = Info.align.value_or(
3722 DL->getABITypeAlign(Info.memVT.getTypeForEVT(CB.getContext())));
3723 LLT MemTy = Info.memVT.isSimple()
3724 ? getLLTForMVT(Info.memVT.getSimpleVT())
3725 : LLT::scalar(Info.memVT.getStoreSizeInBits());
3726
3727 // TODO: We currently just fallback to address space 0 if
3728 // getTgtMemIntrinsic didn't yield anything useful.
3729 MachinePointerInfo MPI;
3730 if (Info.ptrVal) {
3731 MPI = MachinePointerInfo(Info.ptrVal, Info.offset);
3732 } else if (Info.fallbackAddressSpace) {
3733 MPI = MachinePointerInfo(*Info.fallbackAddressSpace);
3734 }
3735 MIB.addMemOperand(MF->getMachineMemOperand(
3736 MPI, Info.flags, MemTy, Alignment, CB.getAAMetadata(), Info.ssid,
3737 Info.order, Info.failureOrder));
3738 }
3739
3740 if (CB.isConvergent()) {
3741 if (auto Bundle = CB.getOperandBundle(LLVMContext::OB_convergencectrl)) {
3742 auto *Token = Bundle->Inputs[0].get();
3743 Register TokenReg = getOrCreateVReg(*Token);
3744 MIB.addUse(TokenReg, RegState::Implicit);
3745 }
3746 }
3747
3749 MIB->setDeactivationSymbol(*MF, Bundle->Inputs[0].get());
3750
3751 return true;
3752}
3753
3754bool IRTranslatorImpl::findUnwindDestinations(
3755 const BasicBlock *EHPadBB, BranchProbability Prob,
3756 SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>>
3757 &UnwindDests) {
3759 EHPadBB->getParent()->getFunction().getPersonalityFn());
3760 bool IsMSVCCXX = Personality == EHPersonality::MSVC_CXX;
3761 bool IsCoreCLR = Personality == EHPersonality::CoreCLR;
3762 bool IsWasmCXX = Personality == EHPersonality::Wasm_CXX;
3763 bool IsSEH = isAsynchronousEHPersonality(Personality);
3764
3765 if (IsWasmCXX) {
3766 // Ignore this for now.
3767 return false;
3768 }
3769
3770 while (EHPadBB) {
3772 BasicBlock *NewEHPadBB = nullptr;
3773 if (isa<LandingPadInst>(Pad)) {
3774 // Stop on landingpads. They are not funclets.
3775 UnwindDests.emplace_back(&getMBB(*EHPadBB), Prob);
3776 break;
3777 }
3778 if (isa<CleanupPadInst>(Pad)) {
3779 // Stop on cleanup pads. Cleanups are always funclet entries for all known
3780 // personalities.
3781 UnwindDests.emplace_back(&getMBB(*EHPadBB), Prob);
3782 UnwindDests.back().first->setIsEHScopeEntry();
3783 UnwindDests.back().first->setIsEHFuncletEntry();
3784 break;
3785 }
3786 if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Pad)) {
3787 // Add the catchpad handlers to the possible destinations.
3788 for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) {
3789 UnwindDests.emplace_back(&getMBB(*CatchPadBB), Prob);
3790 // For MSVC++ and the CLR, catchblocks are funclets and need prologues.
3791 if (IsMSVCCXX || IsCoreCLR)
3792 UnwindDests.back().first->setIsEHFuncletEntry();
3793 if (!IsSEH)
3794 UnwindDests.back().first->setIsEHScopeEntry();
3795 }
3796 NewEHPadBB = CatchSwitch->getUnwindDest();
3797 } else {
3798 continue;
3799 }
3800
3801 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3802 if (BPI && NewEHPadBB)
3803 Prob *= BPI->getEdgeProbability(EHPadBB, NewEHPadBB);
3804 EHPadBB = NewEHPadBB;
3805 }
3806 return true;
3807}
3808
3809bool IRTranslatorImpl::translateInvoke(const User &U,
3810 MachineIRBuilder &MIRBuilder) {
3811 const InvokeInst &I = cast<InvokeInst>(U);
3812 MCContext &Context = MF->getContext();
3813
3814 const BasicBlock *ReturnBB = I.getSuccessor(0);
3815 const BasicBlock *EHPadBB = I.getSuccessor(1);
3816
3817 const Function *Fn = I.getCalledFunction();
3818
3819 // FIXME: support invoking patchpoint and statepoint intrinsics.
3820 if (Fn && Fn->isIntrinsic())
3821 return false;
3822
3823 // FIXME: support whatever these are.
3824 if (I.hasDeoptState())
3825 return false;
3826
3827 // FIXME: support control flow guard targets.
3828 if (I.countOperandBundlesOfType(LLVMContext::OB_cfguardtarget))
3829 return false;
3830
3831 // FIXME: support Windows exception handling.
3832 if (!isa<LandingPadInst>(EHPadBB->getFirstNonPHIIt()))
3833 return false;
3834
3835 // FIXME: support Windows dllimport function calls and calls through
3836 // weak symbols.
3837 if (Fn && (Fn->hasDLLImportStorageClass() ||
3838 (MF->getTarget().getTargetTriple().isOSWindows() &&
3839 Fn->hasExternalWeakLinkage())))
3840 return false;
3841
3842 bool LowerInlineAsm = I.isInlineAsm();
3843 bool NeedEHLabel = true;
3844
3845 // Emit the actual call, bracketed by EH_LABELs so that the MF knows about
3846 // the region covered by the try.
3847 MCSymbol *BeginSymbol = nullptr;
3848 if (NeedEHLabel) {
3849 MIRBuilder.buildInstr(TargetOpcode::G_INVOKE_REGION_START);
3850 BeginSymbol = Context.createTempSymbol();
3851 MIRBuilder.buildInstr(TargetOpcode::EH_LABEL).addSym(BeginSymbol);
3852 }
3853
3854 if (LowerInlineAsm) {
3855 if (!translateInlineAsm(I, MIRBuilder))
3856 return false;
3857 } else if (!translateCallBase(I, MIRBuilder))
3858 return false;
3859
3860 MCSymbol *EndSymbol = nullptr;
3861 if (NeedEHLabel) {
3862 EndSymbol = Context.createTempSymbol();
3863 MIRBuilder.buildInstr(TargetOpcode::EH_LABEL).addSym(EndSymbol);
3864 }
3865
3867 BranchProbabilityInfo *BPI = FuncInfo.BPI;
3868 MachineBasicBlock *InvokeMBB = &MIRBuilder.getMBB();
3869 BranchProbability EHPadBBProb =
3870 BPI ? BPI->getEdgeProbability(InvokeMBB->getBasicBlock(), EHPadBB)
3872
3873 if (!findUnwindDestinations(EHPadBB, EHPadBBProb, UnwindDests))
3874 return false;
3875
3876 MachineBasicBlock &EHPadMBB = getMBB(*EHPadBB),
3877 &ReturnMBB = getMBB(*ReturnBB);
3878 // Update successor info.
3879 addSuccessorWithProb(InvokeMBB, &ReturnMBB);
3880 for (auto &UnwindDest : UnwindDests) {
3881 UnwindDest.first->setIsEHPad();
3882 addSuccessorWithProb(InvokeMBB, UnwindDest.first, UnwindDest.second);
3883 }
3884 InvokeMBB->normalizeSuccProbs();
3885
3886 if (NeedEHLabel) {
3887 assert(BeginSymbol && "Expected a begin symbol!");
3888 assert(EndSymbol && "Expected an end symbol!");
3889 MF->addInvoke(&EHPadMBB, BeginSymbol, EndSymbol);
3890 }
3891
3892 MIRBuilder.buildBr(ReturnMBB);
3893 return true;
3894}
3895
3896/// The intrinsics currently supported by callbr are implicit control flow
3897/// intrinsics such as amdgcn.kill.
3898bool IRTranslatorImpl::translateCallBr(const User &U,
3899 MachineIRBuilder &MIRBuilder) {
3900 if (!mayTranslateUserTypes(U))
3901 return false; // see translateCall
3902
3903 const CallBrInst &I = cast<CallBrInst>(U);
3904 MachineBasicBlock *CallBrMBB = &MIRBuilder.getMBB();
3905
3906 Intrinsic::ID IID = I.getIntrinsicID();
3907 if (I.isInlineAsm()) {
3908 // FIXME: inline asm is not yet supported for callbr in GlobalISel. As soon
3909 // as we add support, we need to handle the indirect asm targets, see
3910 // SelectionDAGBuilder::visitCallBr().
3911 return false;
3912 }
3913 if (!translateIntrinsic(I, IID, MIRBuilder))
3914 return false;
3915
3916 // Retrieve successors.
3917 SmallPtrSet<BasicBlock *, 8> Dests = {I.getDefaultDest()};
3918 MachineBasicBlock *Return = &getMBB(*I.getDefaultDest());
3919
3920 // Update successor info.
3921 addSuccessorWithProb(CallBrMBB, Return, BranchProbability::getOne());
3922
3923 // Add indirect targets as successors. For intrinsic callbr, these represent
3924 // implicit control flow (e.g., the "kill" path for amdgcn.kill). We mark them
3925 // with setIsInlineAsmBrIndirectTarget so the machine verifier accepts them as
3926 // valid successors, even though they're not from inline asm.
3927 for (BasicBlock *Dest : I.getIndirectDests()) {
3928 MachineBasicBlock &Target = getMBB(*Dest);
3929 Target.setIsInlineAsmBrIndirectTarget();
3930 Target.setLabelMustBeEmitted();
3931 // Don't add duplicate machine successors.
3932 if (Dests.insert(Dest).second)
3933 addSuccessorWithProb(CallBrMBB, &Target, BranchProbability::getZero());
3934 }
3935
3936 CallBrMBB->normalizeSuccProbs();
3937
3938 // Drop into default successor.
3939 MIRBuilder.buildBr(*Return);
3940
3941 return true;
3942}
3943
3944bool IRTranslatorImpl::translateLandingPad(const User &U,
3945 MachineIRBuilder &MIRBuilder) {
3946 const LandingPadInst &LP = cast<LandingPadInst>(U);
3947
3948 MachineBasicBlock &MBB = MIRBuilder.getMBB();
3949
3950 MBB.setIsEHPad();
3951
3952 // If there aren't registers to copy the values into (e.g., during SjLj
3953 // exceptions), then don't bother.
3954 const Constant *PersonalityFn = MF->getFunction().getPersonalityFn();
3955 if (TLI->getExceptionPointerRegister(
3956 TLI->getTargetMachine().getExceptionModel(), PersonalityFn) == 0 &&
3957 TLI->getExceptionSelectorRegister(
3958 TLI->getTargetMachine().getExceptionModel(), PersonalityFn) == 0)
3959 return true;
3960
3961 // If landingpad's return type is token type, we don't create DAG nodes
3962 // for its exception pointer and selector value. The extraction of exception
3963 // pointer or selector value from token type landingpads is not currently
3964 // supported.
3965 if (LP.getType()->isTokenTy())
3966 return true;
3967
3968 // Add a label to mark the beginning of the landing pad. Deletion of the
3969 // landing pad can thus be detected via the MachineModuleInfo.
3970 MIRBuilder.buildInstr(TargetOpcode::EH_LABEL)
3971 .addSym(MF->addLandingPad(&MBB));
3972
3973 // If the unwinder does not preserve all registers, ensure that the
3974 // function marks the clobbered registers as used.
3975 const TargetRegisterInfo &TRI = *MF->getSubtarget().getRegisterInfo();
3976 if (auto *RegMask = TRI.getCustomEHPadPreservedMask(*MF))
3977 MF->getRegInfo().addPhysRegsUsedFromRegMask(RegMask);
3978
3979 LLT Ty = getLLTForType(*LP.getType(), *DL);
3980 Register Undef = MRI->createGenericVirtualRegister(Ty);
3981 MIRBuilder.buildUndef(Undef);
3982
3984 for (Type *Ty : cast<StructType>(LP.getType())->elements())
3985 Tys.push_back(getLLTForType(*Ty, *DL));
3986 assert(Tys.size() == 2 && "Only two-valued landingpads are supported");
3987
3988 // Mark exception register as live in.
3989 Register ExceptionReg = TLI->getExceptionPointerRegister(
3990 TLI->getTargetMachine().getExceptionModel(), PersonalityFn);
3991 if (!ExceptionReg)
3992 return false;
3993
3994 MBB.addLiveIn(ExceptionReg);
3995 ArrayRef<Register> ResRegs = getOrCreateVRegs(LP);
3996 MIRBuilder.buildCopy(ResRegs[0], ExceptionReg);
3997
3998 Register SelectorReg = TLI->getExceptionSelectorRegister(
3999 TLI->getTargetMachine().getExceptionModel(), PersonalityFn);
4000 if (!SelectorReg)
4001 return false;
4002
4003 MBB.addLiveIn(SelectorReg);
4004 Register PtrVReg = MRI->createGenericVirtualRegister(Tys[0]);
4005 MIRBuilder.buildCopy(PtrVReg, SelectorReg);
4006 MIRBuilder.buildCast(ResRegs[1], PtrVReg);
4007
4008 return true;
4009}
4010
4011bool IRTranslatorImpl::translateAlloca(const User &U,
4012 MachineIRBuilder &MIRBuilder) {
4013 auto &AI = cast<AllocaInst>(U);
4014
4015 if (AI.isSwiftError())
4016 return true;
4017
4018 if (AI.isStaticAlloca()) {
4019 Register Res = getOrCreateVReg(AI);
4020 int FI = getOrCreateFrameIndex(AI);
4021 MIRBuilder.buildFrameIndex(Res, FI);
4022 return true;
4023 }
4024
4025 // FIXME: support stack probing for Windows.
4026 if (MF->getTarget().getTargetTriple().isOSWindows())
4027 return false;
4028
4029 // Now we're in the harder dynamic case.
4030 Register NumElts = getOrCreateVReg(*AI.getArraySize());
4031 Type *IntPtrIRTy = DL->getIntPtrType(AI.getType());
4032 LLT IntPtrTy = getLLTForType(*IntPtrIRTy, *DL);
4033 if (MRI->getType(NumElts) != IntPtrTy) {
4034 Register ExtElts = MRI->createGenericVirtualRegister(IntPtrTy);
4035 MIRBuilder.buildZExtOrTrunc(ExtElts, NumElts);
4036 NumElts = ExtElts;
4037 }
4038
4039 TypeSize TySize = AI.getAllocationBaseSize(*DL);
4040
4041 Register AllocSize = MRI->createGenericVirtualRegister(IntPtrTy);
4042 Register TySizeReg;
4043 if (TySize.isScalable()) {
4044 // For scalable types, use vscale * min_value
4045 TySizeReg = MRI->createGenericVirtualRegister(IntPtrTy);
4046 MIRBuilder.buildVScale(TySizeReg, TySize.getKnownMinValue());
4047 } else {
4048 // For fixed types, use a constant
4049 TySizeReg =
4050 getOrCreateVReg(*ConstantInt::get(IntPtrIRTy, TySize.getFixedValue()));
4051 }
4052 MIRBuilder.buildMul(AllocSize, NumElts, TySizeReg);
4053
4054 // Round the size of the allocation up to the stack alignment size
4055 // by add SA-1 to the size. This doesn't overflow because we're computing
4056 // an address inside an alloca.
4057 Align StackAlign = MF->getSubtarget().getFrameLowering()->getStackAlign();
4058 auto SAMinusOne = MIRBuilder.buildConstant(IntPtrTy, StackAlign.value() - 1);
4059 auto AllocAdd = MIRBuilder.buildAdd(IntPtrTy, AllocSize, SAMinusOne,
4061 auto AlignCst =
4062 MIRBuilder.buildConstant(IntPtrTy, ~(uint64_t)(StackAlign.value() - 1));
4063 auto AlignedAlloc = MIRBuilder.buildAnd(IntPtrTy, AllocAdd, AlignCst);
4064
4065 Align Alignment = AI.getAlign();
4066 if (Alignment <= StackAlign)
4067 Alignment = Align(1);
4068 MIRBuilder.buildDynStackAlloc(getOrCreateVReg(AI), AlignedAlloc, Alignment);
4069
4070 MF->getFrameInfo().CreateVariableSizedObject(Alignment, &AI);
4071 assert(MF->getFrameInfo().hasVarSizedObjects());
4072 return true;
4073}
4074
4075bool IRTranslatorImpl::translateVAArg(const User &U,
4076 MachineIRBuilder &MIRBuilder) {
4077 // FIXME: We may need more info about the type. Because of how LLT works,
4078 // we're completely discarding the i64/double distinction here (amongst
4079 // others). Fortunately the ABIs I know of where that matters don't use va_arg
4080 // anyway but that's not guaranteed.
4081 MIRBuilder.buildInstr(TargetOpcode::G_VAARG, {getOrCreateVReg(U)},
4082 {getOrCreateVReg(*U.getOperand(0)),
4083 DL->getABITypeAlign(U.getType()).value()});
4084 return true;
4085}
4086
4087bool IRTranslatorImpl::translateUnreachable(const User &U,
4088 MachineIRBuilder &MIRBuilder) {
4089 auto &UI = cast<UnreachableInst>(U);
4090 if (!UI.shouldLowerToTrap(MF->getTarget().Options.TrapUnreachable,
4091 MF->getTarget().Options.NoTrapAfterNoreturn))
4092 return true;
4093
4094 MIRBuilder.buildTrap();
4095 return true;
4096}
4097
4098bool IRTranslatorImpl::translateInsertElement(const User &U,
4099 MachineIRBuilder &MIRBuilder) {
4100 // If it is a <1 x Ty> vector, use the scalar as it is
4101 // not a legal vector type in LLT.
4102 if (auto *FVT = dyn_cast<FixedVectorType>(U.getType());
4103 FVT && FVT->getNumElements() == 1)
4104 return translateCopy(U, *U.getOperand(1), MIRBuilder);
4105
4106 Register Res = getOrCreateVReg(U);
4107 Register Val = getOrCreateVReg(*U.getOperand(0));
4108 Register Elt = getOrCreateVReg(*U.getOperand(1));
4109 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
4110 Register Idx;
4111 if (auto *CI = dyn_cast<ConstantInt>(U.getOperand(2))) {
4112 if (CI->getBitWidth() != PreferredVecIdxWidth) {
4113 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
4114 auto *NewIdxCI = ConstantInt::get(CI->getContext(), NewIdx);
4115 Idx = getOrCreateVReg(*NewIdxCI);
4116 }
4117 }
4118 if (!Idx)
4119 Idx = getOrCreateVReg(*U.getOperand(2));
4120 if (MRI->getType(Idx).getSizeInBits() != PreferredVecIdxWidth) {
4121 const LLT VecIdxTy =
4122 MRI->getType(Idx).changeElementSize(PreferredVecIdxWidth);
4123 Idx = MIRBuilder.buildZExtOrTrunc(VecIdxTy, Idx).getReg(0);
4124 }
4125 MIRBuilder.buildInsertVectorElement(Res, Val, Elt, Idx);
4126 return true;
4127}
4128
4129bool IRTranslatorImpl::translateInsertVector(const User &U,
4130 MachineIRBuilder &MIRBuilder) {
4131 Register Dst = getOrCreateVReg(U);
4132 Register Vec = getOrCreateVReg(*U.getOperand(0));
4133 Register Elt = getOrCreateVReg(*U.getOperand(1));
4134
4135 ConstantInt *CI = cast<ConstantInt>(U.getOperand(2));
4136 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
4137
4138 // Resize Index to preferred index width.
4139 if (CI->getBitWidth() != PreferredVecIdxWidth) {
4140 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
4141 CI = ConstantInt::get(CI->getContext(), NewIdx);
4142 }
4143
4144 // If it is a <1 x Ty> vector, we have to use other means.
4145 if (auto *ResultType = dyn_cast<FixedVectorType>(U.getOperand(1)->getType());
4146 ResultType && ResultType->getNumElements() == 1) {
4147 if (auto *InputType = dyn_cast<FixedVectorType>(U.getOperand(0)->getType());
4148 InputType && InputType->getNumElements() == 1) {
4149 // We are inserting an illegal fixed vector into an illegal
4150 // fixed vector, use the scalar as it is not a legal vector type
4151 // in LLT.
4152 return translateCopy(U, Vec, MIRBuilder);
4153 }
4154 if (isa<FixedVectorType>(U.getOperand(0)->getType())) {
4155 // We are inserting an illegal fixed vector into a legal fixed
4156 // vector, use the scalar as it is not a legal vector type in
4157 // LLT.
4158 Register Idx = getOrCreateVReg(*CI);
4159 MIRBuilder.buildInsertVectorElement(Dst, Vec, Elt, Idx);
4160 return true;
4161 }
4162 if (isa<ScalableVectorType>(U.getOperand(0)->getType())) {
4163 // We are inserting an illegal fixed vector into a scalable
4164 // vector, use a scalar element insert.
4165 LLT VecIdxTy = LLT::integer(PreferredVecIdxWidth);
4166 Register Idx = getOrCreateVReg(*CI);
4167 auto ScaledIndex = MIRBuilder.buildMul(
4168 VecIdxTy, MIRBuilder.buildVScale(VecIdxTy, 1), Idx);
4169 MIRBuilder.buildInsertVectorElement(Dst, Vec, Elt, ScaledIndex);
4170 return true;
4171 }
4172 }
4173
4174 MIRBuilder.buildInsertSubvector(Dst, Vec, Elt, CI->getZExtValue());
4175 return true;
4176}
4177
4178bool IRTranslatorImpl::translateExtractElement(const User &U,
4179 MachineIRBuilder &MIRBuilder) {
4180 // If it is a <1 x Ty> vector, use the scalar as it is
4181 // not a legal vector type in LLT.
4182 if (const FixedVectorType *FVT =
4183 dyn_cast<FixedVectorType>(U.getOperand(0)->getType()))
4184 if (FVT->getNumElements() == 1)
4185 return translateCopy(U, *U.getOperand(0), MIRBuilder);
4186
4187 Register Res = getOrCreateVReg(U);
4188 Register Val = getOrCreateVReg(*U.getOperand(0));
4189 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
4190 Register Idx;
4191 if (auto *CI = dyn_cast<ConstantInt>(U.getOperand(1))) {
4192 if (CI->getBitWidth() != PreferredVecIdxWidth) {
4193 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
4194 auto *NewIdxCI = ConstantInt::get(CI->getContext(), NewIdx);
4195 Idx = getOrCreateVReg(*NewIdxCI);
4196 }
4197 }
4198 if (!Idx)
4199 Idx = getOrCreateVReg(*U.getOperand(1));
4200 if (MRI->getType(Idx).getSizeInBits() != PreferredVecIdxWidth) {
4201 const LLT VecIdxTy =
4202 MRI->getType(Idx).changeElementSize(PreferredVecIdxWidth);
4203 Idx = MIRBuilder.buildZExtOrTrunc(VecIdxTy, Idx).getReg(0);
4204 }
4205 MIRBuilder.buildExtractVectorElement(Res, Val, Idx);
4206 return true;
4207}
4208
4209bool IRTranslatorImpl::translateExtractVector(const User &U,
4210 MachineIRBuilder &MIRBuilder) {
4211 Register Res = getOrCreateVReg(U);
4212 Register Vec = getOrCreateVReg(*U.getOperand(0));
4213 ConstantInt *CI = cast<ConstantInt>(U.getOperand(1));
4214 unsigned PreferredVecIdxWidth = TLI->getVectorIdxWidth(*DL);
4215
4216 // Resize Index to preferred index width.
4217 if (CI->getBitWidth() != PreferredVecIdxWidth) {
4218 APInt NewIdx = CI->getValue().zextOrTrunc(PreferredVecIdxWidth);
4219 CI = ConstantInt::get(CI->getContext(), NewIdx);
4220 }
4221
4222 // If it is a <1 x Ty> vector, we have to use other means.
4223 if (auto *ResultType = dyn_cast<FixedVectorType>(U.getType());
4224 ResultType && ResultType->getNumElements() == 1) {
4225 if (auto *InputType = dyn_cast<FixedVectorType>(U.getOperand(0)->getType());
4226 InputType && InputType->getNumElements() == 1) {
4227 // We are extracting an illegal fixed vector from an illegal fixed vector,
4228 // use the scalar as it is not a legal vector type in LLT.
4229 return translateCopy(U, Vec, MIRBuilder);
4230 }
4231 if (isa<FixedVectorType>(U.getOperand(0)->getType())) {
4232 // We are extracting an illegal fixed vector from a legal fixed
4233 // vector, use the scalar as it is not a legal vector type in
4234 // LLT.
4235 Register Idx = getOrCreateVReg(*CI);
4236 MIRBuilder.buildExtractVectorElement(Res, Vec, Idx);
4237 return true;
4238 }
4239 if (isa<ScalableVectorType>(U.getOperand(0)->getType())) {
4240 // We are extracting an illegal fixed vector from a scalable
4241 // vector, use a scalar element extract.
4242 LLT VecIdxTy = LLT::integer(PreferredVecIdxWidth);
4243 Register Idx = getOrCreateVReg(*CI);
4244 auto ScaledIndex = MIRBuilder.buildMul(
4245 VecIdxTy, MIRBuilder.buildVScale(VecIdxTy, 1), Idx);
4246 MIRBuilder.buildExtractVectorElement(Res, Vec, ScaledIndex);
4247 return true;
4248 }
4249 }
4250
4251 MIRBuilder.buildExtractSubvector(Res, Vec, CI->getZExtValue());
4252 return true;
4253}
4254
4255bool IRTranslatorImpl::translateShuffleVector(const User &U,
4256 MachineIRBuilder &MIRBuilder) {
4257 // A ShuffleVector that operates on scalable vectors is a splat vector where
4258 // the value of the splat vector is the 0th element of the first operand,
4259 // since the index mask operand is the zeroinitializer (undef and
4260 // poison are treated as zeroinitializer here).
4261 if (U.getOperand(0)->getType()->isScalableTy()) {
4262 Register Val = getOrCreateVReg(*U.getOperand(0));
4263 auto SplatVal = MIRBuilder.buildExtractVectorElementConstant(
4264 MRI->getType(Val).getElementType(), Val, 0);
4265 MIRBuilder.buildSplatVector(getOrCreateVReg(U), SplatVal);
4266 return true;
4267 }
4268
4269 ArrayRef<int> Mask;
4270 if (auto *SVI = dyn_cast<ShuffleVectorInst>(&U))
4271 Mask = SVI->getShuffleMask();
4272 else
4273 Mask = cast<ConstantExpr>(U).getShuffleMask();
4274
4275 // As GISel does not represent <1 x > vectors as a separate type from scalars,
4276 // we transform shuffle_vector with a scalar output to an
4277 // ExtractVectorElement. If the input type is also scalar it becomes a Copy.
4278 unsigned DstElts = cast<FixedVectorType>(U.getType())->getNumElements();
4279 unsigned SrcElts =
4280 cast<FixedVectorType>(U.getOperand(0)->getType())->getNumElements();
4281 if (DstElts == 1) {
4282 unsigned M = Mask[0];
4283 if (SrcElts == 1) {
4284 if (M == 0 || M == 1)
4285 return translateCopy(U, *U.getOperand(M), MIRBuilder);
4286 MIRBuilder.buildUndef(getOrCreateVReg(U));
4287 } else {
4288 Register Dst = getOrCreateVReg(U);
4289 if (M < SrcElts) {
4291 Dst, getOrCreateVReg(*U.getOperand(0)), M);
4292 } else if (M < SrcElts * 2) {
4294 Dst, getOrCreateVReg(*U.getOperand(1)), M - SrcElts);
4295 } else {
4296 MIRBuilder.buildUndef(Dst);
4297 }
4298 }
4299 return true;
4300 }
4301
4302 // A single element src is transformed to a build_vector.
4303 if (SrcElts == 1) {
4306 for (int M : Mask) {
4307 LLT SrcTy = getLLTForType(*U.getOperand(0)->getType(), *DL);
4308 if (M == 0 || M == 1) {
4309 Ops.push_back(getOrCreateVReg(*U.getOperand(M)));
4310 } else {
4311 if (!Undef.isValid()) {
4312 Undef = MRI->createGenericVirtualRegister(SrcTy);
4313 MIRBuilder.buildUndef(Undef);
4314 }
4315 Ops.push_back(Undef);
4316 }
4317 }
4318 MIRBuilder.buildBuildVector(getOrCreateVReg(U), Ops);
4319 return true;
4320 }
4321
4322 ArrayRef<int> MaskAlloc = MF->allocateShuffleMask(Mask);
4323 MIRBuilder
4324 .buildInstr(TargetOpcode::G_SHUFFLE_VECTOR, {getOrCreateVReg(U)},
4325 {getOrCreateVReg(*U.getOperand(0)),
4326 getOrCreateVReg(*U.getOperand(1))})
4327 .addShuffleMask(MaskAlloc);
4328 return true;
4329}
4330
4331bool IRTranslatorImpl::translatePHI(const User &U,
4332 MachineIRBuilder &MIRBuilder) {
4333 const PHINode &PI = cast<PHINode>(U);
4334
4335 SmallVector<MachineInstr *, 4> Insts;
4336 for (auto Reg : getOrCreateVRegs(PI)) {
4337 auto MIB = MIRBuilder.buildInstr(TargetOpcode::G_PHI, {Reg}, {});
4338 Insts.push_back(MIB.getInstr());
4339 }
4340
4341 PendingPHIs.emplace_back(&PI, std::move(Insts));
4342 return true;
4343}
4344
4345bool IRTranslatorImpl::translateAtomicCmpXchg(const User &U,
4346 MachineIRBuilder &MIRBuilder) {
4347 const AtomicCmpXchgInst &I = cast<AtomicCmpXchgInst>(U);
4348
4349 auto Flags = TLI->getAtomicMemOperandFlags(I, *DL);
4350
4351 auto Res = getOrCreateVRegs(I);
4352 Register OldValRes = Res[0];
4353 Register SuccessRes = Res[1];
4354 Register Addr = getOrCreateVReg(*I.getPointerOperand());
4355 Register Cmp = getOrCreateVReg(*I.getCompareOperand());
4356 Register NewVal = getOrCreateVReg(*I.getNewValOperand());
4357
4359 OldValRes, SuccessRes, Addr, Cmp, NewVal,
4360 *MF->getMachineMemOperand(
4361 MachinePointerInfo(I.getPointerOperand()), Flags, MRI->getType(Cmp),
4362 getMemOpAlign(I), I.getAAMetadata(), I.getSyncScopeID(),
4363 I.getSuccessOrdering(), I.getFailureOrdering()));
4364 return true;
4365}
4366
4367bool IRTranslatorImpl::translateAtomicRMW(const User &U,
4368 MachineIRBuilder &MIRBuilder) {
4369 if (!mayTranslateUserTypes(U))
4370 return false;
4371
4372 const AtomicRMWInst &I = cast<AtomicRMWInst>(U);
4373 auto Flags = TLI->getAtomicMemOperandFlags(I, *DL);
4374
4375 Register Res = getOrCreateVReg(I);
4376 Register Addr = getOrCreateVReg(*I.getPointerOperand());
4377 Register Val = getOrCreateVReg(*I.getValOperand());
4378
4379 unsigned Opcode = 0;
4380 switch (I.getOperation()) {
4381 default:
4382 return false;
4384 Opcode = TargetOpcode::G_ATOMICRMW_XCHG;
4385 break;
4386 case AtomicRMWInst::Add:
4387 Opcode = TargetOpcode::G_ATOMICRMW_ADD;
4388 break;
4389 case AtomicRMWInst::Sub:
4390 Opcode = TargetOpcode::G_ATOMICRMW_SUB;
4391 break;
4392 case AtomicRMWInst::And:
4393 Opcode = TargetOpcode::G_ATOMICRMW_AND;
4394 break;
4396 Opcode = TargetOpcode::G_ATOMICRMW_NAND;
4397 break;
4398 case AtomicRMWInst::Or:
4399 Opcode = TargetOpcode::G_ATOMICRMW_OR;
4400 break;
4401 case AtomicRMWInst::Xor:
4402 Opcode = TargetOpcode::G_ATOMICRMW_XOR;
4403 break;
4404 case AtomicRMWInst::Max:
4405 Opcode = TargetOpcode::G_ATOMICRMW_MAX;
4406 break;
4407 case AtomicRMWInst::Min:
4408 Opcode = TargetOpcode::G_ATOMICRMW_MIN;
4409 break;
4411 Opcode = TargetOpcode::G_ATOMICRMW_UMAX;
4412 break;
4414 Opcode = TargetOpcode::G_ATOMICRMW_UMIN;
4415 break;
4417 Opcode = TargetOpcode::G_ATOMICRMW_FADD;
4418 break;
4420 Opcode = TargetOpcode::G_ATOMICRMW_FSUB;
4421 break;
4423 Opcode = TargetOpcode::G_ATOMICRMW_FMAX;
4424 break;
4426 Opcode = TargetOpcode::G_ATOMICRMW_FMIN;
4427 break;
4429 Opcode = TargetOpcode::G_ATOMICRMW_FMAXIMUM;
4430 break;
4432 Opcode = TargetOpcode::G_ATOMICRMW_FMINIMUM;
4433 break;
4435 Opcode = TargetOpcode::G_ATOMICRMW_FMAXIMUMNUM;
4436 break;
4438 Opcode = TargetOpcode::G_ATOMICRMW_FMINIMUMNUM;
4439 break;
4441 Opcode = TargetOpcode::G_ATOMICRMW_UINC_WRAP;
4442 break;
4444 Opcode = TargetOpcode::G_ATOMICRMW_UDEC_WRAP;
4445 break;
4447 Opcode = TargetOpcode::G_ATOMICRMW_USUB_COND;
4448 break;
4450 Opcode = TargetOpcode::G_ATOMICRMW_USUB_SAT;
4451 break;
4452 }
4453
4454 MIRBuilder.buildAtomicRMW(
4455 Opcode, Res, Addr, Val,
4456 *MF->getMachineMemOperand(MachinePointerInfo(I.getPointerOperand()),
4457 Flags, MRI->getType(Val), getMemOpAlign(I),
4458 I.getAAMetadata(), I.getSyncScopeID(),
4459 I.getOrdering()));
4460 return true;
4461}
4462
4463bool IRTranslatorImpl::translateFence(const User &U,
4464 MachineIRBuilder &MIRBuilder) {
4465 const FenceInst &Fence = cast<FenceInst>(U);
4466 MIRBuilder.buildFence(static_cast<unsigned>(Fence.getOrdering()),
4467 Fence.getSyncScopeID());
4468 return true;
4469}
4470
4471bool IRTranslatorImpl::translateFreeze(const User &U,
4472 MachineIRBuilder &MIRBuilder) {
4473 const ArrayRef<Register> DstRegs = getOrCreateVRegs(U);
4474 const ArrayRef<Register> SrcRegs = getOrCreateVRegs(*U.getOperand(0));
4475
4476 assert(DstRegs.size() == SrcRegs.size() &&
4477 "Freeze with different source and destination type?");
4478
4479 for (unsigned I = 0; I < DstRegs.size(); ++I) {
4480 MIRBuilder.buildFreeze(DstRegs[I], SrcRegs[I]);
4481 }
4482
4483 return true;
4484}
4485
4486void IRTranslatorImpl::finishPendingPhis() {
4487#ifndef NDEBUG
4488 DILocationVerifier Verifier;
4489 GISelObserverWrapper WrapperObserver(&Verifier);
4490 RAIIMFObsDelInstaller ObsInstall(*MF, WrapperObserver);
4491#endif // ifndef NDEBUG
4492 for (auto &Phi : PendingPHIs) {
4493 const PHINode *PI = Phi.first;
4494 if (PI->getType()->isEmptyTy())
4495 continue;
4496 ArrayRef<MachineInstr *> ComponentPHIs = Phi.second;
4497 MachineBasicBlock *PhiMBB = ComponentPHIs[0]->getParent();
4498 EntryBuilder->setDebugLoc(PI->getDebugLoc());
4499#ifndef NDEBUG
4500 Verifier.setCurrentInst(PI);
4501#endif // ifndef NDEBUG
4502
4503 SmallPtrSet<const MachineBasicBlock *, 16> SeenPreds;
4504 for (unsigned i = 0; i < PI->getNumIncomingValues(); ++i) {
4505 auto IRPred = PI->getIncomingBlock(i);
4506 ArrayRef<Register> ValRegs = getOrCreateVRegs(*PI->getIncomingValue(i));
4507 for (auto *Pred : getMachinePredBBs({IRPred, PI->getParent()})) {
4508 if (SeenPreds.count(Pred) || !PhiMBB->isPredecessor(Pred))
4509 continue;
4510 SeenPreds.insert(Pred);
4511 for (unsigned j = 0; j < ValRegs.size(); ++j) {
4512 MachineInstrBuilder MIB(*MF, ComponentPHIs[j]);
4513 MIB.addUse(ValRegs[j]);
4514 MIB.addMBB(Pred);
4515 }
4516 }
4517 }
4518 }
4519}
4520
4521void IRTranslatorImpl::translateDbgValueRecord(Value *V, bool HasArgList,
4522 const DILocalVariable *Variable,
4523 const DIExpression *Expression,
4524 const DebugLoc &DL,
4525 MachineIRBuilder &MIRBuilder) {
4526 assert(Variable->isValidLocationForIntrinsic(DL) &&
4527 "Expected inlined-at fields to agree");
4528 // Act as if we're handling a debug intrinsic.
4529 MIRBuilder.setDebugLoc(DL);
4530
4531 if (!V || HasArgList) {
4532 // DI cannot produce a valid DBG_VALUE, so produce an undef DBG_VALUE to
4533 // terminate any prior location.
4534 MIRBuilder.buildIndirectDbgValue(0, Variable, Expression);
4535 return;
4536 }
4537
4538 if (const auto *CI = dyn_cast<Constant>(V)) {
4539 MIRBuilder.buildConstDbgValue(*CI, Variable, Expression);
4540 return;
4541 }
4542
4543 if (auto *AI = dyn_cast<AllocaInst>(V);
4544 AI && AI->isStaticAlloca() && Expression->startsWithDeref()) {
4545 // If the value is an alloca and the expression starts with a
4546 // dereference, track a stack slot instead of a register, as registers
4547 // may be clobbered.
4548 auto ExprOperands = Expression->getElements();
4549 auto *ExprDerefRemoved =
4550 DIExpression::get(AI->getContext(), ExprOperands.drop_front());
4551 MIRBuilder.buildFIDbgValue(getOrCreateFrameIndex(*AI), Variable,
4552 ExprDerefRemoved);
4553 return;
4554 }
4555 if (translateIfEntryValueArgument(false, V, Variable, Expression, DL,
4556 MIRBuilder))
4557 return;
4558 for (Register Reg : getOrCreateVRegs(*V)) {
4559 // FIXME: This does not handle register-indirect values at offset 0. The
4560 // direct/indirect thing shouldn't really be handled by something as
4561 // implicit as reg+noreg vs reg+imm in the first place, but it seems
4562 // pretty baked in right now.
4563 MIRBuilder.buildDirectDbgValue(Reg, Variable, Expression);
4564 }
4565}
4566
4567void IRTranslatorImpl::translateDbgDeclareRecord(
4568 Value *Address, bool HasArgList, const DILocalVariable *Variable,
4569 const DIExpression *Expression, const DebugLoc &DL,
4570 MachineIRBuilder &MIRBuilder) {
4571 if (!Address || isa<UndefValue>(Address)) {
4572 LLVM_DEBUG(dbgs() << "Dropping debug info for " << *Variable << "\n");
4573 return;
4574 }
4575
4576 assert(Variable->isValidLocationForIntrinsic(DL) &&
4577 "Expected inlined-at fields to agree");
4578 auto AI = dyn_cast<AllocaInst>(Address);
4579 if (AI && AI->isStaticAlloca()) {
4580 // Static allocas are tracked at the MF level, no need for DBG_VALUE
4581 // instructions (in fact, they get ignored if they *do* exist).
4582 MF->setVariableDbgInfo(Variable, Expression,
4583 getOrCreateFrameIndex(*AI), DL);
4584 return;
4585 }
4586
4587 if (translateIfEntryValueArgument(true, Address, Variable,
4588 Expression, DL,
4589 MIRBuilder))
4590 return;
4591
4592 // A dbg.declare describes the address of a source variable, so lower it
4593 // into an indirect DBG_VALUE.
4594 MIRBuilder.setDebugLoc(DL);
4595 MIRBuilder.buildIndirectDbgValue(getOrCreateVReg(*Address), Variable,
4596 Expression);
4597}
4598
4599void IRTranslatorImpl::translateDbgInfo(const Instruction &Inst,
4600 MachineIRBuilder &MIRBuilder) {
4601 for (DbgRecord &DR : Inst.getDbgRecordRange()) {
4602 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
4603 MIRBuilder.setDebugLoc(DLR->getDebugLoc());
4604 assert(DLR->getLabel() && "Missing label");
4605 assert(DLR->getLabel()->isValidLocationForIntrinsic(
4606 MIRBuilder.getDebugLoc()) &&
4607 "Expected inlined-at fields to agree");
4608 MIRBuilder.buildDbgLabel(DLR->getLabel());
4609 continue;
4610 }
4611 DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR);
4612 const DILocalVariable *Variable = DVR.getVariable();
4613 const DIExpression *Expression = DVR.getExpression();
4614 Value *V = DVR.getVariableLocationOp(0);
4615 if (DVR.isDbgDeclare())
4616 translateDbgDeclareRecord(V, DVR.hasArgList(), Variable, Expression,
4617 DVR.getDebugLoc(), MIRBuilder);
4618 else
4619 translateDbgValueRecord(V, DVR.hasArgList(), Variable, Expression,
4620 DVR.getDebugLoc(), MIRBuilder);
4621 }
4622}
4623
4624bool IRTranslatorImpl::translate(const Instruction &Inst) {
4625 CurBuilder->setDebugLoc(Inst.getDebugLoc());
4626 CurBuilder->setPCSections(Inst.getMetadata(LLVMContext::MD_pcsections));
4627 CurBuilder->setMMRAMetadata(Inst.getMetadata(LLVMContext::MD_mmra));
4628
4629 if (TLI->fallBackToDAGISel(Inst))
4630 return false;
4631
4632 switch (Inst.getOpcode()) {
4633#define HANDLE_INST(NUM, OPCODE, CLASS) \
4634 case Instruction::OPCODE: \
4635 return translate##OPCODE(Inst, *CurBuilder.get());
4636#include "llvm/IR/Instruction.def"
4637 default:
4638 return false;
4639 }
4640}
4641
4642bool IRTranslatorImpl::translate(const Constant &C, Register Reg) {
4643 // We only emit constants into the entry block from here. To prevent jumpy
4644 // debug behaviour remove debug line.
4645 if (auto CurrInstDL = CurBuilder->getDL())
4646 EntryBuilder->setDebugLoc(DebugLoc());
4647
4648 if (auto CI = dyn_cast<ConstantInt>(&C)) {
4649 // buildConstant expects a to-be-splatted scalar ConstantInt.
4650 if (isa<VectorType>(CI->getType()))
4651 CI = ConstantInt::get(CI->getContext(), CI->getValue());
4652 EntryBuilder->buildConstant(Reg, *CI);
4653 } else if (auto CB = dyn_cast<ConstantByte>(&C)) {
4654 // Byte constants share G_CONSTANT with integers; the destination Reg's
4655 // LLT (an integer LLT, see getLLTForType) determines vector splatting.
4656 EntryBuilder->buildConstant(Reg, CB->getValue());
4657 } else if (auto CF = dyn_cast<ConstantFP>(&C)) {
4658 // buildFConstant expects a to-be-splatted scalar ConstantFP.
4659 if (isa<VectorType>(CF->getType()))
4660 CF = ConstantFP::get(CF->getContext(), CF->getValue());
4661 EntryBuilder->buildFConstant(Reg, *CF);
4662 } else if (isa<UndefValue>(C))
4663 EntryBuilder->buildUndef(Reg);
4664 else if (isa<ConstantPointerNull>(C))
4665 EntryBuilder->buildConstant(Reg, 0);
4666 else if (auto GV = dyn_cast<GlobalValue>(&C))
4667 EntryBuilder->buildGlobalValue(Reg, GV);
4668 else if (auto CPA = dyn_cast<ConstantPtrAuth>(&C)) {
4669 Register Addr = getOrCreateVReg(*CPA->getPointer());
4670 Register AddrDisc = getOrCreateVReg(*CPA->getAddrDiscriminator());
4671 EntryBuilder->buildConstantPtrAuth(Reg, CPA, Addr, AddrDisc);
4672 } else if (auto CAZ = dyn_cast<ConstantAggregateZero>(&C)) {
4673 Constant &Elt = *CAZ->getElementValue(0u);
4674 if (isa<ScalableVectorType>(CAZ->getType())) {
4675 EntryBuilder->buildSplatVector(Reg, getOrCreateVReg(Elt));
4676 return true;
4677 }
4678 // Return the scalar if it is a <1 x Ty> vector.
4679 unsigned NumElts = CAZ->getElementCount().getFixedValue();
4680 if (NumElts == 1)
4681 return translateCopy(C, Elt, *EntryBuilder);
4682 // All elements are zero so we can just use the first one.
4683 EntryBuilder->buildSplatBuildVector(Reg, getOrCreateVReg(Elt));
4684 } else if (auto CV = dyn_cast<ConstantDataVector>(&C)) {
4685 // Return the scalar if it is a <1 x Ty> vector.
4686 if (CV->getNumElements() == 1)
4687 return translateCopy(C, *CV->getElementAsConstant(0), *EntryBuilder);
4689 for (unsigned i = 0; i < CV->getNumElements(); ++i) {
4690 Constant &Elt = *CV->getElementAsConstant(i);
4691 Ops.push_back(getOrCreateVReg(Elt));
4692 }
4693 EntryBuilder->buildBuildVector(Reg, Ops);
4694 } else if (auto CE = dyn_cast<ConstantExpr>(&C)) {
4695 switch(CE->getOpcode()) {
4696#define HANDLE_INST(NUM, OPCODE, CLASS) \
4697 case Instruction::OPCODE: \
4698 return translate##OPCODE(*CE, *EntryBuilder.get());
4699#include "llvm/IR/Instruction.def"
4700 default:
4701 return false;
4702 }
4703 } else if (auto CV = dyn_cast<ConstantVector>(&C)) {
4704 if (CV->getNumOperands() == 1)
4705 return translateCopy(C, *CV->getOperand(0), *EntryBuilder);
4707 for (unsigned i = 0; i < CV->getNumOperands(); ++i) {
4708 Ops.push_back(getOrCreateVReg(*CV->getOperand(i)));
4709 }
4710 EntryBuilder->buildBuildVector(Reg, Ops);
4711 } else if (auto *BA = dyn_cast<BlockAddress>(&C)) {
4712 EntryBuilder->buildBlockAddress(Reg, BA);
4713 } else
4714 return false;
4715
4716 return true;
4717}
4718
4719bool IRTranslatorImpl::mayTranslateUserTypes(const User &U) const {
4720 const TargetMachine &TM = TLI->getTargetMachine();
4721 if (LLT::getUseExtended())
4722 return true;
4723
4724 // BF16 cannot currently be represented by default LLT. To avoid miscompiles
4725 // we prevent any instructions using them by default in all targets that do
4726 // not explicitly enable it via LLT::setUseExtended(true).
4727 // SPIRV target is exception.
4728 return TM.getTargetTriple().isSPIRV() ||
4729 (!U.getType()->getScalarType()->isBFloatTy() &&
4730 !any_of(U.operands(), [](Value *V) {
4731 return V->getType()->getScalarType()->isBFloatTy();
4732 }));
4733}
4734
4735bool IRTranslatorImpl::finalizeBasicBlock(const BasicBlock &BB,
4737 for (auto &BTB : SL->BitTestCases) {
4738 // Emit header first, if it wasn't already emitted.
4739 if (!BTB.Emitted)
4740 emitBitTestHeader(BTB, BTB.Parent);
4741
4742 BranchProbability UnhandledProb = BTB.Prob;
4743 for (unsigned j = 0, ej = BTB.Cases.size(); j != ej; ++j) {
4744 UnhandledProb -= BTB.Cases[j].ExtraProb;
4745 // Set the current basic block to the mbb we wish to insert the code into
4746 MachineBasicBlock *MBB = BTB.Cases[j].ThisBB;
4747 // If all cases cover a contiguous range, it is not necessary to jump to
4748 // the default block after the last bit test fails. This is because the
4749 // range check during bit test header creation has guaranteed that every
4750 // case here doesn't go outside the range. In this case, there is no need
4751 // to perform the last bit test, as it will always be true. Instead, make
4752 // the second-to-last bit-test fall through to the target of the last bit
4753 // test, and delete the last bit test.
4754
4755 MachineBasicBlock *NextMBB;
4756 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
4757 // Second-to-last bit-test with contiguous range: fall through to the
4758 // target of the final bit test.
4759 NextMBB = BTB.Cases[j + 1].TargetBB;
4760 } else if (j + 1 == ej) {
4761 // For the last bit test, fall through to Default.
4762 NextMBB = BTB.Default;
4763 } else {
4764 // Otherwise, fall through to the next bit test.
4765 NextMBB = BTB.Cases[j + 1].ThisBB;
4766 }
4767
4768 emitBitTestCase(BTB, NextMBB, UnhandledProb, BTB.Reg, BTB.Cases[j], MBB);
4769
4770 if ((BTB.ContiguousRange || BTB.FallthroughUnreachable) && j + 2 == ej) {
4771 // We need to record the replacement phi edge here that normally
4772 // happens in emitBitTestCase before we delete the case, otherwise the
4773 // phi edge will be lost.
4774 addMachineCFGPred({BTB.Parent->getBasicBlock(),
4775 BTB.Cases[ej - 1].TargetBB->getBasicBlock()},
4776 MBB);
4777 // Since we're not going to use the final bit test, remove it.
4778 BTB.Cases.pop_back();
4779 break;
4780 }
4781 }
4782 // This is "default" BB. We have two jumps to it. From "header" BB and from
4783 // last "case" BB, unless the latter was skipped.
4784 CFGEdge HeaderToDefaultEdge = {BTB.Parent->getBasicBlock(),
4785 BTB.Default->getBasicBlock()};
4786 addMachineCFGPred(HeaderToDefaultEdge, BTB.Parent);
4787 if (!BTB.ContiguousRange) {
4788 addMachineCFGPred(HeaderToDefaultEdge, BTB.Cases.back().ThisBB);
4789 }
4790 }
4791 SL->BitTestCases.clear();
4792
4793 for (auto &JTCase : SL->JTCases) {
4794 // Emit header first, if it wasn't already emitted.
4795 if (!JTCase.first.Emitted)
4796 emitJumpTableHeader(JTCase.second, JTCase.first, JTCase.first.HeaderBB);
4797
4798 emitJumpTable(JTCase.second, JTCase.second.MBB);
4799 }
4800 SL->JTCases.clear();
4801
4802 for (auto &SwCase : SL->SwitchCases)
4803 emitSwitchCase(SwCase, &CurBuilder->getMBB(), *CurBuilder);
4804 SL->SwitchCases.clear();
4805
4806 // Check if we need to generate stack-protector guard checks.
4807 if (SPInfo->shouldEmitSDCheck(BB)) {
4808 bool FunctionBasedInstrumentation =
4809 TLI->getSSPStackGuardCheck(*MF->getFunction().getParent(), *Libcalls);
4810 SPDescriptor.initialize(&BB, &MBB, FunctionBasedInstrumentation);
4811 }
4812 // Handle stack protector.
4813 if (SPDescriptor.shouldEmitFunctionBasedCheckStackProtector()) {
4814 LLVM_DEBUG(dbgs() << "Unimplemented stack protector case\n");
4815 return false;
4816 } else if (SPDescriptor.shouldEmitStackProtector()) {
4817 MachineBasicBlock *ParentMBB = SPDescriptor.getParentMBB();
4818 MachineBasicBlock *SuccessMBB = SPDescriptor.getSuccessMBB();
4819
4820 // Find the split point to split the parent mbb. At the same time copy all
4821 // physical registers used in the tail of parent mbb into virtual registers
4822 // before the split point and back into physical registers after the split
4823 // point. This prevents us needing to deal with Live-ins and many other
4824 // register allocation issues caused by us splitting the parent mbb. The
4825 // register allocator will clean up said virtual copies later on.
4827 ParentMBB, *MF->getSubtarget().getInstrInfo());
4828
4829 // Splice the terminator of ParentMBB into SuccessMBB.
4830 SuccessMBB->splice(SuccessMBB->end(), ParentMBB, SplitPoint,
4831 ParentMBB->end());
4832
4833 // Add compare/jump on neq/jump to the parent BB.
4834 if (!emitSPDescriptorParent(SPDescriptor, ParentMBB))
4835 return false;
4836
4837 // CodeGen Failure MBB if we have not codegened it yet.
4838 MachineBasicBlock *FailureMBB = SPDescriptor.getFailureMBB();
4839 if (FailureMBB->empty()) {
4840 if (!emitSPDescriptorFailure(SPDescriptor, FailureMBB))
4841 return false;
4842 }
4843
4844 // Clear the Per-BB State.
4845 SPDescriptor.resetPerBBState();
4846 }
4847 return true;
4848}
4849
4850bool IRTranslatorImpl::emitSPDescriptorParent(StackProtectorDescriptor &SPD,
4851 MachineBasicBlock *ParentBB) {
4852 CurBuilder->setInsertPt(*ParentBB, ParentBB->end());
4853 // First create the loads to the guard/stack slot for the comparison.
4854 Type *PtrIRTy = PointerType::getUnqual(MF->getFunction().getContext());
4855 const LLT PtrTy = getLLTForType(*PtrIRTy, *DL);
4856 LLT PtrMemTy = getLLTForMVT(TLI->getPointerMemTy(*DL));
4857
4858 MachineFrameInfo &MFI = ParentBB->getParent()->getFrameInfo();
4859 int FI = MFI.getStackProtectorIndex();
4860
4861 Register Guard;
4862 Register StackSlotPtr = CurBuilder->buildFrameIndex(PtrTy, FI).getReg(0);
4863 const Module &M = *ParentBB->getParent()->getFunction().getParent();
4864 Align Align = DL->getPrefTypeAlign(PointerType::getUnqual(M.getContext()));
4865
4866 // Generate code to load the content of the guard slot.
4867 Register GuardVal =
4868 CurBuilder
4869 ->buildLoad(PtrMemTy, StackSlotPtr,
4870 MachinePointerInfo::getFixedStack(*MF, FI), Align,
4872 .getReg(0);
4873
4874 // Retrieve guard check function, nullptr if instrumentation is inlined.
4875 if (const Function *GuardCheckFn = TLI->getSSPStackGuardCheck(M, *Libcalls)) {
4876 // This path is currently untestable on GlobalISel, since the only platform
4877 // that needs this seems to be Windows, and we fall back on that currently.
4878 // The code still lives here in case that changes.
4879 // Silence warning about unused variable until the code below that uses
4880 // 'GuardCheckFn' is enabled.
4881 (void)GuardCheckFn;
4882 return false;
4883#if 0
4884 // The target provides a guard check function to validate the guard value.
4885 // Generate a call to that function with the content of the guard slot as
4886 // argument.
4887 FunctionType *FnTy = GuardCheckFn->getFunctionType();
4888 assert(FnTy->getNumParams() == 1 && "Invalid function signature");
4889 ISD::ArgFlagsTy Flags;
4890 if (GuardCheckFn->hasAttribute(1, Attribute::AttrKind::InReg))
4891 Flags.setInReg();
4892 CallLowering::ArgInfo GuardArgInfo(
4893 {GuardVal, FnTy->getParamType(0), {Flags}});
4894
4895 CallLowering::CallLoweringInfo Info;
4896 Info.OrigArgs.push_back(GuardArgInfo);
4897 Info.CallConv = GuardCheckFn->getCallingConv();
4898 Info.Callee = MachineOperand::CreateGA(GuardCheckFn, 0);
4899 Info.OrigRet = {Register(), FnTy->getReturnType()};
4900 if (!CLI->lowerCall(MIRBuilder, Info)) {
4901 LLVM_DEBUG(dbgs() << "Failed to lower call to stack protector check\n");
4902 return false;
4903 }
4904 return true;
4905#endif
4906 }
4907
4908 // If useLoadStackGuardNode returns true, generate LOAD_STACK_GUARD.
4909 // Otherwise, emit a volatile load to retrieve the stack guard value.
4910 if (TLI->useLoadStackGuardNode(*ParentBB->getBasicBlock()->getModule())) {
4911 Guard = MRI->createGenericVirtualRegister(PtrMemTy);
4912 getStackGuard(Guard, *CurBuilder);
4913 } else {
4914 // TODO: test using android subtarget when we support @llvm.thread.pointer.
4915 const Value *IRGuard = TLI->getSDagStackGuard(M, *Libcalls);
4916 Register GuardPtr = getOrCreateVReg(*IRGuard);
4917
4918 Guard = CurBuilder
4919 ->buildLoad(PtrMemTy, GuardPtr,
4920 MachinePointerInfo::getFixedStack(*MF, FI), Align,
4923 .getReg(0);
4924 }
4925
4926 // Perform the comparison.
4927 auto Cmp =
4928 CurBuilder->buildICmp(CmpInst::ICMP_NE, LLT::integer(1), Guard, GuardVal);
4929 // If the guard/stackslot do not equal, branch to failure MBB.
4930 CurBuilder->buildBrCond(Cmp, *SPD.getFailureMBB());
4931 // Otherwise branch to success MBB.
4932 CurBuilder->buildBr(*SPD.getSuccessMBB());
4933 return true;
4934}
4935
4936bool IRTranslatorImpl::emitSPDescriptorFailure(StackProtectorDescriptor &SPD,
4937 MachineBasicBlock *FailureBB) {
4938 const RTLIB::LibcallImpl LibcallImpl =
4939 Libcalls->getLibcallImpl(RTLIB::STACKPROTECTOR_CHECK_FAIL);
4940 if (LibcallImpl == RTLIB::Unsupported)
4941 return false;
4942
4943 CurBuilder->setInsertPt(*FailureBB, FailureBB->end());
4944
4945 CallLowering::CallLoweringInfo Info;
4946 Info.CallConv = Libcalls->getLibcallImplCallingConv(LibcallImpl);
4947
4948 StringRef LibcallName =
4950 Info.Callee = MachineOperand::CreateES(LibcallName.data());
4951 Info.OrigRet = {Register(), Type::getVoidTy(MF->getFunction().getContext()),
4952 0};
4953 if (!CLI->lowerCall(*CurBuilder, Info)) {
4954 LLVM_DEBUG(dbgs() << "Failed to lower call to stack protector fail\n");
4955 return false;
4956 }
4957
4958 // Emit a trap instruction if we are required to do so.
4959 const TargetOptions &TargetOpts = TLI->getTargetMachine().Options;
4960 if (TargetOpts.TrapUnreachable && !TargetOpts.NoTrapAfterNoreturn)
4961 CurBuilder->buildInstr(TargetOpcode::G_TRAP);
4962
4963 return true;
4964}
4965
4966void IRTranslatorImpl::finalizeFunction() {
4967 // Release the memory used by the different maps we
4968 // needed during the translation.
4969 PendingPHIs.clear();
4970 VMap.reset();
4971 FrameIndices.clear();
4972 MachinePreds.clear();
4973 // MachineIRBuilder::DebugLoc can outlive the DILocation it holds. Clear it
4974 // to avoid accessing free’d memory (in runOnMachineFunction) and to avoid
4975 // destroying it twice (in ~IRTranslator() and ~LLVMContext())
4976 EntryBuilder.reset();
4977 CurBuilder.reset();
4978 FuncInfo.clear();
4979 SPDescriptor.resetPerFunctionState();
4980}
4981
4982/// Returns true if a BasicBlock \p BB within a variadic function contains a
4983/// variadic musttail call.
4984static bool checkForMustTailInVarArgFn(bool IsVarArg, const BasicBlock &BB) {
4985 if (!IsVarArg)
4986 return false;
4987
4988 // Walk the block backwards, because tail calls usually only appear at the end
4989 // of a block.
4990 return llvm::any_of(llvm::reverse(BB), [](const Instruction &I) {
4991 const auto *CI = dyn_cast<CallInst>(&I);
4992 return CI && CI->isMustTailCall();
4993 });
4994}
4995
4997 MachineFunction &CurMF, function_ref<GISelCSEInfo *()> GetCSEInfo,
4998 bool ShouldSkipOpts, function_ref<AAResults *()> GetAAResults,
5000 function_ref<AssumptionCache *()> GetAC, TargetLibraryInfo *LibraryInfo,
5001 const LibcallLoweringInfo *LibcallInfo, SSPLayoutInfo *StackProtectorInfo) {
5002 MF = &CurMF;
5003 const Function &F = MF->getFunction();
5004 ORE = std::make_unique<OptimizationRemarkEmitter>(&F);
5005 CLI = MF->getSubtarget().getCallLowering();
5006 SPInfo = StackProtectorInfo;
5007
5008 if (CLI->fallBackToDAGISel(*MF)) {
5009 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
5010 F.getSubprogram(), &F.getEntryBlock());
5011 R << "unable to lower function: "
5012 << ore::NV("Prototype", F.getFunctionType());
5013
5014 reportTranslationError(*MF, *ORE, R);
5015 return false;
5016 }
5017
5018 // Set the CSEConfig and run the analysis.
5019 GISelCSEInfo *CSEInfo = nullptr;
5020
5021 bool EnableCSE = EnableCSEInIRTranslator.getNumOccurrences()
5023 : true;
5024
5025 const TargetSubtargetInfo &Subtarget = MF->getSubtarget();
5026 TLI = Subtarget.getTargetLowering();
5027
5028 if (EnableCSE) {
5029 EntryBuilder = std::make_unique<CSEMIRBuilder>(CurMF);
5030 CSEInfo = GetCSEInfo();
5031 EntryBuilder->setCSEInfo(CSEInfo);
5032 CurBuilder = std::make_unique<CSEMIRBuilder>(CurMF);
5033 CurBuilder->setCSEInfo(CSEInfo);
5034 } else {
5035 EntryBuilder = std::make_unique<MachineIRBuilder>();
5036 CurBuilder = std::make_unique<MachineIRBuilder>();
5037 }
5038 CLI = Subtarget.getCallLowering();
5039 CurBuilder->setMF(*MF);
5040 EntryBuilder->setMF(*MF);
5041 MRI = &MF->getRegInfo();
5042 DL = &F.getDataLayout();
5043 const TargetMachine &TM = MF->getTarget();
5044 EnableOpts = OptLevel != CodeGenOptLevel::None && !ShouldSkipOpts;
5045 FuncInfo.MF = MF;
5046 if (EnableOpts) {
5047 AA = GetAAResults();
5048 FuncInfo.BPI = GetBPI();
5049 AC = GetAC();
5050 } else {
5051 AA = nullptr;
5052 FuncInfo.BPI = nullptr;
5053 AC = nullptr;
5054 }
5055 LibInfo = LibraryInfo;
5056 Libcalls = LibcallInfo;
5057
5058 FuncInfo.CanLowerReturn = CLI->checkReturnTypeForCallConv(*MF);
5059
5060 SL = std::make_unique<GISelSwitchLowering>(this, FuncInfo);
5061 SL->init(*TLI, TM, *DL);
5062
5063 assert(PendingPHIs.empty() && "stale PHIs");
5064
5065 // Targets which want to use big endian can enable it using
5066 // enableBigEndian()
5067 if (!DL->isLittleEndian() && !CLI->enableBigEndian()) {
5068 // Currently we don't properly handle big endian code.
5069 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
5070 F.getSubprogram(), &F.getEntryBlock());
5071 R << "unable to translate in big endian mode";
5072 reportTranslationError(*MF, *ORE, R);
5073 return false;
5074 }
5075
5076 // Release the per-function state when we return, whether we succeeded or not.
5077 llvm::scope_exit FinalizeOnReturn([this]() { finalizeFunction(); });
5078
5079 // Setup a separate basic-block for the arguments and constants
5080 MachineBasicBlock *EntryBB = MF->CreateMachineBasicBlock();
5081 MF->push_back(EntryBB);
5082 EntryBuilder->setMBB(*EntryBB);
5083
5084 DebugLoc DbgLoc = F.getEntryBlock().getFirstNonPHIIt()->getDebugLoc();
5085 SwiftError.setFunction(CurMF);
5086 SwiftError.createEntriesInEntryBlock(DbgLoc);
5087
5088 bool IsVarArg = F.isVarArg();
5089 bool HasMustTailInVarArgFn = false;
5090
5091 // Create all blocks, in IR order, to preserve the layout.
5092 FuncInfo.MBBMap.resize(F.getMaxBlockNumber());
5093 for (const BasicBlock &BB: F) {
5094 auto *&MBB = FuncInfo.MBBMap[BB.getNumber()];
5095
5096 MBB = MF->CreateMachineBasicBlock(&BB);
5097 MF->push_back(MBB);
5098
5099 // Only mark the block if the BlockAddress actually has users. The
5100 // hasAddressTaken flag may be stale if the BlockAddress was optimized away
5101 // but the constant still exists in the uniquing table.
5102 if (BB.hasAddressTaken()) {
5103 if (BlockAddress *BA = BlockAddress::lookup(&BB))
5104 if (!BA->hasZeroLiveUses())
5105 MBB->setAddressTakenIRBlock(const_cast<BasicBlock *>(&BB));
5106 }
5107
5108 if (!HasMustTailInVarArgFn)
5109 HasMustTailInVarArgFn = checkForMustTailInVarArgFn(IsVarArg, BB);
5110 }
5111
5112 MF->getFrameInfo().setHasMustTailInVarArgFunc(HasMustTailInVarArgFn);
5113
5114 // Make our arguments/constants entry block fallthrough to the IR entry block.
5115 EntryBB->addSuccessor(&getMBB(F.front()));
5116
5117 // Lower the actual args into this basic block.
5118 SmallVector<ArrayRef<Register>, 8> VRegArgs;
5119 for (const Argument &Arg: F.args()) {
5120 if (DL->getTypeStoreSize(Arg.getType()).isZero())
5121 continue; // Don't handle zero sized types.
5122 ArrayRef<Register> VRegs = getOrCreateVRegs(Arg);
5123 VRegArgs.push_back(VRegs);
5124
5125 if (CLI->supportSwiftError() && Arg.hasSwiftErrorAttr()) {
5126 assert(VRegs.size() == 1 && "Too many vregs for Swift error");
5127 SwiftError.setCurrentVReg(EntryBB, SwiftError.getFunctionArg(), VRegs[0]);
5128 }
5129 }
5130
5131 if (!CLI->lowerFormalArguments(*EntryBuilder, F, VRegArgs, FuncInfo)) {
5132 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
5133 F.getSubprogram(), &F.getEntryBlock());
5134 R << "unable to lower arguments: "
5135 << ore::NV("Prototype", F.getFunctionType());
5136 reportTranslationError(*MF, *ORE, R);
5137 return false;
5138 }
5139
5140 // Need to visit defs before uses when translating instructions.
5141 GISelObserverWrapper WrapperObserver;
5142 if (EnableCSE && CSEInfo)
5143 WrapperObserver.addObserver(CSEInfo);
5144 {
5146#ifndef NDEBUG
5147 DILocationVerifier Verifier;
5148 WrapperObserver.addObserver(&Verifier);
5149#endif // ifndef NDEBUG
5150 RAIIMFObsDelInstaller ObsInstall(*MF, WrapperObserver);
5151 for (const BasicBlock *BB : RPOT) {
5152 MachineBasicBlock &MBB = getMBB(*BB);
5153 // Set the insertion point of all the following translations to
5154 // the end of this basic block.
5155 CurBuilder->setMBB(MBB);
5156 HasTailCall = false;
5157 for (const Instruction &Inst : *BB) {
5158 // If we translated a tail call in the last step, then we know
5159 // everything after the call is either a return, or something that is
5160 // handled by the call itself. (E.g. a lifetime marker or assume
5161 // intrinsic.) In this case, we should stop translating the block and
5162 // move on.
5163 if (HasTailCall)
5164 break;
5165#ifndef NDEBUG
5166 Verifier.setCurrentInst(&Inst);
5167#endif // ifndef NDEBUG
5168
5169 // Translate any debug-info attached to the instruction.
5170 translateDbgInfo(Inst, *CurBuilder);
5171
5172 if (translate(Inst))
5173 continue;
5174
5175 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
5176 Inst.getDebugLoc(), BB);
5177 R << "unable to translate instruction: " << ore::NV("Opcode", &Inst);
5178
5179 if (ORE->allowExtraAnalysis("gisel-irtranslator")) {
5180 std::string InstStrStorage;
5181 raw_string_ostream InstStr(InstStrStorage);
5182 InstStr << Inst;
5183
5184 R << ": '" << InstStrStorage << "'";
5185 }
5186
5187 reportTranslationError(*MF, *ORE, R);
5188 return false;
5189 }
5190
5191 if (!finalizeBasicBlock(*BB, MBB)) {
5192 OptimizationRemarkMissed R("gisel-irtranslator", "GISelFailure",
5193 BB->getTerminator()->getDebugLoc(), BB);
5194 R << "unable to translate basic block";
5195 reportTranslationError(*MF, *ORE, R);
5196 return false;
5197 }
5198 }
5199#ifndef NDEBUG
5200 WrapperObserver.removeObserver(&Verifier);
5201#endif
5202 }
5203
5204 finishPendingPhis();
5205
5206 SwiftError.propagateVRegs();
5207
5208 // Merge the argument lowering and constants block with its single
5209 // successor, the LLVM-IR entry block. We want the basic block to
5210 // be maximal.
5211 assert(EntryBB->succ_size() == 1 &&
5212 "Custom BB used for lowering should have only one successor");
5213 // Get the successor of the current entry block.
5214 MachineBasicBlock &NewEntryBB = **EntryBB->succ_begin();
5215 assert(NewEntryBB.pred_size() == 1 &&
5216 "LLVM-IR entry block has a predecessor!?");
5217 // Move all the instruction from the current entry block to the
5218 // new entry block.
5219 NewEntryBB.splice(NewEntryBB.begin(), EntryBB, EntryBB->begin(),
5220 EntryBB->end());
5221
5222 // Update the live-in information for the new entry block.
5223 for (const MachineBasicBlock::RegisterMaskPair &LiveIn : EntryBB->liveins())
5224 NewEntryBB.addLiveIn(LiveIn);
5225 NewEntryBB.sortUniqueLiveIns();
5226
5227 // Get rid of the now empty basic block.
5228 EntryBB->removeSuccessor(&NewEntryBB);
5229 MF->remove(EntryBB);
5230 MF->deleteMachineBasicBlock(EntryBB);
5231
5232 assert(&MF->front() == &NewEntryBB &&
5233 "New entry wasn't next in the list of basic block!");
5234
5235 // Initialize stack protector information.
5236 SPInfo->copyToMachineFrameInfo(MF->getFrameInfo());
5237
5238 return false;
5239}
5240
5242 const TargetSubtargetInfo &Subtarget = MF.getSubtarget();
5243 Function &F = MF.getFunction();
5244
5245 bool ShouldSkipOpts = skipFunction(MF.getFunction());
5246 return Impl->runOnMachineFunction(
5247 MF,
5248 [&]() {
5252 return &Wrapper.get(TPC.getCSEConfig());
5253 },
5254 ShouldSkipOpts,
5255 [&]() { return &getAnalysis<AAResultsWrapperPass>().getAAResults(); },
5256 [&]() {
5258 },
5259 [&]() {
5260 return &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
5261 MF.getFunction());
5262 },
5264 &getAnalysis<LibcallLoweringInfoWrapper>().getLibcallLowering(
5265 *F.getParent(), Subtarget),
5266 &getAnalysis<StackProtector>().getLayoutInfo());
5267}
5268
5270 : Impl(std::make_unique<IRTranslatorImpl>(OptLevel)) {}
5271
5274
5277 const TargetSubtargetInfo &Subtarget = MF.getSubtarget();
5278 Function &F = MF.getFunction();
5279
5280 bool ShouldSkipOpts = MF.getFunction().hasOptNone();
5282 .getManager();
5283 auto &MAMProxy =
5285 const ModuleLibcallLoweringInfo *MLLI =
5286 MAMProxy.getCachedResult<LibcallLoweringModuleAnalysis>(*F.getParent());
5287 if (!MLLI)
5289 "LibcallLoweringModuleAnalysis must be available for IRTranslator");
5290 Impl->runOnMachineFunction(
5291 MF, [&]() { return MFAM.getResult<GISelCSEAnalysis>(MF).get(); },
5292 ShouldSkipOpts, [&]() { return &FAM.getResult<AAManager>(F); },
5293 [&]() { return &FAM.getResult<BranchProbabilityAnalysis>(F); },
5294 [&]() { return &FAM.getResult<AssumptionAnalysis>(F); },
5295 &FAM.getResult<TargetLibraryAnalysis>(F),
5296 &getLibcallLowering(*MLLI, Subtarget),
5297 &FAM.getResult<SSPLayoutAnalysis>(F));
5298
5300}
#define Success
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu aa AMDGPU Address space based Alias Analysis Wrapper
unsigned uint64_t
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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 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
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
FunctionAnalysisManager FAM
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
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Definition Value.cpp:484
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
This file describes how to lower LLVM code to machine code.
Target-Independent Code Generator Pass Configuration Options pass.
Value * RHS
Value * LHS
A manager for alias analyses.
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:1077
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.
LLVM_ABI TypeSize getAllocationBaseSize(const DataLayout &DL) const
Get the size of the allocated type.
PointerType * getType() const
Overload to return most specific pointer type.
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.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
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
LLVM_ABI bool hasSwiftErrorAttr() const
Return true if this argument has the swifterror attribute.
Definition Function.cpp:150
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
@ 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
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
@ 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:672
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:1088
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
Legacy analysis pass which computes BlockFrequencyInfo.
Analysis pass which computes BranchProbabilityInfo.
Legacy analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
static constexpr BranchProbability getOne()
static constexpr BranchProbability getUnknown()
static constexpr 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:740
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
bool isFPPredicate() const
Definition InstrTypes.h:845
bool isIntPredicate() const
Definition InstrTypes.h:846
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
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:126
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
Definition DenseMap.h:134
Class representing an expression and its matching format.
This instruction extracts a struct member or array element value from an aggregate value.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:867
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
Definition Pass.cpp:196
const BasicBlock & getEntryBlock() const
Definition Function.h:794
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition Function.h:696
Constant * getPersonalityFn() const
Get the personality function associated with this function.
const Function & getFunction() const
Definition Function.h:167
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:252
bool hasOptNone() const
Do not optimize this function (-O0).
Definition Function.h:686
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:356
The actual analysis pass wrapper.
Definition CSEInfo.h:244
Simple wrapper that does the following.
Definition CSEInfo.h:214
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
IRTranslatorImpl(CodeGenOptLevel OptLevel=CodeGenOptLevel::None)
bool runOnMachineFunction(MachineFunction &MF, function_ref< GISelCSEInfo *()> GetCSEInfo, bool ShouldSkipOpts, function_ref< AAResults *()> GetAAResults, function_ref< BranchProbabilityInfo *()> GetBPI, function_ref< AssumptionCache *()> GetAC, TargetLibraryInfo *LibraryInfo, const LibcallLoweringInfo *LibcallInfo, SSPLayoutInfo *StackProtectorInfo)
IRTranslatorLegacy(CodeGenOptLevel OptLevel=CodeGenOptLevel::None)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
~IRTranslatorLegacy() override
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
IRTranslatorPass(CodeGenOptLevel OptLevel)
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.
static bool getUseExtended()
constexpr bool isScalar() const
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.
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.
static constexpr LLT token()
Get a low-level token; just a scalar with zero bits (or no size).
static LLT integer(unsigned SizeInBits)
LLT changeElementSize(unsigned NewEltSize) const
If this type is a vector, return a vector with the same number of elements but the new element size.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
Tracks which library functions to use for a particular subtarget or function.
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:1567
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.
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
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.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
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)
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)
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI Register createGenericVirtualRegister(LLT Ty, StringRef Name="")
Create and return a new generic virtual register with low-level type Ty.
Records a mapping from an opaque lowering context to its LibcallLoweringInfo.
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(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
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.
A BumpPtrAllocator that allows only elements of a specific type to be allocated.
Definition Allocator.h:397
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
Check if the string is empty.
Definition StringRef.h:141
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
SwitchLowering(FunctionLoweringInfo &funcinfo)
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
Primary interface to the complete machine description for the target machine.
const Triple & getTargetTriple() const
TargetOptions Options
const Target & getTarget() const
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.
virtual std::unique_ptr< CSEConfigBase > getCSEConfig() const
Returns the CSEConfig object to use for the current optimization level.
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:974
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:46
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
bool isByteTy() const
True if this is an instance of ByteType.
Definition Type.h:242
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition Type.h:326
bool isAggregateType() const
Return true if the type is an aggregate type.
Definition Type.h:319
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:236
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
BasicBlock * getSuccessor(unsigned i=0) const
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:255
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:258
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:713
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
An efficient, type-erasing, non-owning reference to a callable.
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.
Pass manager infrastructure for declaring and invalidating analyses.
#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.
@ 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_Value()
Match an arbitrary value and ignore it.
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
Offsets
Offsets in bytes from the start of the input buffer.
LLVM_ABI 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:51
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.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:315
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
@ Offset
Definition DWP.cpp:577
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
@ 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:315
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:244
gep_type_iterator gep_type_end(const User *GEP)
LLVM_ABI 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.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:156
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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:204
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
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:240
constexpr bool has_single_bit(T Value) noexcept
Definition bit.h:149
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:407
LLVM_ABI const LibcallLoweringInfo & getLibcallLowering(const ModuleLibcallLoweringInfo &ModuleInfo, const TargetSubtargetInfo &Subtarget)
Resolve the LibcallLoweringInfo for Subtarget from the module-level ModuleInfo, applying the subtarge...
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
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:209
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:149
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:1137
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.
IntPtrTy
Definition InstrProf.h:82
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)
LLVM_ABI 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
LLVM_ABI 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.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
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.