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