xref: /llvm-project/llvm/lib/CodeGen/GlobalISel/Utils.cpp (revision 5c348f692a8dff98a3780d0b859fb0949eccbaca)
1 //===- llvm/CodeGen/GlobalISel/Utils.cpp -------------------------*- 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 This file implements the utility functions used by the GlobalISel
9 /// pipeline.
10 //===----------------------------------------------------------------------===//
11 
12 #include "llvm/CodeGen/GlobalISel/Utils.h"
13 #include "llvm/ADT/APFloat.h"
14 #include "llvm/ADT/APInt.h"
15 #include "llvm/Analysis/ValueTracking.h"
16 #include "llvm/CodeGen/CodeGenCommonISel.h"
17 #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
18 #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
19 #include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
20 #include "llvm/CodeGen/GlobalISel/LostDebugLocObserver.h"
21 #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
22 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
23 #include "llvm/CodeGen/MachineInstr.h"
24 #include "llvm/CodeGen/MachineInstrBuilder.h"
25 #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
26 #include "llvm/CodeGen/MachineRegisterInfo.h"
27 #include "llvm/CodeGen/MachineSizeOpts.h"
28 #include "llvm/CodeGen/RegisterBankInfo.h"
29 #include "llvm/CodeGen/StackProtector.h"
30 #include "llvm/CodeGen/TargetInstrInfo.h"
31 #include "llvm/CodeGen/TargetLowering.h"
32 #include "llvm/CodeGen/TargetOpcodes.h"
33 #include "llvm/CodeGen/TargetPassConfig.h"
34 #include "llvm/CodeGen/TargetRegisterInfo.h"
35 #include "llvm/IR/Constants.h"
36 #include "llvm/Target/TargetMachine.h"
37 #include "llvm/Transforms/Utils/SizeOpts.h"
38 #include <numeric>
39 #include <optional>
40 
41 #define DEBUG_TYPE "globalisel-utils"
42 
43 using namespace llvm;
44 using namespace MIPatternMatch;
45 
46 Register llvm::constrainRegToClass(MachineRegisterInfo &MRI,
47                                    const TargetInstrInfo &TII,
48                                    const RegisterBankInfo &RBI, Register Reg,
49                                    const TargetRegisterClass &RegClass) {
50   if (!RBI.constrainGenericRegister(Reg, RegClass, MRI))
51     return MRI.createVirtualRegister(&RegClass);
52 
53   return Reg;
54 }
55 
56 Register llvm::constrainOperandRegClass(
57     const MachineFunction &MF, const TargetRegisterInfo &TRI,
58     MachineRegisterInfo &MRI, const TargetInstrInfo &TII,
59     const RegisterBankInfo &RBI, MachineInstr &InsertPt,
60     const TargetRegisterClass &RegClass, MachineOperand &RegMO) {
61   Register Reg = RegMO.getReg();
62   // Assume physical registers are properly constrained.
63   assert(Reg.isVirtual() && "PhysReg not implemented");
64 
65   // Save the old register class to check whether
66   // the change notifications will be required.
67   // TODO: A better approach would be to pass
68   // the observers to constrainRegToClass().
69   auto *OldRegClass = MRI.getRegClassOrNull(Reg);
70   Register ConstrainedReg = constrainRegToClass(MRI, TII, RBI, Reg, RegClass);
71   // If we created a new virtual register because the class is not compatible
72   // then create a copy between the new and the old register.
73   if (ConstrainedReg != Reg) {
74     MachineBasicBlock::iterator InsertIt(&InsertPt);
75     MachineBasicBlock &MBB = *InsertPt.getParent();
76     // FIXME: The copy needs to have the classes constrained for its operands.
77     // Use operand's regbank to get the class for old register (Reg).
78     if (RegMO.isUse()) {
79       BuildMI(MBB, InsertIt, InsertPt.getDebugLoc(),
80               TII.get(TargetOpcode::COPY), ConstrainedReg)
81           .addReg(Reg);
82     } else {
83       assert(RegMO.isDef() && "Must be a definition");
84       BuildMI(MBB, std::next(InsertIt), InsertPt.getDebugLoc(),
85               TII.get(TargetOpcode::COPY), Reg)
86           .addReg(ConstrainedReg);
87     }
88     if (GISelChangeObserver *Observer = MF.getObserver()) {
89       Observer->changingInstr(*RegMO.getParent());
90     }
91     RegMO.setReg(ConstrainedReg);
92     if (GISelChangeObserver *Observer = MF.getObserver()) {
93       Observer->changedInstr(*RegMO.getParent());
94     }
95   } else if (OldRegClass != MRI.getRegClassOrNull(Reg)) {
96     if (GISelChangeObserver *Observer = MF.getObserver()) {
97       if (!RegMO.isDef()) {
98         MachineInstr *RegDef = MRI.getVRegDef(Reg);
99         Observer->changedInstr(*RegDef);
100       }
101       Observer->changingAllUsesOfReg(MRI, Reg);
102       Observer->finishedChangingAllUsesOfReg();
103     }
104   }
105   return ConstrainedReg;
106 }
107 
108 Register llvm::constrainOperandRegClass(
109     const MachineFunction &MF, const TargetRegisterInfo &TRI,
110     MachineRegisterInfo &MRI, const TargetInstrInfo &TII,
111     const RegisterBankInfo &RBI, MachineInstr &InsertPt, const MCInstrDesc &II,
112     MachineOperand &RegMO, unsigned OpIdx) {
113   Register Reg = RegMO.getReg();
114   // Assume physical registers are properly constrained.
115   assert(Reg.isVirtual() && "PhysReg not implemented");
116 
117   const TargetRegisterClass *OpRC = TII.getRegClass(II, OpIdx, &TRI, MF);
118   // Some of the target independent instructions, like COPY, may not impose any
119   // register class constraints on some of their operands: If it's a use, we can
120   // skip constraining as the instruction defining the register would constrain
121   // it.
122 
123   if (OpRC) {
124     // Obtain the RC from incoming regbank if it is a proper sub-class. Operands
125     // can have multiple regbanks for a superclass that combine different
126     // register types (E.g., AMDGPU's VGPR and AGPR). The regbank ambiguity
127     // resolved by targets during regbankselect should not be overridden.
128     if (const auto *SubRC = TRI.getCommonSubClass(
129             OpRC, TRI.getConstrainedRegClassForOperand(RegMO, MRI)))
130       OpRC = SubRC;
131 
132     OpRC = TRI.getAllocatableClass(OpRC);
133   }
134 
135   if (!OpRC) {
136     assert((!isTargetSpecificOpcode(II.getOpcode()) || RegMO.isUse()) &&
137            "Register class constraint is required unless either the "
138            "instruction is target independent or the operand is a use");
139     // FIXME: Just bailing out like this here could be not enough, unless we
140     // expect the users of this function to do the right thing for PHIs and
141     // COPY:
142     //   v1 = COPY v0
143     //   v2 = COPY v1
144     // v1 here may end up not being constrained at all. Please notice that to
145     // reproduce the issue we likely need a destination pattern of a selection
146     // rule producing such extra copies, not just an input GMIR with them as
147     // every existing target using selectImpl handles copies before calling it
148     // and they never reach this function.
149     return Reg;
150   }
151   return constrainOperandRegClass(MF, TRI, MRI, TII, RBI, InsertPt, *OpRC,
152                                   RegMO);
153 }
154 
155 bool llvm::constrainSelectedInstRegOperands(MachineInstr &I,
156                                             const TargetInstrInfo &TII,
157                                             const TargetRegisterInfo &TRI,
158                                             const RegisterBankInfo &RBI) {
159   assert(!isPreISelGenericOpcode(I.getOpcode()) &&
160          "A selected instruction is expected");
161   MachineBasicBlock &MBB = *I.getParent();
162   MachineFunction &MF = *MBB.getParent();
163   MachineRegisterInfo &MRI = MF.getRegInfo();
164 
165   for (unsigned OpI = 0, OpE = I.getNumExplicitOperands(); OpI != OpE; ++OpI) {
166     MachineOperand &MO = I.getOperand(OpI);
167 
168     // There's nothing to be done on non-register operands.
169     if (!MO.isReg())
170       continue;
171 
172     LLVM_DEBUG(dbgs() << "Converting operand: " << MO << '\n');
173     assert(MO.isReg() && "Unsupported non-reg operand");
174 
175     Register Reg = MO.getReg();
176     // Physical registers don't need to be constrained.
177     if (Reg.isPhysical())
178       continue;
179 
180     // Register operands with a value of 0 (e.g. predicate operands) don't need
181     // to be constrained.
182     if (Reg == 0)
183       continue;
184 
185     // If the operand is a vreg, we should constrain its regclass, and only
186     // insert COPYs if that's impossible.
187     // constrainOperandRegClass does that for us.
188     constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, I.getDesc(), MO, OpI);
189 
190     // Tie uses to defs as indicated in MCInstrDesc if this hasn't already been
191     // done.
192     if (MO.isUse()) {
193       int DefIdx = I.getDesc().getOperandConstraint(OpI, MCOI::TIED_TO);
194       if (DefIdx != -1 && !I.isRegTiedToUseOperand(DefIdx))
195         I.tieOperands(DefIdx, OpI);
196     }
197   }
198   return true;
199 }
200 
201 bool llvm::canReplaceReg(Register DstReg, Register SrcReg,
202                          MachineRegisterInfo &MRI) {
203   // Give up if either DstReg or SrcReg  is a physical register.
204   if (DstReg.isPhysical() || SrcReg.isPhysical())
205     return false;
206   // Give up if the types don't match.
207   if (MRI.getType(DstReg) != MRI.getType(SrcReg))
208     return false;
209   // Replace if either DstReg has no constraints or the register
210   // constraints match.
211   const auto &DstRBC = MRI.getRegClassOrRegBank(DstReg);
212   if (!DstRBC || DstRBC == MRI.getRegClassOrRegBank(SrcReg))
213     return true;
214 
215   // Otherwise match if the Src is already a regclass that is covered by the Dst
216   // RegBank.
217   return DstRBC.is<const RegisterBank *>() && MRI.getRegClassOrNull(SrcReg) &&
218          DstRBC.get<const RegisterBank *>()->covers(
219              *MRI.getRegClassOrNull(SrcReg));
220 }
221 
222 bool llvm::isTriviallyDead(const MachineInstr &MI,
223                            const MachineRegisterInfo &MRI) {
224   // Instructions without side-effects are dead iff they only define dead regs.
225   // This function is hot and this loop returns early in the common case,
226   // so only perform additional checks before this if absolutely necessary.
227   for (const auto &MO : MI.all_defs()) {
228     Register Reg = MO.getReg();
229     if (Reg.isPhysical() || !MRI.use_nodbg_empty(Reg))
230       return false;
231   }
232   return MI.wouldBeTriviallyDead();
233 }
234 
235 static void reportGISelDiagnostic(DiagnosticSeverity Severity,
236                                   MachineFunction &MF,
237                                   const TargetPassConfig &TPC,
238                                   MachineOptimizationRemarkEmitter &MORE,
239                                   MachineOptimizationRemarkMissed &R) {
240   bool IsFatal = Severity == DS_Error &&
241                  TPC.isGlobalISelAbortEnabled();
242   // Print the function name explicitly if we don't have a debug location (which
243   // makes the diagnostic less useful) or if we're going to emit a raw error.
244   if (!R.getLocation().isValid() || IsFatal)
245     R << (" (in function: " + MF.getName() + ")").str();
246 
247   if (IsFatal)
248     report_fatal_error(Twine(R.getMsg()));
249   else
250     MORE.emit(R);
251 }
252 
253 void llvm::reportGISelWarning(MachineFunction &MF, const TargetPassConfig &TPC,
254                               MachineOptimizationRemarkEmitter &MORE,
255                               MachineOptimizationRemarkMissed &R) {
256   reportGISelDiagnostic(DS_Warning, MF, TPC, MORE, R);
257 }
258 
259 void llvm::reportGISelFailure(MachineFunction &MF, const TargetPassConfig &TPC,
260                               MachineOptimizationRemarkEmitter &MORE,
261                               MachineOptimizationRemarkMissed &R) {
262   MF.getProperties().set(MachineFunctionProperties::Property::FailedISel);
263   reportGISelDiagnostic(DS_Error, MF, TPC, MORE, R);
264 }
265 
266 void llvm::reportGISelFailure(MachineFunction &MF, const TargetPassConfig &TPC,
267                               MachineOptimizationRemarkEmitter &MORE,
268                               const char *PassName, StringRef Msg,
269                               const MachineInstr &MI) {
270   MachineOptimizationRemarkMissed R(PassName, "GISelFailure: ",
271                                     MI.getDebugLoc(), MI.getParent());
272   R << Msg;
273   // Printing MI is expensive;  only do it if expensive remarks are enabled.
274   if (TPC.isGlobalISelAbortEnabled() || MORE.allowExtraAnalysis(PassName))
275     R << ": " << ore::MNV("Inst", MI);
276   reportGISelFailure(MF, TPC, MORE, R);
277 }
278 
279 std::optional<APInt> llvm::getIConstantVRegVal(Register VReg,
280                                                const MachineRegisterInfo &MRI) {
281   std::optional<ValueAndVReg> ValAndVReg = getIConstantVRegValWithLookThrough(
282       VReg, MRI, /*LookThroughInstrs*/ false);
283   assert((!ValAndVReg || ValAndVReg->VReg == VReg) &&
284          "Value found while looking through instrs");
285   if (!ValAndVReg)
286     return std::nullopt;
287   return ValAndVReg->Value;
288 }
289 
290 APInt llvm::getIConstantFromReg(Register Reg, const MachineRegisterInfo &MRI) {
291   MachineInstr *Const = MRI.getVRegDef(Reg);
292   assert((Const && Const->getOpcode() == TargetOpcode::G_CONSTANT) &&
293          "expected a G_CONSTANT on Reg");
294   return Const->getOperand(1).getCImm()->getValue();
295 }
296 
297 std::optional<int64_t>
298 llvm::getIConstantVRegSExtVal(Register VReg, const MachineRegisterInfo &MRI) {
299   std::optional<APInt> Val = getIConstantVRegVal(VReg, MRI);
300   if (Val && Val->getBitWidth() <= 64)
301     return Val->getSExtValue();
302   return std::nullopt;
303 }
304 
305 namespace {
306 
307 // This function is used in many places, and as such, it has some
308 // micro-optimizations to try and make it as fast as it can be.
309 //
310 // - We use template arguments to avoid an indirect call caused by passing a
311 // function_ref/std::function
312 // - GetAPCstValue does not return std::optional<APInt> as that's expensive.
313 // Instead it returns true/false and places the result in a pre-constructed
314 // APInt.
315 //
316 // Please change this function carefully and benchmark your changes.
317 template <bool (*IsConstantOpcode)(const MachineInstr *),
318           bool (*GetAPCstValue)(const MachineInstr *MI, APInt &)>
319 std::optional<ValueAndVReg>
320 getConstantVRegValWithLookThrough(Register VReg, const MachineRegisterInfo &MRI,
321                                   bool LookThroughInstrs = true,
322                                   bool LookThroughAnyExt = false) {
323   SmallVector<std::pair<unsigned, unsigned>, 4> SeenOpcodes;
324   MachineInstr *MI;
325 
326   while ((MI = MRI.getVRegDef(VReg)) && !IsConstantOpcode(MI) &&
327          LookThroughInstrs) {
328     switch (MI->getOpcode()) {
329     case TargetOpcode::G_ANYEXT:
330       if (!LookThroughAnyExt)
331         return std::nullopt;
332       [[fallthrough]];
333     case TargetOpcode::G_TRUNC:
334     case TargetOpcode::G_SEXT:
335     case TargetOpcode::G_ZEXT:
336       SeenOpcodes.push_back(std::make_pair(
337           MI->getOpcode(),
338           MRI.getType(MI->getOperand(0).getReg()).getSizeInBits()));
339       VReg = MI->getOperand(1).getReg();
340       break;
341     case TargetOpcode::COPY:
342       VReg = MI->getOperand(1).getReg();
343       if (VReg.isPhysical())
344         return std::nullopt;
345       break;
346     case TargetOpcode::G_INTTOPTR:
347       VReg = MI->getOperand(1).getReg();
348       break;
349     default:
350       return std::nullopt;
351     }
352   }
353   if (!MI || !IsConstantOpcode(MI))
354     return std::nullopt;
355 
356   APInt Val;
357   if (!GetAPCstValue(MI, Val))
358     return std::nullopt;
359   for (auto &Pair : reverse(SeenOpcodes)) {
360     switch (Pair.first) {
361     case TargetOpcode::G_TRUNC:
362       Val = Val.trunc(Pair.second);
363       break;
364     case TargetOpcode::G_ANYEXT:
365     case TargetOpcode::G_SEXT:
366       Val = Val.sext(Pair.second);
367       break;
368     case TargetOpcode::G_ZEXT:
369       Val = Val.zext(Pair.second);
370       break;
371     }
372   }
373 
374   return ValueAndVReg{std::move(Val), VReg};
375 }
376 
377 bool isIConstant(const MachineInstr *MI) {
378   if (!MI)
379     return false;
380   return MI->getOpcode() == TargetOpcode::G_CONSTANT;
381 }
382 
383 bool isFConstant(const MachineInstr *MI) {
384   if (!MI)
385     return false;
386   return MI->getOpcode() == TargetOpcode::G_FCONSTANT;
387 }
388 
389 bool isAnyConstant(const MachineInstr *MI) {
390   if (!MI)
391     return false;
392   unsigned Opc = MI->getOpcode();
393   return Opc == TargetOpcode::G_CONSTANT || Opc == TargetOpcode::G_FCONSTANT;
394 }
395 
396 bool getCImmAsAPInt(const MachineInstr *MI, APInt &Result) {
397   const MachineOperand &CstVal = MI->getOperand(1);
398   if (!CstVal.isCImm())
399     return false;
400   Result = CstVal.getCImm()->getValue();
401   return true;
402 }
403 
404 bool getCImmOrFPImmAsAPInt(const MachineInstr *MI, APInt &Result) {
405   const MachineOperand &CstVal = MI->getOperand(1);
406   if (CstVal.isCImm())
407     Result = CstVal.getCImm()->getValue();
408   else if (CstVal.isFPImm())
409     Result = CstVal.getFPImm()->getValueAPF().bitcastToAPInt();
410   else
411     return false;
412   return true;
413 }
414 
415 } // end anonymous namespace
416 
417 std::optional<ValueAndVReg> llvm::getIConstantVRegValWithLookThrough(
418     Register VReg, const MachineRegisterInfo &MRI, bool LookThroughInstrs) {
419   return getConstantVRegValWithLookThrough<isIConstant, getCImmAsAPInt>(
420       VReg, MRI, LookThroughInstrs);
421 }
422 
423 std::optional<ValueAndVReg> llvm::getAnyConstantVRegValWithLookThrough(
424     Register VReg, const MachineRegisterInfo &MRI, bool LookThroughInstrs,
425     bool LookThroughAnyExt) {
426   return getConstantVRegValWithLookThrough<isAnyConstant,
427                                            getCImmOrFPImmAsAPInt>(
428       VReg, MRI, LookThroughInstrs, LookThroughAnyExt);
429 }
430 
431 std::optional<FPValueAndVReg> llvm::getFConstantVRegValWithLookThrough(
432     Register VReg, const MachineRegisterInfo &MRI, bool LookThroughInstrs) {
433   auto Reg =
434       getConstantVRegValWithLookThrough<isFConstant, getCImmOrFPImmAsAPInt>(
435           VReg, MRI, LookThroughInstrs);
436   if (!Reg)
437     return std::nullopt;
438   return FPValueAndVReg{getConstantFPVRegVal(Reg->VReg, MRI)->getValueAPF(),
439                         Reg->VReg};
440 }
441 
442 const ConstantFP *
443 llvm::getConstantFPVRegVal(Register VReg, const MachineRegisterInfo &MRI) {
444   MachineInstr *MI = MRI.getVRegDef(VReg);
445   if (TargetOpcode::G_FCONSTANT != MI->getOpcode())
446     return nullptr;
447   return MI->getOperand(1).getFPImm();
448 }
449 
450 std::optional<DefinitionAndSourceRegister>
451 llvm::getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI) {
452   Register DefSrcReg = Reg;
453   auto *DefMI = MRI.getVRegDef(Reg);
454   auto DstTy = MRI.getType(DefMI->getOperand(0).getReg());
455   if (!DstTy.isValid())
456     return std::nullopt;
457   unsigned Opc = DefMI->getOpcode();
458   while (Opc == TargetOpcode::COPY || isPreISelGenericOptimizationHint(Opc)) {
459     Register SrcReg = DefMI->getOperand(1).getReg();
460     auto SrcTy = MRI.getType(SrcReg);
461     if (!SrcTy.isValid())
462       break;
463     DefMI = MRI.getVRegDef(SrcReg);
464     DefSrcReg = SrcReg;
465     Opc = DefMI->getOpcode();
466   }
467   return DefinitionAndSourceRegister{DefMI, DefSrcReg};
468 }
469 
470 MachineInstr *llvm::getDefIgnoringCopies(Register Reg,
471                                          const MachineRegisterInfo &MRI) {
472   std::optional<DefinitionAndSourceRegister> DefSrcReg =
473       getDefSrcRegIgnoringCopies(Reg, MRI);
474   return DefSrcReg ? DefSrcReg->MI : nullptr;
475 }
476 
477 Register llvm::getSrcRegIgnoringCopies(Register Reg,
478                                        const MachineRegisterInfo &MRI) {
479   std::optional<DefinitionAndSourceRegister> DefSrcReg =
480       getDefSrcRegIgnoringCopies(Reg, MRI);
481   return DefSrcReg ? DefSrcReg->Reg : Register();
482 }
483 
484 void llvm::extractParts(Register Reg, LLT Ty, int NumParts,
485                         SmallVectorImpl<Register> &VRegs,
486                         MachineIRBuilder &MIRBuilder,
487                         MachineRegisterInfo &MRI) {
488   for (int i = 0; i < NumParts; ++i)
489     VRegs.push_back(MRI.createGenericVirtualRegister(Ty));
490   MIRBuilder.buildUnmerge(VRegs, Reg);
491 }
492 
493 bool llvm::extractParts(Register Reg, LLT RegTy, LLT MainTy, LLT &LeftoverTy,
494                         SmallVectorImpl<Register> &VRegs,
495                         SmallVectorImpl<Register> &LeftoverRegs,
496                         MachineIRBuilder &MIRBuilder,
497                         MachineRegisterInfo &MRI) {
498   assert(!LeftoverTy.isValid() && "this is an out argument");
499 
500   unsigned RegSize = RegTy.getSizeInBits();
501   unsigned MainSize = MainTy.getSizeInBits();
502   unsigned NumParts = RegSize / MainSize;
503   unsigned LeftoverSize = RegSize - NumParts * MainSize;
504 
505   // Use an unmerge when possible.
506   if (LeftoverSize == 0) {
507     for (unsigned I = 0; I < NumParts; ++I)
508       VRegs.push_back(MRI.createGenericVirtualRegister(MainTy));
509     MIRBuilder.buildUnmerge(VRegs, Reg);
510     return true;
511   }
512 
513   // Try to use unmerge for irregular vector split where possible
514   // For example when splitting a <6 x i32> into <4 x i32> with <2 x i32>
515   // leftover, it becomes:
516   //  <2 x i32> %2, <2 x i32>%3, <2 x i32> %4 = G_UNMERGE_VALUE <6 x i32> %1
517   //  <4 x i32> %5 = G_CONCAT_VECTOR <2 x i32> %2, <2 x i32> %3
518   if (RegTy.isVector() && MainTy.isVector()) {
519     unsigned RegNumElts = RegTy.getNumElements();
520     unsigned MainNumElts = MainTy.getNumElements();
521     unsigned LeftoverNumElts = RegNumElts % MainNumElts;
522     // If can unmerge to LeftoverTy, do it
523     if (MainNumElts % LeftoverNumElts == 0 &&
524         RegNumElts % LeftoverNumElts == 0 &&
525         RegTy.getScalarSizeInBits() == MainTy.getScalarSizeInBits() &&
526         LeftoverNumElts > 1) {
527       LeftoverTy =
528           LLT::fixed_vector(LeftoverNumElts, RegTy.getScalarSizeInBits());
529 
530       // Unmerge the SrcReg to LeftoverTy vectors
531       SmallVector<Register, 4> UnmergeValues;
532       extractParts(Reg, LeftoverTy, RegNumElts / LeftoverNumElts, UnmergeValues,
533                    MIRBuilder, MRI);
534 
535       // Find how many LeftoverTy makes one MainTy
536       unsigned LeftoverPerMain = MainNumElts / LeftoverNumElts;
537       unsigned NumOfLeftoverVal =
538           ((RegNumElts % MainNumElts) / LeftoverNumElts);
539 
540       // Create as many MainTy as possible using unmerged value
541       SmallVector<Register, 4> MergeValues;
542       for (unsigned I = 0; I < UnmergeValues.size() - NumOfLeftoverVal; I++) {
543         MergeValues.push_back(UnmergeValues[I]);
544         if (MergeValues.size() == LeftoverPerMain) {
545           VRegs.push_back(
546               MIRBuilder.buildMergeLikeInstr(MainTy, MergeValues).getReg(0));
547           MergeValues.clear();
548         }
549       }
550       // Populate LeftoverRegs with the leftovers
551       for (unsigned I = UnmergeValues.size() - NumOfLeftoverVal;
552            I < UnmergeValues.size(); I++) {
553         LeftoverRegs.push_back(UnmergeValues[I]);
554       }
555       return true;
556     }
557   }
558   // Perform irregular split. Leftover is last element of RegPieces.
559   if (MainTy.isVector()) {
560     SmallVector<Register, 8> RegPieces;
561     extractVectorParts(Reg, MainTy.getNumElements(), RegPieces, MIRBuilder,
562                        MRI);
563     for (unsigned i = 0; i < RegPieces.size() - 1; ++i)
564       VRegs.push_back(RegPieces[i]);
565     LeftoverRegs.push_back(RegPieces[RegPieces.size() - 1]);
566     LeftoverTy = MRI.getType(LeftoverRegs[0]);
567     return true;
568   }
569 
570   LeftoverTy = LLT::scalar(LeftoverSize);
571   // For irregular sizes, extract the individual parts.
572   for (unsigned I = 0; I != NumParts; ++I) {
573     Register NewReg = MRI.createGenericVirtualRegister(MainTy);
574     VRegs.push_back(NewReg);
575     MIRBuilder.buildExtract(NewReg, Reg, MainSize * I);
576   }
577 
578   for (unsigned Offset = MainSize * NumParts; Offset < RegSize;
579        Offset += LeftoverSize) {
580     Register NewReg = MRI.createGenericVirtualRegister(LeftoverTy);
581     LeftoverRegs.push_back(NewReg);
582     MIRBuilder.buildExtract(NewReg, Reg, Offset);
583   }
584 
585   return true;
586 }
587 
588 void llvm::extractVectorParts(Register Reg, unsigned NumElts,
589                               SmallVectorImpl<Register> &VRegs,
590                               MachineIRBuilder &MIRBuilder,
591                               MachineRegisterInfo &MRI) {
592   LLT RegTy = MRI.getType(Reg);
593   assert(RegTy.isVector() && "Expected a vector type");
594 
595   LLT EltTy = RegTy.getElementType();
596   LLT NarrowTy = (NumElts == 1) ? EltTy : LLT::fixed_vector(NumElts, EltTy);
597   unsigned RegNumElts = RegTy.getNumElements();
598   unsigned LeftoverNumElts = RegNumElts % NumElts;
599   unsigned NumNarrowTyPieces = RegNumElts / NumElts;
600 
601   // Perfect split without leftover
602   if (LeftoverNumElts == 0)
603     return extractParts(Reg, NarrowTy, NumNarrowTyPieces, VRegs, MIRBuilder,
604                         MRI);
605 
606   // Irregular split. Provide direct access to all elements for artifact
607   // combiner using unmerge to elements. Then build vectors with NumElts
608   // elements. Remaining element(s) will be (used to build vector) Leftover.
609   SmallVector<Register, 8> Elts;
610   extractParts(Reg, EltTy, RegNumElts, Elts, MIRBuilder, MRI);
611 
612   unsigned Offset = 0;
613   // Requested sub-vectors of NarrowTy.
614   for (unsigned i = 0; i < NumNarrowTyPieces; ++i, Offset += NumElts) {
615     ArrayRef<Register> Pieces(&Elts[Offset], NumElts);
616     VRegs.push_back(MIRBuilder.buildMergeLikeInstr(NarrowTy, Pieces).getReg(0));
617   }
618 
619   // Leftover element(s).
620   if (LeftoverNumElts == 1) {
621     VRegs.push_back(Elts[Offset]);
622   } else {
623     LLT LeftoverTy = LLT::fixed_vector(LeftoverNumElts, EltTy);
624     ArrayRef<Register> Pieces(&Elts[Offset], LeftoverNumElts);
625     VRegs.push_back(
626         MIRBuilder.buildMergeLikeInstr(LeftoverTy, Pieces).getReg(0));
627   }
628 }
629 
630 MachineInstr *llvm::getOpcodeDef(unsigned Opcode, Register Reg,
631                                  const MachineRegisterInfo &MRI) {
632   MachineInstr *DefMI = getDefIgnoringCopies(Reg, MRI);
633   return DefMI && DefMI->getOpcode() == Opcode ? DefMI : nullptr;
634 }
635 
636 APFloat llvm::getAPFloatFromSize(double Val, unsigned Size) {
637   if (Size == 32)
638     return APFloat(float(Val));
639   if (Size == 64)
640     return APFloat(Val);
641   if (Size != 16)
642     llvm_unreachable("Unsupported FPConstant size");
643   bool Ignored;
644   APFloat APF(Val);
645   APF.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
646   return APF;
647 }
648 
649 std::optional<APInt> llvm::ConstantFoldBinOp(unsigned Opcode,
650                                              const Register Op1,
651                                              const Register Op2,
652                                              const MachineRegisterInfo &MRI) {
653   auto MaybeOp2Cst = getAnyConstantVRegValWithLookThrough(Op2, MRI, false);
654   if (!MaybeOp2Cst)
655     return std::nullopt;
656 
657   auto MaybeOp1Cst = getAnyConstantVRegValWithLookThrough(Op1, MRI, false);
658   if (!MaybeOp1Cst)
659     return std::nullopt;
660 
661   const APInt &C1 = MaybeOp1Cst->Value;
662   const APInt &C2 = MaybeOp2Cst->Value;
663   switch (Opcode) {
664   default:
665     break;
666   case TargetOpcode::G_ADD:
667     return C1 + C2;
668   case TargetOpcode::G_PTR_ADD:
669     // Types can be of different width here.
670     // Result needs to be the same width as C1, so trunc or sext C2.
671     return C1 + C2.sextOrTrunc(C1.getBitWidth());
672   case TargetOpcode::G_AND:
673     return C1 & C2;
674   case TargetOpcode::G_ASHR:
675     return C1.ashr(C2);
676   case TargetOpcode::G_LSHR:
677     return C1.lshr(C2);
678   case TargetOpcode::G_MUL:
679     return C1 * C2;
680   case TargetOpcode::G_OR:
681     return C1 | C2;
682   case TargetOpcode::G_SHL:
683     return C1 << C2;
684   case TargetOpcode::G_SUB:
685     return C1 - C2;
686   case TargetOpcode::G_XOR:
687     return C1 ^ C2;
688   case TargetOpcode::G_UDIV:
689     if (!C2.getBoolValue())
690       break;
691     return C1.udiv(C2);
692   case TargetOpcode::G_SDIV:
693     if (!C2.getBoolValue())
694       break;
695     return C1.sdiv(C2);
696   case TargetOpcode::G_UREM:
697     if (!C2.getBoolValue())
698       break;
699     return C1.urem(C2);
700   case TargetOpcode::G_SREM:
701     if (!C2.getBoolValue())
702       break;
703     return C1.srem(C2);
704   case TargetOpcode::G_SMIN:
705     return APIntOps::smin(C1, C2);
706   case TargetOpcode::G_SMAX:
707     return APIntOps::smax(C1, C2);
708   case TargetOpcode::G_UMIN:
709     return APIntOps::umin(C1, C2);
710   case TargetOpcode::G_UMAX:
711     return APIntOps::umax(C1, C2);
712   }
713 
714   return std::nullopt;
715 }
716 
717 std::optional<APFloat>
718 llvm::ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
719                           const Register Op2, const MachineRegisterInfo &MRI) {
720   const ConstantFP *Op2Cst = getConstantFPVRegVal(Op2, MRI);
721   if (!Op2Cst)
722     return std::nullopt;
723 
724   const ConstantFP *Op1Cst = getConstantFPVRegVal(Op1, MRI);
725   if (!Op1Cst)
726     return std::nullopt;
727 
728   APFloat C1 = Op1Cst->getValueAPF();
729   const APFloat &C2 = Op2Cst->getValueAPF();
730   switch (Opcode) {
731   case TargetOpcode::G_FADD:
732     C1.add(C2, APFloat::rmNearestTiesToEven);
733     return C1;
734   case TargetOpcode::G_FSUB:
735     C1.subtract(C2, APFloat::rmNearestTiesToEven);
736     return C1;
737   case TargetOpcode::G_FMUL:
738     C1.multiply(C2, APFloat::rmNearestTiesToEven);
739     return C1;
740   case TargetOpcode::G_FDIV:
741     C1.divide(C2, APFloat::rmNearestTiesToEven);
742     return C1;
743   case TargetOpcode::G_FREM:
744     C1.mod(C2);
745     return C1;
746   case TargetOpcode::G_FCOPYSIGN:
747     C1.copySign(C2);
748     return C1;
749   case TargetOpcode::G_FMINNUM:
750     return minnum(C1, C2);
751   case TargetOpcode::G_FMAXNUM:
752     return maxnum(C1, C2);
753   case TargetOpcode::G_FMINIMUM:
754     return minimum(C1, C2);
755   case TargetOpcode::G_FMAXIMUM:
756     return maximum(C1, C2);
757   case TargetOpcode::G_FMINNUM_IEEE:
758   case TargetOpcode::G_FMAXNUM_IEEE:
759     // FIXME: These operations were unfortunately named. fminnum/fmaxnum do not
760     // follow the IEEE behavior for signaling nans and follow libm's fmin/fmax,
761     // and currently there isn't a nice wrapper in APFloat for the version with
762     // correct snan handling.
763     break;
764   default:
765     break;
766   }
767 
768   return std::nullopt;
769 }
770 
771 SmallVector<APInt>
772 llvm::ConstantFoldVectorBinop(unsigned Opcode, const Register Op1,
773                               const Register Op2,
774                               const MachineRegisterInfo &MRI) {
775   auto *SrcVec2 = getOpcodeDef<GBuildVector>(Op2, MRI);
776   if (!SrcVec2)
777     return SmallVector<APInt>();
778 
779   auto *SrcVec1 = getOpcodeDef<GBuildVector>(Op1, MRI);
780   if (!SrcVec1)
781     return SmallVector<APInt>();
782 
783   SmallVector<APInt> FoldedElements;
784   for (unsigned Idx = 0, E = SrcVec1->getNumSources(); Idx < E; ++Idx) {
785     auto MaybeCst = ConstantFoldBinOp(Opcode, SrcVec1->getSourceReg(Idx),
786                                       SrcVec2->getSourceReg(Idx), MRI);
787     if (!MaybeCst)
788       return SmallVector<APInt>();
789     FoldedElements.push_back(*MaybeCst);
790   }
791   return FoldedElements;
792 }
793 
794 bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,
795                            bool SNaN) {
796   const MachineInstr *DefMI = MRI.getVRegDef(Val);
797   if (!DefMI)
798     return false;
799 
800   const TargetMachine& TM = DefMI->getMF()->getTarget();
801   if (DefMI->getFlag(MachineInstr::FmNoNans) || TM.Options.NoNaNsFPMath)
802     return true;
803 
804   // If the value is a constant, we can obviously see if it is a NaN or not.
805   if (const ConstantFP *FPVal = getConstantFPVRegVal(Val, MRI)) {
806     return !FPVal->getValueAPF().isNaN() ||
807            (SNaN && !FPVal->getValueAPF().isSignaling());
808   }
809 
810   if (DefMI->getOpcode() == TargetOpcode::G_BUILD_VECTOR) {
811     for (const auto &Op : DefMI->uses())
812       if (!isKnownNeverNaN(Op.getReg(), MRI, SNaN))
813         return false;
814     return true;
815   }
816 
817   switch (DefMI->getOpcode()) {
818   default:
819     break;
820   case TargetOpcode::G_FADD:
821   case TargetOpcode::G_FSUB:
822   case TargetOpcode::G_FMUL:
823   case TargetOpcode::G_FDIV:
824   case TargetOpcode::G_FREM:
825   case TargetOpcode::G_FSIN:
826   case TargetOpcode::G_FCOS:
827   case TargetOpcode::G_FTAN:
828   case TargetOpcode::G_FACOS:
829   case TargetOpcode::G_FASIN:
830   case TargetOpcode::G_FATAN:
831   case TargetOpcode::G_FCOSH:
832   case TargetOpcode::G_FSINH:
833   case TargetOpcode::G_FTANH:
834   case TargetOpcode::G_FMA:
835   case TargetOpcode::G_FMAD:
836     if (SNaN)
837       return true;
838 
839     // TODO: Need isKnownNeverInfinity
840     return false;
841   case TargetOpcode::G_FMINNUM_IEEE:
842   case TargetOpcode::G_FMAXNUM_IEEE: {
843     if (SNaN)
844       return true;
845     // This can return a NaN if either operand is an sNaN, or if both operands
846     // are NaN.
847     return (isKnownNeverNaN(DefMI->getOperand(1).getReg(), MRI) &&
848             isKnownNeverSNaN(DefMI->getOperand(2).getReg(), MRI)) ||
849            (isKnownNeverSNaN(DefMI->getOperand(1).getReg(), MRI) &&
850             isKnownNeverNaN(DefMI->getOperand(2).getReg(), MRI));
851   }
852   case TargetOpcode::G_FMINNUM:
853   case TargetOpcode::G_FMAXNUM: {
854     // Only one needs to be known not-nan, since it will be returned if the
855     // other ends up being one.
856     return isKnownNeverNaN(DefMI->getOperand(1).getReg(), MRI, SNaN) ||
857            isKnownNeverNaN(DefMI->getOperand(2).getReg(), MRI, SNaN);
858   }
859   }
860 
861   if (SNaN) {
862     // FP operations quiet. For now, just handle the ones inserted during
863     // legalization.
864     switch (DefMI->getOpcode()) {
865     case TargetOpcode::G_FPEXT:
866     case TargetOpcode::G_FPTRUNC:
867     case TargetOpcode::G_FCANONICALIZE:
868       return true;
869     default:
870       return false;
871     }
872   }
873 
874   return false;
875 }
876 
877 Align llvm::inferAlignFromPtrInfo(MachineFunction &MF,
878                                   const MachinePointerInfo &MPO) {
879   auto PSV = dyn_cast_if_present<const PseudoSourceValue *>(MPO.V);
880   if (auto FSPV = dyn_cast_or_null<FixedStackPseudoSourceValue>(PSV)) {
881     MachineFrameInfo &MFI = MF.getFrameInfo();
882     return commonAlignment(MFI.getObjectAlign(FSPV->getFrameIndex()),
883                            MPO.Offset);
884   }
885 
886   if (const Value *V = dyn_cast_if_present<const Value *>(MPO.V)) {
887     const Module *M = MF.getFunction().getParent();
888     return V->getPointerAlignment(M->getDataLayout());
889   }
890 
891   return Align(1);
892 }
893 
894 Register llvm::getFunctionLiveInPhysReg(MachineFunction &MF,
895                                         const TargetInstrInfo &TII,
896                                         MCRegister PhysReg,
897                                         const TargetRegisterClass &RC,
898                                         const DebugLoc &DL, LLT RegTy) {
899   MachineBasicBlock &EntryMBB = MF.front();
900   MachineRegisterInfo &MRI = MF.getRegInfo();
901   Register LiveIn = MRI.getLiveInVirtReg(PhysReg);
902   if (LiveIn) {
903     MachineInstr *Def = MRI.getVRegDef(LiveIn);
904     if (Def) {
905       // FIXME: Should the verifier check this is in the entry block?
906       assert(Def->getParent() == &EntryMBB && "live-in copy not in entry block");
907       return LiveIn;
908     }
909 
910     // It's possible the incoming argument register and copy was added during
911     // lowering, but later deleted due to being/becoming dead. If this happens,
912     // re-insert the copy.
913   } else {
914     // The live in register was not present, so add it.
915     LiveIn = MF.addLiveIn(PhysReg, &RC);
916     if (RegTy.isValid())
917       MRI.setType(LiveIn, RegTy);
918   }
919 
920   BuildMI(EntryMBB, EntryMBB.begin(), DL, TII.get(TargetOpcode::COPY), LiveIn)
921     .addReg(PhysReg);
922   if (!EntryMBB.isLiveIn(PhysReg))
923     EntryMBB.addLiveIn(PhysReg);
924   return LiveIn;
925 }
926 
927 std::optional<APInt> llvm::ConstantFoldExtOp(unsigned Opcode,
928                                              const Register Op1, uint64_t Imm,
929                                              const MachineRegisterInfo &MRI) {
930   auto MaybeOp1Cst = getIConstantVRegVal(Op1, MRI);
931   if (MaybeOp1Cst) {
932     switch (Opcode) {
933     default:
934       break;
935     case TargetOpcode::G_SEXT_INREG: {
936       LLT Ty = MRI.getType(Op1);
937       return MaybeOp1Cst->trunc(Imm).sext(Ty.getScalarSizeInBits());
938     }
939     }
940   }
941   return std::nullopt;
942 }
943 
944 std::optional<APInt> llvm::ConstantFoldCastOp(unsigned Opcode, LLT DstTy,
945                                               const Register Op0,
946                                               const MachineRegisterInfo &MRI) {
947   std::optional<APInt> Val = getIConstantVRegVal(Op0, MRI);
948   if (!Val)
949     return Val;
950 
951   const unsigned DstSize = DstTy.getScalarSizeInBits();
952 
953   switch (Opcode) {
954   case TargetOpcode::G_SEXT:
955     return Val->sext(DstSize);
956   case TargetOpcode::G_ZEXT:
957   case TargetOpcode::G_ANYEXT:
958     // TODO: DAG considers target preference when constant folding any_extend.
959     return Val->zext(DstSize);
960   default:
961     break;
962   }
963 
964   llvm_unreachable("unexpected cast opcode to constant fold");
965 }
966 
967 std::optional<APFloat>
968 llvm::ConstantFoldIntToFloat(unsigned Opcode, LLT DstTy, Register Src,
969                              const MachineRegisterInfo &MRI) {
970   assert(Opcode == TargetOpcode::G_SITOFP || Opcode == TargetOpcode::G_UITOFP);
971   if (auto MaybeSrcVal = getIConstantVRegVal(Src, MRI)) {
972     APFloat DstVal(getFltSemanticForLLT(DstTy));
973     DstVal.convertFromAPInt(*MaybeSrcVal, Opcode == TargetOpcode::G_SITOFP,
974                             APFloat::rmNearestTiesToEven);
975     return DstVal;
976   }
977   return std::nullopt;
978 }
979 
980 std::optional<SmallVector<unsigned>>
981 llvm::ConstantFoldCountZeros(Register Src, const MachineRegisterInfo &MRI,
982                              std::function<unsigned(APInt)> CB) {
983   LLT Ty = MRI.getType(Src);
984   SmallVector<unsigned> FoldedCTLZs;
985   auto tryFoldScalar = [&](Register R) -> std::optional<unsigned> {
986     auto MaybeCst = getIConstantVRegVal(R, MRI);
987     if (!MaybeCst)
988       return std::nullopt;
989     return CB(*MaybeCst);
990   };
991   if (Ty.isVector()) {
992     // Try to constant fold each element.
993     auto *BV = getOpcodeDef<GBuildVector>(Src, MRI);
994     if (!BV)
995       return std::nullopt;
996     for (unsigned SrcIdx = 0; SrcIdx < BV->getNumSources(); ++SrcIdx) {
997       if (auto MaybeFold = tryFoldScalar(BV->getSourceReg(SrcIdx))) {
998         FoldedCTLZs.emplace_back(*MaybeFold);
999         continue;
1000       }
1001       return std::nullopt;
1002     }
1003     return FoldedCTLZs;
1004   }
1005   if (auto MaybeCst = tryFoldScalar(Src)) {
1006     FoldedCTLZs.emplace_back(*MaybeCst);
1007     return FoldedCTLZs;
1008   }
1009   return std::nullopt;
1010 }
1011 
1012 std::optional<SmallVector<APInt>>
1013 llvm::ConstantFoldICmp(unsigned Pred, const Register Op1, const Register Op2,
1014                        const MachineRegisterInfo &MRI) {
1015   LLT Ty = MRI.getType(Op1);
1016   if (Ty != MRI.getType(Op2))
1017     return std::nullopt;
1018 
1019   auto TryFoldScalar = [&MRI, Pred](Register LHS,
1020                                     Register RHS) -> std::optional<APInt> {
1021     auto LHSCst = getIConstantVRegVal(LHS, MRI);
1022     auto RHSCst = getIConstantVRegVal(RHS, MRI);
1023     if (!LHSCst || !RHSCst)
1024       return std::nullopt;
1025 
1026     switch (Pred) {
1027     case CmpInst::Predicate::ICMP_EQ:
1028       return APInt(/*numBits=*/1, LHSCst->eq(*RHSCst));
1029     case CmpInst::Predicate::ICMP_NE:
1030       return APInt(/*numBits=*/1, LHSCst->ne(*RHSCst));
1031     case CmpInst::Predicate::ICMP_UGT:
1032       return APInt(/*numBits=*/1, LHSCst->ugt(*RHSCst));
1033     case CmpInst::Predicate::ICMP_UGE:
1034       return APInt(/*numBits=*/1, LHSCst->uge(*RHSCst));
1035     case CmpInst::Predicate::ICMP_ULT:
1036       return APInt(/*numBits=*/1, LHSCst->ult(*RHSCst));
1037     case CmpInst::Predicate::ICMP_ULE:
1038       return APInt(/*numBits=*/1, LHSCst->ule(*RHSCst));
1039     case CmpInst::Predicate::ICMP_SGT:
1040       return APInt(/*numBits=*/1, LHSCst->sgt(*RHSCst));
1041     case CmpInst::Predicate::ICMP_SGE:
1042       return APInt(/*numBits=*/1, LHSCst->sge(*RHSCst));
1043     case CmpInst::Predicate::ICMP_SLT:
1044       return APInt(/*numBits=*/1, LHSCst->slt(*RHSCst));
1045     case CmpInst::Predicate::ICMP_SLE:
1046       return APInt(/*numBits=*/1, LHSCst->sle(*RHSCst));
1047     default:
1048       return std::nullopt;
1049     }
1050   };
1051 
1052   SmallVector<APInt> FoldedICmps;
1053 
1054   if (Ty.isVector()) {
1055     // Try to constant fold each element.
1056     auto *BV1 = getOpcodeDef<GBuildVector>(Op1, MRI);
1057     auto *BV2 = getOpcodeDef<GBuildVector>(Op2, MRI);
1058     if (!BV1 || !BV2)
1059       return std::nullopt;
1060     assert(BV1->getNumSources() == BV2->getNumSources() && "Invalid vectors");
1061     for (unsigned I = 0; I < BV1->getNumSources(); ++I) {
1062       if (auto MaybeFold =
1063               TryFoldScalar(BV1->getSourceReg(I), BV2->getSourceReg(I))) {
1064         FoldedICmps.emplace_back(*MaybeFold);
1065         continue;
1066       }
1067       return std::nullopt;
1068     }
1069     return FoldedICmps;
1070   }
1071 
1072   if (auto MaybeCst = TryFoldScalar(Op1, Op2)) {
1073     FoldedICmps.emplace_back(*MaybeCst);
1074     return FoldedICmps;
1075   }
1076 
1077   return std::nullopt;
1078 }
1079 
1080 bool llvm::isKnownToBeAPowerOfTwo(Register Reg, const MachineRegisterInfo &MRI,
1081                                   GISelKnownBits *KB) {
1082   std::optional<DefinitionAndSourceRegister> DefSrcReg =
1083       getDefSrcRegIgnoringCopies(Reg, MRI);
1084   if (!DefSrcReg)
1085     return false;
1086 
1087   const MachineInstr &MI = *DefSrcReg->MI;
1088   const LLT Ty = MRI.getType(Reg);
1089 
1090   switch (MI.getOpcode()) {
1091   case TargetOpcode::G_CONSTANT: {
1092     unsigned BitWidth = Ty.getScalarSizeInBits();
1093     const ConstantInt *CI = MI.getOperand(1).getCImm();
1094     return CI->getValue().zextOrTrunc(BitWidth).isPowerOf2();
1095   }
1096   case TargetOpcode::G_SHL: {
1097     // A left-shift of a constant one will have exactly one bit set because
1098     // shifting the bit off the end is undefined.
1099 
1100     // TODO: Constant splat
1101     if (auto ConstLHS = getIConstantVRegVal(MI.getOperand(1).getReg(), MRI)) {
1102       if (*ConstLHS == 1)
1103         return true;
1104     }
1105 
1106     break;
1107   }
1108   case TargetOpcode::G_LSHR: {
1109     if (auto ConstLHS = getIConstantVRegVal(MI.getOperand(1).getReg(), MRI)) {
1110       if (ConstLHS->isSignMask())
1111         return true;
1112     }
1113 
1114     break;
1115   }
1116   case TargetOpcode::G_BUILD_VECTOR: {
1117     // TODO: Probably should have a recursion depth guard since you could have
1118     // bitcasted vector elements.
1119     for (const MachineOperand &MO : llvm::drop_begin(MI.operands()))
1120       if (!isKnownToBeAPowerOfTwo(MO.getReg(), MRI, KB))
1121         return false;
1122 
1123     return true;
1124   }
1125   case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
1126     // Only handle constants since we would need to know if number of leading
1127     // zeros is greater than the truncation amount.
1128     const unsigned BitWidth = Ty.getScalarSizeInBits();
1129     for (const MachineOperand &MO : llvm::drop_begin(MI.operands())) {
1130       auto Const = getIConstantVRegVal(MO.getReg(), MRI);
1131       if (!Const || !Const->zextOrTrunc(BitWidth).isPowerOf2())
1132         return false;
1133     }
1134 
1135     return true;
1136   }
1137   default:
1138     break;
1139   }
1140 
1141   if (!KB)
1142     return false;
1143 
1144   // More could be done here, though the above checks are enough
1145   // to handle some common cases.
1146 
1147   // Fall back to computeKnownBits to catch other known cases.
1148   KnownBits Known = KB->getKnownBits(Reg);
1149   return (Known.countMaxPopulation() == 1) && (Known.countMinPopulation() == 1);
1150 }
1151 
1152 void llvm::getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU) {
1153   AU.addPreserved<StackProtector>();
1154 }
1155 
1156 LLT llvm::getLCMType(LLT OrigTy, LLT TargetTy) {
1157   if (OrigTy.getSizeInBits() == TargetTy.getSizeInBits())
1158     return OrigTy;
1159 
1160   if (OrigTy.isVector() && TargetTy.isVector()) {
1161     LLT OrigElt = OrigTy.getElementType();
1162     LLT TargetElt = TargetTy.getElementType();
1163 
1164     // TODO: The docstring for this function says the intention is to use this
1165     // function to build MERGE/UNMERGE instructions. It won't be the case that
1166     // we generate a MERGE/UNMERGE between fixed and scalable vector types. We
1167     // could implement getLCMType between the two in the future if there was a
1168     // need, but it is not worth it now as this function should not be used in
1169     // that way.
1170     assert(((OrigTy.isScalableVector() && !TargetTy.isFixedVector()) ||
1171             (OrigTy.isFixedVector() && !TargetTy.isScalableVector())) &&
1172            "getLCMType not implemented between fixed and scalable vectors.");
1173 
1174     if (OrigElt.getSizeInBits() == TargetElt.getSizeInBits()) {
1175       int GCDMinElts = std::gcd(OrigTy.getElementCount().getKnownMinValue(),
1176                                 TargetTy.getElementCount().getKnownMinValue());
1177       // Prefer the original element type.
1178       ElementCount Mul = OrigTy.getElementCount().multiplyCoefficientBy(
1179           TargetTy.getElementCount().getKnownMinValue());
1180       return LLT::vector(Mul.divideCoefficientBy(GCDMinElts),
1181                          OrigTy.getElementType());
1182     }
1183     unsigned LCM = std::lcm(OrigTy.getSizeInBits().getKnownMinValue(),
1184                             TargetTy.getSizeInBits().getKnownMinValue());
1185     return LLT::vector(
1186         ElementCount::get(LCM / OrigElt.getSizeInBits(), OrigTy.isScalable()),
1187         OrigElt);
1188   }
1189 
1190   // One type is scalar, one type is vector
1191   if (OrigTy.isVector() || TargetTy.isVector()) {
1192     LLT VecTy = OrigTy.isVector() ? OrigTy : TargetTy;
1193     LLT ScalarTy = OrigTy.isVector() ? TargetTy : OrigTy;
1194     LLT EltTy = VecTy.getElementType();
1195     LLT OrigEltTy = OrigTy.isVector() ? OrigTy.getElementType() : OrigTy;
1196 
1197     // Prefer scalar type from OrigTy.
1198     if (EltTy.getSizeInBits() == ScalarTy.getSizeInBits())
1199       return LLT::vector(VecTy.getElementCount(), OrigEltTy);
1200 
1201     // Different size scalars. Create vector with the same total size.
1202     // LCM will take fixed/scalable from VecTy.
1203     unsigned LCM = std::lcm(EltTy.getSizeInBits().getFixedValue() *
1204                                 VecTy.getElementCount().getKnownMinValue(),
1205                             ScalarTy.getSizeInBits().getFixedValue());
1206     // Prefer type from OrigTy
1207     return LLT::vector(ElementCount::get(LCM / OrigEltTy.getSizeInBits(),
1208                                          VecTy.getElementCount().isScalable()),
1209                        OrigEltTy);
1210   }
1211 
1212   // At this point, both types are scalars of different size
1213   unsigned LCM = std::lcm(OrigTy.getSizeInBits().getFixedValue(),
1214                           TargetTy.getSizeInBits().getFixedValue());
1215   // Preserve pointer types.
1216   if (LCM == OrigTy.getSizeInBits())
1217     return OrigTy;
1218   if (LCM == TargetTy.getSizeInBits())
1219     return TargetTy;
1220   return LLT::scalar(LCM);
1221 }
1222 
1223 LLT llvm::getCoverTy(LLT OrigTy, LLT TargetTy) {
1224 
1225   if ((OrigTy.isScalableVector() && TargetTy.isFixedVector()) ||
1226       (OrigTy.isFixedVector() && TargetTy.isScalableVector()))
1227     llvm_unreachable(
1228         "getCoverTy not implemented between fixed and scalable vectors.");
1229 
1230   if (!OrigTy.isVector() || !TargetTy.isVector() || OrigTy == TargetTy ||
1231       (OrigTy.getScalarSizeInBits() != TargetTy.getScalarSizeInBits()))
1232     return getLCMType(OrigTy, TargetTy);
1233 
1234   unsigned OrigTyNumElts = OrigTy.getElementCount().getKnownMinValue();
1235   unsigned TargetTyNumElts = TargetTy.getElementCount().getKnownMinValue();
1236   if (OrigTyNumElts % TargetTyNumElts == 0)
1237     return OrigTy;
1238 
1239   unsigned NumElts = alignTo(OrigTyNumElts, TargetTyNumElts);
1240   return LLT::scalarOrVector(ElementCount::getFixed(NumElts),
1241                              OrigTy.getElementType());
1242 }
1243 
1244 LLT llvm::getGCDType(LLT OrigTy, LLT TargetTy) {
1245   if (OrigTy.getSizeInBits() == TargetTy.getSizeInBits())
1246     return OrigTy;
1247 
1248   if (OrigTy.isVector() && TargetTy.isVector()) {
1249     LLT OrigElt = OrigTy.getElementType();
1250 
1251     // TODO: The docstring for this function says the intention is to use this
1252     // function to build MERGE/UNMERGE instructions. It won't be the case that
1253     // we generate a MERGE/UNMERGE between fixed and scalable vector types. We
1254     // could implement getGCDType between the two in the future if there was a
1255     // need, but it is not worth it now as this function should not be used in
1256     // that way.
1257     assert(((OrigTy.isScalableVector() && !TargetTy.isFixedVector()) ||
1258             (OrigTy.isFixedVector() && !TargetTy.isScalableVector())) &&
1259            "getGCDType not implemented between fixed and scalable vectors.");
1260 
1261     unsigned GCD = std::gcd(OrigTy.getSizeInBits().getKnownMinValue(),
1262                             TargetTy.getSizeInBits().getKnownMinValue());
1263     if (GCD == OrigElt.getSizeInBits())
1264       return LLT::scalarOrVector(ElementCount::get(1, OrigTy.isScalable()),
1265                                  OrigElt);
1266 
1267     // Cannot produce original element type, but both have vscale in common.
1268     if (GCD < OrigElt.getSizeInBits())
1269       return LLT::scalarOrVector(ElementCount::get(1, OrigTy.isScalable()),
1270                                  GCD);
1271 
1272     return LLT::vector(
1273         ElementCount::get(GCD / OrigElt.getSizeInBits().getFixedValue(),
1274                           OrigTy.isScalable()),
1275         OrigElt);
1276   }
1277 
1278   // If one type is vector and the element size matches the scalar size, then
1279   // the gcd is the scalar type.
1280   if (OrigTy.isVector() &&
1281       OrigTy.getElementType().getSizeInBits() == TargetTy.getSizeInBits())
1282     return OrigTy.getElementType();
1283   if (TargetTy.isVector() &&
1284       TargetTy.getElementType().getSizeInBits() == OrigTy.getSizeInBits())
1285     return OrigTy;
1286 
1287   // At this point, both types are either scalars of different type or one is a
1288   // vector and one is a scalar. If both types are scalars, the GCD type is the
1289   // GCD between the two scalar sizes. If one is vector and one is scalar, then
1290   // the GCD type is the GCD between the scalar and the vector element size.
1291   LLT OrigScalar = OrigTy.getScalarType();
1292   LLT TargetScalar = TargetTy.getScalarType();
1293   unsigned GCD = std::gcd(OrigScalar.getSizeInBits().getFixedValue(),
1294                           TargetScalar.getSizeInBits().getFixedValue());
1295   return LLT::scalar(GCD);
1296 }
1297 
1298 std::optional<int> llvm::getSplatIndex(MachineInstr &MI) {
1299   assert(MI.getOpcode() == TargetOpcode::G_SHUFFLE_VECTOR &&
1300          "Only G_SHUFFLE_VECTOR can have a splat index!");
1301   ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask();
1302   auto FirstDefinedIdx = find_if(Mask, [](int Elt) { return Elt >= 0; });
1303 
1304   // If all elements are undefined, this shuffle can be considered a splat.
1305   // Return 0 for better potential for callers to simplify.
1306   if (FirstDefinedIdx == Mask.end())
1307     return 0;
1308 
1309   // Make sure all remaining elements are either undef or the same
1310   // as the first non-undef value.
1311   int SplatValue = *FirstDefinedIdx;
1312   if (any_of(make_range(std::next(FirstDefinedIdx), Mask.end()),
1313              [&SplatValue](int Elt) { return Elt >= 0 && Elt != SplatValue; }))
1314     return std::nullopt;
1315 
1316   return SplatValue;
1317 }
1318 
1319 static bool isBuildVectorOp(unsigned Opcode) {
1320   return Opcode == TargetOpcode::G_BUILD_VECTOR ||
1321          Opcode == TargetOpcode::G_BUILD_VECTOR_TRUNC;
1322 }
1323 
1324 namespace {
1325 
1326 std::optional<ValueAndVReg> getAnyConstantSplat(Register VReg,
1327                                                 const MachineRegisterInfo &MRI,
1328                                                 bool AllowUndef) {
1329   MachineInstr *MI = getDefIgnoringCopies(VReg, MRI);
1330   if (!MI)
1331     return std::nullopt;
1332 
1333   bool isConcatVectorsOp = MI->getOpcode() == TargetOpcode::G_CONCAT_VECTORS;
1334   if (!isBuildVectorOp(MI->getOpcode()) && !isConcatVectorsOp)
1335     return std::nullopt;
1336 
1337   std::optional<ValueAndVReg> SplatValAndReg;
1338   for (MachineOperand &Op : MI->uses()) {
1339     Register Element = Op.getReg();
1340     // If we have a G_CONCAT_VECTOR, we recursively look into the
1341     // vectors that we're concatenating to see if they're splats.
1342     auto ElementValAndReg =
1343         isConcatVectorsOp
1344             ? getAnyConstantSplat(Element, MRI, AllowUndef)
1345             : getAnyConstantVRegValWithLookThrough(Element, MRI, true, true);
1346 
1347     // If AllowUndef, treat undef as value that will result in a constant splat.
1348     if (!ElementValAndReg) {
1349       if (AllowUndef && isa<GImplicitDef>(MRI.getVRegDef(Element)))
1350         continue;
1351       return std::nullopt;
1352     }
1353 
1354     // Record splat value
1355     if (!SplatValAndReg)
1356       SplatValAndReg = ElementValAndReg;
1357 
1358     // Different constant than the one already recorded, not a constant splat.
1359     if (SplatValAndReg->Value != ElementValAndReg->Value)
1360       return std::nullopt;
1361   }
1362 
1363   return SplatValAndReg;
1364 }
1365 
1366 } // end anonymous namespace
1367 
1368 bool llvm::isBuildVectorConstantSplat(const Register Reg,
1369                                       const MachineRegisterInfo &MRI,
1370                                       int64_t SplatValue, bool AllowUndef) {
1371   if (auto SplatValAndReg = getAnyConstantSplat(Reg, MRI, AllowUndef))
1372     return mi_match(SplatValAndReg->VReg, MRI, m_SpecificICst(SplatValue));
1373   return false;
1374 }
1375 
1376 bool llvm::isBuildVectorConstantSplat(const MachineInstr &MI,
1377                                       const MachineRegisterInfo &MRI,
1378                                       int64_t SplatValue, bool AllowUndef) {
1379   return isBuildVectorConstantSplat(MI.getOperand(0).getReg(), MRI, SplatValue,
1380                                     AllowUndef);
1381 }
1382 
1383 std::optional<APInt>
1384 llvm::getIConstantSplatVal(const Register Reg, const MachineRegisterInfo &MRI) {
1385   if (auto SplatValAndReg =
1386           getAnyConstantSplat(Reg, MRI, /* AllowUndef */ false)) {
1387     if (std::optional<ValueAndVReg> ValAndVReg =
1388         getIConstantVRegValWithLookThrough(SplatValAndReg->VReg, MRI))
1389       return ValAndVReg->Value;
1390   }
1391 
1392   return std::nullopt;
1393 }
1394 
1395 std::optional<APInt>
1396 llvm::getIConstantSplatVal(const MachineInstr &MI,
1397                            const MachineRegisterInfo &MRI) {
1398   return getIConstantSplatVal(MI.getOperand(0).getReg(), MRI);
1399 }
1400 
1401 std::optional<int64_t>
1402 llvm::getIConstantSplatSExtVal(const Register Reg,
1403                                const MachineRegisterInfo &MRI) {
1404   if (auto SplatValAndReg =
1405           getAnyConstantSplat(Reg, MRI, /* AllowUndef */ false))
1406     return getIConstantVRegSExtVal(SplatValAndReg->VReg, MRI);
1407   return std::nullopt;
1408 }
1409 
1410 std::optional<int64_t>
1411 llvm::getIConstantSplatSExtVal(const MachineInstr &MI,
1412                                const MachineRegisterInfo &MRI) {
1413   return getIConstantSplatSExtVal(MI.getOperand(0).getReg(), MRI);
1414 }
1415 
1416 std::optional<FPValueAndVReg>
1417 llvm::getFConstantSplat(Register VReg, const MachineRegisterInfo &MRI,
1418                         bool AllowUndef) {
1419   if (auto SplatValAndReg = getAnyConstantSplat(VReg, MRI, AllowUndef))
1420     return getFConstantVRegValWithLookThrough(SplatValAndReg->VReg, MRI);
1421   return std::nullopt;
1422 }
1423 
1424 bool llvm::isBuildVectorAllZeros(const MachineInstr &MI,
1425                                  const MachineRegisterInfo &MRI,
1426                                  bool AllowUndef) {
1427   return isBuildVectorConstantSplat(MI, MRI, 0, AllowUndef);
1428 }
1429 
1430 bool llvm::isBuildVectorAllOnes(const MachineInstr &MI,
1431                                 const MachineRegisterInfo &MRI,
1432                                 bool AllowUndef) {
1433   return isBuildVectorConstantSplat(MI, MRI, -1, AllowUndef);
1434 }
1435 
1436 std::optional<RegOrConstant>
1437 llvm::getVectorSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI) {
1438   unsigned Opc = MI.getOpcode();
1439   if (!isBuildVectorOp(Opc))
1440     return std::nullopt;
1441   if (auto Splat = getIConstantSplatSExtVal(MI, MRI))
1442     return RegOrConstant(*Splat);
1443   auto Reg = MI.getOperand(1).getReg();
1444   if (any_of(drop_begin(MI.operands(), 2),
1445              [&Reg](const MachineOperand &Op) { return Op.getReg() != Reg; }))
1446     return std::nullopt;
1447   return RegOrConstant(Reg);
1448 }
1449 
1450 static bool isConstantScalar(const MachineInstr &MI,
1451                              const MachineRegisterInfo &MRI,
1452                              bool AllowFP = true,
1453                              bool AllowOpaqueConstants = true) {
1454   switch (MI.getOpcode()) {
1455   case TargetOpcode::G_CONSTANT:
1456   case TargetOpcode::G_IMPLICIT_DEF:
1457     return true;
1458   case TargetOpcode::G_FCONSTANT:
1459     return AllowFP;
1460   case TargetOpcode::G_GLOBAL_VALUE:
1461   case TargetOpcode::G_FRAME_INDEX:
1462   case TargetOpcode::G_BLOCK_ADDR:
1463   case TargetOpcode::G_JUMP_TABLE:
1464     return AllowOpaqueConstants;
1465   default:
1466     return false;
1467   }
1468 }
1469 
1470 bool llvm::isConstantOrConstantVector(MachineInstr &MI,
1471                                       const MachineRegisterInfo &MRI) {
1472   Register Def = MI.getOperand(0).getReg();
1473   if (auto C = getIConstantVRegValWithLookThrough(Def, MRI))
1474     return true;
1475   GBuildVector *BV = dyn_cast<GBuildVector>(&MI);
1476   if (!BV)
1477     return false;
1478   for (unsigned SrcIdx = 0; SrcIdx < BV->getNumSources(); ++SrcIdx) {
1479     if (getIConstantVRegValWithLookThrough(BV->getSourceReg(SrcIdx), MRI) ||
1480         getOpcodeDef<GImplicitDef>(BV->getSourceReg(SrcIdx), MRI))
1481       continue;
1482     return false;
1483   }
1484   return true;
1485 }
1486 
1487 bool llvm::isConstantOrConstantVector(const MachineInstr &MI,
1488                                       const MachineRegisterInfo &MRI,
1489                                       bool AllowFP, bool AllowOpaqueConstants) {
1490   if (isConstantScalar(MI, MRI, AllowFP, AllowOpaqueConstants))
1491     return true;
1492 
1493   if (!isBuildVectorOp(MI.getOpcode()))
1494     return false;
1495 
1496   const unsigned NumOps = MI.getNumOperands();
1497   for (unsigned I = 1; I != NumOps; ++I) {
1498     const MachineInstr *ElementDef = MRI.getVRegDef(MI.getOperand(I).getReg());
1499     if (!isConstantScalar(*ElementDef, MRI, AllowFP, AllowOpaqueConstants))
1500       return false;
1501   }
1502 
1503   return true;
1504 }
1505 
1506 std::optional<APInt>
1507 llvm::isConstantOrConstantSplatVector(MachineInstr &MI,
1508                                       const MachineRegisterInfo &MRI) {
1509   Register Def = MI.getOperand(0).getReg();
1510   if (auto C = getIConstantVRegValWithLookThrough(Def, MRI))
1511     return C->Value;
1512   auto MaybeCst = getIConstantSplatSExtVal(MI, MRI);
1513   if (!MaybeCst)
1514     return std::nullopt;
1515   const unsigned ScalarSize = MRI.getType(Def).getScalarSizeInBits();
1516   return APInt(ScalarSize, *MaybeCst, true);
1517 }
1518 
1519 bool llvm::isNullOrNullSplat(const MachineInstr &MI,
1520                              const MachineRegisterInfo &MRI, bool AllowUndefs) {
1521   switch (MI.getOpcode()) {
1522   case TargetOpcode::G_IMPLICIT_DEF:
1523     return AllowUndefs;
1524   case TargetOpcode::G_CONSTANT:
1525     return MI.getOperand(1).getCImm()->isNullValue();
1526   case TargetOpcode::G_FCONSTANT: {
1527     const ConstantFP *FPImm = MI.getOperand(1).getFPImm();
1528     return FPImm->isZero() && !FPImm->isNegative();
1529   }
1530   default:
1531     if (!AllowUndefs) // TODO: isBuildVectorAllZeros assumes undef is OK already
1532       return false;
1533     return isBuildVectorAllZeros(MI, MRI);
1534   }
1535 }
1536 
1537 bool llvm::isAllOnesOrAllOnesSplat(const MachineInstr &MI,
1538                                    const MachineRegisterInfo &MRI,
1539                                    bool AllowUndefs) {
1540   switch (MI.getOpcode()) {
1541   case TargetOpcode::G_IMPLICIT_DEF:
1542     return AllowUndefs;
1543   case TargetOpcode::G_CONSTANT:
1544     return MI.getOperand(1).getCImm()->isAllOnesValue();
1545   default:
1546     if (!AllowUndefs) // TODO: isBuildVectorAllOnes assumes undef is OK already
1547       return false;
1548     return isBuildVectorAllOnes(MI, MRI);
1549   }
1550 }
1551 
1552 bool llvm::matchUnaryPredicate(
1553     const MachineRegisterInfo &MRI, Register Reg,
1554     std::function<bool(const Constant *ConstVal)> Match, bool AllowUndefs) {
1555 
1556   const MachineInstr *Def = getDefIgnoringCopies(Reg, MRI);
1557   if (AllowUndefs && Def->getOpcode() == TargetOpcode::G_IMPLICIT_DEF)
1558     return Match(nullptr);
1559 
1560   // TODO: Also handle fconstant
1561   if (Def->getOpcode() == TargetOpcode::G_CONSTANT)
1562     return Match(Def->getOperand(1).getCImm());
1563 
1564   if (Def->getOpcode() != TargetOpcode::G_BUILD_VECTOR)
1565     return false;
1566 
1567   for (unsigned I = 1, E = Def->getNumOperands(); I != E; ++I) {
1568     Register SrcElt = Def->getOperand(I).getReg();
1569     const MachineInstr *SrcDef = getDefIgnoringCopies(SrcElt, MRI);
1570     if (AllowUndefs && SrcDef->getOpcode() == TargetOpcode::G_IMPLICIT_DEF) {
1571       if (!Match(nullptr))
1572         return false;
1573       continue;
1574     }
1575 
1576     if (SrcDef->getOpcode() != TargetOpcode::G_CONSTANT ||
1577         !Match(SrcDef->getOperand(1).getCImm()))
1578       return false;
1579   }
1580 
1581   return true;
1582 }
1583 
1584 bool llvm::isConstTrueVal(const TargetLowering &TLI, int64_t Val, bool IsVector,
1585                           bool IsFP) {
1586   switch (TLI.getBooleanContents(IsVector, IsFP)) {
1587   case TargetLowering::UndefinedBooleanContent:
1588     return Val & 0x1;
1589   case TargetLowering::ZeroOrOneBooleanContent:
1590     return Val == 1;
1591   case TargetLowering::ZeroOrNegativeOneBooleanContent:
1592     return Val == -1;
1593   }
1594   llvm_unreachable("Invalid boolean contents");
1595 }
1596 
1597 bool llvm::isConstFalseVal(const TargetLowering &TLI, int64_t Val,
1598                            bool IsVector, bool IsFP) {
1599   switch (TLI.getBooleanContents(IsVector, IsFP)) {
1600   case TargetLowering::UndefinedBooleanContent:
1601     return ~Val & 0x1;
1602   case TargetLowering::ZeroOrOneBooleanContent:
1603   case TargetLowering::ZeroOrNegativeOneBooleanContent:
1604     return Val == 0;
1605   }
1606   llvm_unreachable("Invalid boolean contents");
1607 }
1608 
1609 int64_t llvm::getICmpTrueVal(const TargetLowering &TLI, bool IsVector,
1610                              bool IsFP) {
1611   switch (TLI.getBooleanContents(IsVector, IsFP)) {
1612   case TargetLowering::UndefinedBooleanContent:
1613   case TargetLowering::ZeroOrOneBooleanContent:
1614     return 1;
1615   case TargetLowering::ZeroOrNegativeOneBooleanContent:
1616     return -1;
1617   }
1618   llvm_unreachable("Invalid boolean contents");
1619 }
1620 
1621 bool llvm::shouldOptForSize(const MachineBasicBlock &MBB,
1622                             ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) {
1623   const auto &F = MBB.getParent()->getFunction();
1624   return F.hasOptSize() || F.hasMinSize() ||
1625          llvm::shouldOptimizeForSize(MBB.getBasicBlock(), PSI, BFI);
1626 }
1627 
1628 void llvm::saveUsesAndErase(MachineInstr &MI, MachineRegisterInfo &MRI,
1629                             LostDebugLocObserver *LocObserver,
1630                             SmallInstListTy &DeadInstChain) {
1631   for (MachineOperand &Op : MI.uses()) {
1632     if (Op.isReg() && Op.getReg().isVirtual())
1633       DeadInstChain.insert(MRI.getVRegDef(Op.getReg()));
1634   }
1635   LLVM_DEBUG(dbgs() << MI << "Is dead; erasing.\n");
1636   DeadInstChain.remove(&MI);
1637   MI.eraseFromParent();
1638   if (LocObserver)
1639     LocObserver->checkpoint(false);
1640 }
1641 
1642 void llvm::eraseInstrs(ArrayRef<MachineInstr *> DeadInstrs,
1643                        MachineRegisterInfo &MRI,
1644                        LostDebugLocObserver *LocObserver) {
1645   SmallInstListTy DeadInstChain;
1646   for (MachineInstr *MI : DeadInstrs)
1647     saveUsesAndErase(*MI, MRI, LocObserver, DeadInstChain);
1648 
1649   while (!DeadInstChain.empty()) {
1650     MachineInstr *Inst = DeadInstChain.pop_back_val();
1651     if (!isTriviallyDead(*Inst, MRI))
1652       continue;
1653     saveUsesAndErase(*Inst, MRI, LocObserver, DeadInstChain);
1654   }
1655 }
1656 
1657 void llvm::eraseInstr(MachineInstr &MI, MachineRegisterInfo &MRI,
1658                       LostDebugLocObserver *LocObserver) {
1659   return eraseInstrs({&MI}, MRI, LocObserver);
1660 }
1661 
1662 void llvm::salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI) {
1663   for (auto &Def : MI.defs()) {
1664     assert(Def.isReg() && "Must be a reg");
1665 
1666     SmallVector<MachineOperand *, 16> DbgUsers;
1667     for (auto &MOUse : MRI.use_operands(Def.getReg())) {
1668       MachineInstr *DbgValue = MOUse.getParent();
1669       // Ignore partially formed DBG_VALUEs.
1670       if (DbgValue->isNonListDebugValue() && DbgValue->getNumOperands() == 4) {
1671         DbgUsers.push_back(&MOUse);
1672       }
1673     }
1674 
1675     if (!DbgUsers.empty()) {
1676       salvageDebugInfoForDbgValue(MRI, MI, DbgUsers);
1677     }
1678   }
1679 }
1680 
1681 bool llvm::isPreISelGenericFloatingPointOpcode(unsigned Opc) {
1682   switch (Opc) {
1683   case TargetOpcode::G_FABS:
1684   case TargetOpcode::G_FADD:
1685   case TargetOpcode::G_FCANONICALIZE:
1686   case TargetOpcode::G_FCEIL:
1687   case TargetOpcode::G_FCONSTANT:
1688   case TargetOpcode::G_FCOPYSIGN:
1689   case TargetOpcode::G_FCOS:
1690   case TargetOpcode::G_FDIV:
1691   case TargetOpcode::G_FEXP2:
1692   case TargetOpcode::G_FEXP:
1693   case TargetOpcode::G_FFLOOR:
1694   case TargetOpcode::G_FLOG10:
1695   case TargetOpcode::G_FLOG2:
1696   case TargetOpcode::G_FLOG:
1697   case TargetOpcode::G_FMA:
1698   case TargetOpcode::G_FMAD:
1699   case TargetOpcode::G_FMAXIMUM:
1700   case TargetOpcode::G_FMAXNUM:
1701   case TargetOpcode::G_FMAXNUM_IEEE:
1702   case TargetOpcode::G_FMINIMUM:
1703   case TargetOpcode::G_FMINNUM:
1704   case TargetOpcode::G_FMINNUM_IEEE:
1705   case TargetOpcode::G_FMUL:
1706   case TargetOpcode::G_FNEARBYINT:
1707   case TargetOpcode::G_FNEG:
1708   case TargetOpcode::G_FPEXT:
1709   case TargetOpcode::G_FPOW:
1710   case TargetOpcode::G_FPTRUNC:
1711   case TargetOpcode::G_FREM:
1712   case TargetOpcode::G_FRINT:
1713   case TargetOpcode::G_FSIN:
1714   case TargetOpcode::G_FTAN:
1715   case TargetOpcode::G_FACOS:
1716   case TargetOpcode::G_FASIN:
1717   case TargetOpcode::G_FATAN:
1718   case TargetOpcode::G_FCOSH:
1719   case TargetOpcode::G_FSINH:
1720   case TargetOpcode::G_FTANH:
1721   case TargetOpcode::G_FSQRT:
1722   case TargetOpcode::G_FSUB:
1723   case TargetOpcode::G_INTRINSIC_ROUND:
1724   case TargetOpcode::G_INTRINSIC_ROUNDEVEN:
1725   case TargetOpcode::G_INTRINSIC_TRUNC:
1726     return true;
1727   default:
1728     return false;
1729   }
1730 }
1731 
1732 /// Shifts return poison if shiftwidth is larger than the bitwidth.
1733 static bool shiftAmountKnownInRange(Register ShiftAmount,
1734                                     const MachineRegisterInfo &MRI) {
1735   LLT Ty = MRI.getType(ShiftAmount);
1736 
1737   if (Ty.isScalableVector())
1738     return false; // Can't tell, just return false to be safe
1739 
1740   if (Ty.isScalar()) {
1741     std::optional<ValueAndVReg> Val =
1742         getIConstantVRegValWithLookThrough(ShiftAmount, MRI);
1743     if (!Val)
1744       return false;
1745     return Val->Value.ult(Ty.getScalarSizeInBits());
1746   }
1747 
1748   GBuildVector *BV = getOpcodeDef<GBuildVector>(ShiftAmount, MRI);
1749   if (!BV)
1750     return false;
1751 
1752   unsigned Sources = BV->getNumSources();
1753   for (unsigned I = 0; I < Sources; ++I) {
1754     std::optional<ValueAndVReg> Val =
1755         getIConstantVRegValWithLookThrough(BV->getSourceReg(I), MRI);
1756     if (!Val)
1757       return false;
1758     if (!Val->Value.ult(Ty.getScalarSizeInBits()))
1759       return false;
1760   }
1761 
1762   return true;
1763 }
1764 
1765 namespace {
1766 enum class UndefPoisonKind {
1767   PoisonOnly = (1 << 0),
1768   UndefOnly = (1 << 1),
1769   UndefOrPoison = PoisonOnly | UndefOnly,
1770 };
1771 }
1772 
1773 static bool includesPoison(UndefPoisonKind Kind) {
1774   return (unsigned(Kind) & unsigned(UndefPoisonKind::PoisonOnly)) != 0;
1775 }
1776 
1777 static bool includesUndef(UndefPoisonKind Kind) {
1778   return (unsigned(Kind) & unsigned(UndefPoisonKind::UndefOnly)) != 0;
1779 }
1780 
1781 static bool canCreateUndefOrPoison(Register Reg, const MachineRegisterInfo &MRI,
1782                                    bool ConsiderFlagsAndMetadata,
1783                                    UndefPoisonKind Kind) {
1784   MachineInstr *RegDef = MRI.getVRegDef(Reg);
1785 
1786   if (ConsiderFlagsAndMetadata && includesPoison(Kind))
1787     if (auto *GMI = dyn_cast<GenericMachineInstr>(RegDef))
1788       if (GMI->hasPoisonGeneratingFlags())
1789         return true;
1790 
1791   // Check whether opcode is a poison/undef-generating operation.
1792   switch (RegDef->getOpcode()) {
1793   case TargetOpcode::G_BUILD_VECTOR:
1794   case TargetOpcode::G_CONSTANT_FOLD_BARRIER:
1795     return false;
1796   case TargetOpcode::G_SHL:
1797   case TargetOpcode::G_ASHR:
1798   case TargetOpcode::G_LSHR:
1799     return includesPoison(Kind) &&
1800            !shiftAmountKnownInRange(RegDef->getOperand(2).getReg(), MRI);
1801   case TargetOpcode::G_FPTOSI:
1802   case TargetOpcode::G_FPTOUI:
1803     // fptosi/ui yields poison if the resulting value does not fit in the
1804     // destination type.
1805     return true;
1806   case TargetOpcode::G_CTLZ:
1807   case TargetOpcode::G_CTTZ:
1808   case TargetOpcode::G_ABS:
1809   case TargetOpcode::G_CTPOP:
1810   case TargetOpcode::G_BSWAP:
1811   case TargetOpcode::G_BITREVERSE:
1812   case TargetOpcode::G_FSHL:
1813   case TargetOpcode::G_FSHR:
1814   case TargetOpcode::G_SMAX:
1815   case TargetOpcode::G_SMIN:
1816   case TargetOpcode::G_UMAX:
1817   case TargetOpcode::G_UMIN:
1818   case TargetOpcode::G_PTRMASK:
1819   case TargetOpcode::G_SADDO:
1820   case TargetOpcode::G_SSUBO:
1821   case TargetOpcode::G_UADDO:
1822   case TargetOpcode::G_USUBO:
1823   case TargetOpcode::G_SMULO:
1824   case TargetOpcode::G_UMULO:
1825   case TargetOpcode::G_SADDSAT:
1826   case TargetOpcode::G_UADDSAT:
1827   case TargetOpcode::G_SSUBSAT:
1828   case TargetOpcode::G_USUBSAT:
1829     return false;
1830   case TargetOpcode::G_SSHLSAT:
1831   case TargetOpcode::G_USHLSAT:
1832     return includesPoison(Kind) &&
1833            !shiftAmountKnownInRange(RegDef->getOperand(2).getReg(), MRI);
1834   case TargetOpcode::G_INSERT_VECTOR_ELT: {
1835     GInsertVectorElement *Insert = cast<GInsertVectorElement>(RegDef);
1836     if (includesPoison(Kind)) {
1837       std::optional<ValueAndVReg> Index =
1838           getIConstantVRegValWithLookThrough(Insert->getIndexReg(), MRI);
1839       if (!Index)
1840         return true;
1841       LLT VecTy = MRI.getType(Insert->getVectorReg());
1842       return Index->Value.uge(VecTy.getElementCount().getKnownMinValue());
1843     }
1844     return false;
1845   }
1846   case TargetOpcode::G_EXTRACT_VECTOR_ELT: {
1847     GExtractVectorElement *Extract = cast<GExtractVectorElement>(RegDef);
1848     if (includesPoison(Kind)) {
1849       std::optional<ValueAndVReg> Index =
1850           getIConstantVRegValWithLookThrough(Extract->getIndexReg(), MRI);
1851       if (!Index)
1852         return true;
1853       LLT VecTy = MRI.getType(Extract->getVectorReg());
1854       return Index->Value.uge(VecTy.getElementCount().getKnownMinValue());
1855     }
1856     return false;
1857   }
1858   case TargetOpcode::G_SHUFFLE_VECTOR: {
1859     GShuffleVector *Shuffle = cast<GShuffleVector>(RegDef);
1860     ArrayRef<int> Mask = Shuffle->getMask();
1861     return includesPoison(Kind) && is_contained(Mask, -1);
1862   }
1863   case TargetOpcode::G_FNEG:
1864   case TargetOpcode::G_PHI:
1865   case TargetOpcode::G_SELECT:
1866   case TargetOpcode::G_UREM:
1867   case TargetOpcode::G_SREM:
1868   case TargetOpcode::G_FREEZE:
1869   case TargetOpcode::G_ICMP:
1870   case TargetOpcode::G_FCMP:
1871   case TargetOpcode::G_FADD:
1872   case TargetOpcode::G_FSUB:
1873   case TargetOpcode::G_FMUL:
1874   case TargetOpcode::G_FDIV:
1875   case TargetOpcode::G_FREM:
1876   case TargetOpcode::G_PTR_ADD:
1877     return false;
1878   default:
1879     return !isa<GCastOp>(RegDef) && !isa<GBinOp>(RegDef);
1880   }
1881 }
1882 
1883 static bool isGuaranteedNotToBeUndefOrPoison(Register Reg,
1884                                              const MachineRegisterInfo &MRI,
1885                                              unsigned Depth,
1886                                              UndefPoisonKind Kind) {
1887   if (Depth >= MaxAnalysisRecursionDepth)
1888     return false;
1889 
1890   MachineInstr *RegDef = MRI.getVRegDef(Reg);
1891 
1892   switch (RegDef->getOpcode()) {
1893   case TargetOpcode::G_FREEZE:
1894     return true;
1895   case TargetOpcode::G_IMPLICIT_DEF:
1896     return !includesUndef(Kind);
1897   case TargetOpcode::G_CONSTANT:
1898   case TargetOpcode::G_FCONSTANT:
1899     return true;
1900   case TargetOpcode::G_BUILD_VECTOR: {
1901     GBuildVector *BV = cast<GBuildVector>(RegDef);
1902     unsigned NumSources = BV->getNumSources();
1903     for (unsigned I = 0; I < NumSources; ++I)
1904       if (!::isGuaranteedNotToBeUndefOrPoison(BV->getSourceReg(I), MRI,
1905                                               Depth + 1, Kind))
1906         return false;
1907     return true;
1908   }
1909   case TargetOpcode::G_PHI: {
1910     GPhi *Phi = cast<GPhi>(RegDef);
1911     unsigned NumIncoming = Phi->getNumIncomingValues();
1912     for (unsigned I = 0; I < NumIncoming; ++I)
1913       if (!::isGuaranteedNotToBeUndefOrPoison(Phi->getIncomingValue(I), MRI,
1914                                               Depth + 1, Kind))
1915         return false;
1916     return true;
1917   }
1918   default: {
1919     auto MOCheck = [&](const MachineOperand &MO) {
1920       if (!MO.isReg())
1921         return true;
1922       return ::isGuaranteedNotToBeUndefOrPoison(MO.getReg(), MRI, Depth + 1,
1923                                                 Kind);
1924     };
1925     return !::canCreateUndefOrPoison(Reg, MRI,
1926                                      /*ConsiderFlagsAndMetadata=*/true, Kind) &&
1927            all_of(RegDef->uses(), MOCheck);
1928   }
1929   }
1930 }
1931 
1932 bool llvm::canCreateUndefOrPoison(Register Reg, const MachineRegisterInfo &MRI,
1933                                   bool ConsiderFlagsAndMetadata) {
1934   return ::canCreateUndefOrPoison(Reg, MRI, ConsiderFlagsAndMetadata,
1935                                   UndefPoisonKind::UndefOrPoison);
1936 }
1937 
1938 bool canCreatePoison(Register Reg, const MachineRegisterInfo &MRI,
1939                      bool ConsiderFlagsAndMetadata = true) {
1940   return ::canCreateUndefOrPoison(Reg, MRI, ConsiderFlagsAndMetadata,
1941                                   UndefPoisonKind::PoisonOnly);
1942 }
1943 
1944 bool llvm::isGuaranteedNotToBeUndefOrPoison(Register Reg,
1945                                             const MachineRegisterInfo &MRI,
1946                                             unsigned Depth) {
1947   return ::isGuaranteedNotToBeUndefOrPoison(Reg, MRI, Depth,
1948                                             UndefPoisonKind::UndefOrPoison);
1949 }
1950 
1951 bool llvm::isGuaranteedNotToBePoison(Register Reg,
1952                                      const MachineRegisterInfo &MRI,
1953                                      unsigned Depth) {
1954   return ::isGuaranteedNotToBeUndefOrPoison(Reg, MRI, Depth,
1955                                             UndefPoisonKind::PoisonOnly);
1956 }
1957 
1958 bool llvm::isGuaranteedNotToBeUndef(Register Reg,
1959                                     const MachineRegisterInfo &MRI,
1960                                     unsigned Depth) {
1961   return ::isGuaranteedNotToBeUndefOrPoison(Reg, MRI, Depth,
1962                                             UndefPoisonKind::UndefOnly);
1963 }
1964 
1965 Type *llvm::getTypeForLLT(LLT Ty, LLVMContext &C) {
1966   if (Ty.isVector())
1967     return VectorType::get(IntegerType::get(C, Ty.getScalarSizeInBits()),
1968                            Ty.getElementCount());
1969   return IntegerType::get(C, Ty.getSizeInBits());
1970 }
1971 
1972 APInt llvm::GIConstant::getScalarValue() const {
1973   assert(Kind == GIConstantKind::Scalar && "Expected scalar constant");
1974 
1975   return Value;
1976 }
1977 
1978 std::optional<GIConstant>
1979 llvm::GIConstant::getConstant(Register Const, const MachineRegisterInfo &MRI) {
1980   MachineInstr *Constant = getDefIgnoringCopies(Const, MRI);
1981 
1982   if (GSplatVector *Splat = dyn_cast<GSplatVector>(Constant)) {
1983     std::optional<ValueAndVReg> MayBeConstant =
1984         getIConstantVRegValWithLookThrough(Splat->getScalarReg(), MRI);
1985     if (!MayBeConstant)
1986       return std::nullopt;
1987     return GIConstant(MayBeConstant->Value, GIConstantKind::ScalableVector);
1988   }
1989 
1990   if (GBuildVector *Build = dyn_cast<GBuildVector>(Constant)) {
1991     SmallVector<APInt> Values;
1992     unsigned NumSources = Build->getNumSources();
1993     for (unsigned I = 0; I < NumSources; ++I) {
1994       Register SrcReg = Build->getSourceReg(I);
1995       std::optional<ValueAndVReg> MayBeConstant =
1996           getIConstantVRegValWithLookThrough(SrcReg, MRI);
1997       if (!MayBeConstant)
1998         return std::nullopt;
1999       Values.push_back(MayBeConstant->Value);
2000     }
2001     return GIConstant(Values);
2002   }
2003 
2004   std::optional<ValueAndVReg> MayBeConstant =
2005       getIConstantVRegValWithLookThrough(Const, MRI);
2006   if (!MayBeConstant)
2007     return std::nullopt;
2008 
2009   return GIConstant(MayBeConstant->Value, GIConstantKind::Scalar);
2010 }
2011