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