xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/CodeGen/GlobalISel/Utils.cpp (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg //===- llvm/CodeGen/GlobalISel/Utils.cpp -------------------------*- C++ -*-==//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg /// \file This file implements the utility functions used by the GlobalISel
97330f729Sjoerg /// pipeline.
107330f729Sjoerg //===----------------------------------------------------------------------===//
117330f729Sjoerg 
127330f729Sjoerg #include "llvm/CodeGen/GlobalISel/Utils.h"
137330f729Sjoerg #include "llvm/ADT/APFloat.h"
14*82d56013Sjoerg #include "llvm/ADT/APInt.h"
15*82d56013Sjoerg #include "llvm/ADT/Optional.h"
16*82d56013Sjoerg #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
17*82d56013Sjoerg #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
18*82d56013Sjoerg #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
197330f729Sjoerg #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
207330f729Sjoerg #include "llvm/CodeGen/MachineInstr.h"
217330f729Sjoerg #include "llvm/CodeGen/MachineInstrBuilder.h"
227330f729Sjoerg #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
23*82d56013Sjoerg #include "llvm/CodeGen/MachineSizeOpts.h"
247330f729Sjoerg #include "llvm/CodeGen/MachineRegisterInfo.h"
257330f729Sjoerg #include "llvm/CodeGen/StackProtector.h"
267330f729Sjoerg #include "llvm/CodeGen/TargetInstrInfo.h"
27*82d56013Sjoerg #include "llvm/CodeGen/TargetLowering.h"
287330f729Sjoerg #include "llvm/CodeGen/TargetPassConfig.h"
297330f729Sjoerg #include "llvm/CodeGen/TargetRegisterInfo.h"
307330f729Sjoerg #include "llvm/IR/Constants.h"
31*82d56013Sjoerg #include "llvm/Target/TargetMachine.h"
327330f729Sjoerg 
337330f729Sjoerg #define DEBUG_TYPE "globalisel-utils"
347330f729Sjoerg 
357330f729Sjoerg using namespace llvm;
36*82d56013Sjoerg using namespace MIPatternMatch;
377330f729Sjoerg 
constrainRegToClass(MachineRegisterInfo & MRI,const TargetInstrInfo & TII,const RegisterBankInfo & RBI,Register Reg,const TargetRegisterClass & RegClass)38*82d56013Sjoerg Register llvm::constrainRegToClass(MachineRegisterInfo &MRI,
397330f729Sjoerg                                    const TargetInstrInfo &TII,
40*82d56013Sjoerg                                    const RegisterBankInfo &RBI, Register Reg,
417330f729Sjoerg                                    const TargetRegisterClass &RegClass) {
427330f729Sjoerg   if (!RBI.constrainGenericRegister(Reg, RegClass, MRI))
437330f729Sjoerg     return MRI.createVirtualRegister(&RegClass);
447330f729Sjoerg 
457330f729Sjoerg   return Reg;
467330f729Sjoerg }
477330f729Sjoerg 
constrainOperandRegClass(const MachineFunction & MF,const TargetRegisterInfo & TRI,MachineRegisterInfo & MRI,const TargetInstrInfo & TII,const RegisterBankInfo & RBI,MachineInstr & InsertPt,const TargetRegisterClass & RegClass,MachineOperand & RegMO)48*82d56013Sjoerg Register llvm::constrainOperandRegClass(
497330f729Sjoerg     const MachineFunction &MF, const TargetRegisterInfo &TRI,
507330f729Sjoerg     MachineRegisterInfo &MRI, const TargetInstrInfo &TII,
517330f729Sjoerg     const RegisterBankInfo &RBI, MachineInstr &InsertPt,
52*82d56013Sjoerg     const TargetRegisterClass &RegClass, MachineOperand &RegMO) {
537330f729Sjoerg   Register Reg = RegMO.getReg();
547330f729Sjoerg   // Assume physical registers are properly constrained.
557330f729Sjoerg   assert(Register::isVirtualRegister(Reg) && "PhysReg not implemented");
567330f729Sjoerg 
57*82d56013Sjoerg   Register ConstrainedReg = constrainRegToClass(MRI, TII, RBI, Reg, RegClass);
587330f729Sjoerg   // If we created a new virtual register because the class is not compatible
597330f729Sjoerg   // then create a copy between the new and the old register.
607330f729Sjoerg   if (ConstrainedReg != Reg) {
617330f729Sjoerg     MachineBasicBlock::iterator InsertIt(&InsertPt);
627330f729Sjoerg     MachineBasicBlock &MBB = *InsertPt.getParent();
637330f729Sjoerg     if (RegMO.isUse()) {
647330f729Sjoerg       BuildMI(MBB, InsertIt, InsertPt.getDebugLoc(),
657330f729Sjoerg               TII.get(TargetOpcode::COPY), ConstrainedReg)
667330f729Sjoerg           .addReg(Reg);
677330f729Sjoerg     } else {
687330f729Sjoerg       assert(RegMO.isDef() && "Must be a definition");
697330f729Sjoerg       BuildMI(MBB, std::next(InsertIt), InsertPt.getDebugLoc(),
707330f729Sjoerg               TII.get(TargetOpcode::COPY), Reg)
717330f729Sjoerg           .addReg(ConstrainedReg);
727330f729Sjoerg     }
73*82d56013Sjoerg     if (GISelChangeObserver *Observer = MF.getObserver()) {
74*82d56013Sjoerg       Observer->changingInstr(*RegMO.getParent());
75*82d56013Sjoerg     }
76*82d56013Sjoerg     RegMO.setReg(ConstrainedReg);
77*82d56013Sjoerg     if (GISelChangeObserver *Observer = MF.getObserver()) {
78*82d56013Sjoerg       Observer->changedInstr(*RegMO.getParent());
79*82d56013Sjoerg     }
80*82d56013Sjoerg   } else {
81*82d56013Sjoerg     if (GISelChangeObserver *Observer = MF.getObserver()) {
82*82d56013Sjoerg       if (!RegMO.isDef()) {
83*82d56013Sjoerg         MachineInstr *RegDef = MRI.getVRegDef(Reg);
84*82d56013Sjoerg         Observer->changedInstr(*RegDef);
85*82d56013Sjoerg       }
86*82d56013Sjoerg       Observer->changingAllUsesOfReg(MRI, Reg);
87*82d56013Sjoerg       Observer->finishedChangingAllUsesOfReg();
88*82d56013Sjoerg     }
897330f729Sjoerg   }
907330f729Sjoerg   return ConstrainedReg;
917330f729Sjoerg }
927330f729Sjoerg 
constrainOperandRegClass(const MachineFunction & MF,const TargetRegisterInfo & TRI,MachineRegisterInfo & MRI,const TargetInstrInfo & TII,const RegisterBankInfo & RBI,MachineInstr & InsertPt,const MCInstrDesc & II,MachineOperand & RegMO,unsigned OpIdx)93*82d56013Sjoerg Register llvm::constrainOperandRegClass(
947330f729Sjoerg     const MachineFunction &MF, const TargetRegisterInfo &TRI,
957330f729Sjoerg     MachineRegisterInfo &MRI, const TargetInstrInfo &TII,
967330f729Sjoerg     const RegisterBankInfo &RBI, MachineInstr &InsertPt, const MCInstrDesc &II,
97*82d56013Sjoerg     MachineOperand &RegMO, unsigned OpIdx) {
987330f729Sjoerg   Register Reg = RegMO.getReg();
997330f729Sjoerg   // Assume physical registers are properly constrained.
1007330f729Sjoerg   assert(Register::isVirtualRegister(Reg) && "PhysReg not implemented");
1017330f729Sjoerg 
1027330f729Sjoerg   const TargetRegisterClass *RegClass = TII.getRegClass(II, OpIdx, &TRI, MF);
1037330f729Sjoerg   // Some of the target independent instructions, like COPY, may not impose any
1047330f729Sjoerg   // register class constraints on some of their operands: If it's a use, we can
1057330f729Sjoerg   // skip constraining as the instruction defining the register would constrain
1067330f729Sjoerg   // it.
1077330f729Sjoerg 
1087330f729Sjoerg   // We can't constrain unallocatable register classes, because we can't create
1097330f729Sjoerg   // virtual registers for these classes, so we need to let targets handled this
1107330f729Sjoerg   // case.
1117330f729Sjoerg   if (RegClass && !RegClass->isAllocatable())
1127330f729Sjoerg     RegClass = TRI.getConstrainedRegClassForOperand(RegMO, MRI);
1137330f729Sjoerg 
1147330f729Sjoerg   if (!RegClass) {
1157330f729Sjoerg     assert((!isTargetSpecificOpcode(II.getOpcode()) || RegMO.isUse()) &&
1167330f729Sjoerg            "Register class constraint is required unless either the "
1177330f729Sjoerg            "instruction is target independent or the operand is a use");
1187330f729Sjoerg     // FIXME: Just bailing out like this here could be not enough, unless we
1197330f729Sjoerg     // expect the users of this function to do the right thing for PHIs and
1207330f729Sjoerg     // COPY:
1217330f729Sjoerg     //   v1 = COPY v0
1227330f729Sjoerg     //   v2 = COPY v1
1237330f729Sjoerg     // v1 here may end up not being constrained at all. Please notice that to
1247330f729Sjoerg     // reproduce the issue we likely need a destination pattern of a selection
1257330f729Sjoerg     // rule producing such extra copies, not just an input GMIR with them as
1267330f729Sjoerg     // every existing target using selectImpl handles copies before calling it
1277330f729Sjoerg     // and they never reach this function.
1287330f729Sjoerg     return Reg;
1297330f729Sjoerg   }
1307330f729Sjoerg   return constrainOperandRegClass(MF, TRI, MRI, TII, RBI, InsertPt, *RegClass,
131*82d56013Sjoerg                                   RegMO);
1327330f729Sjoerg }
1337330f729Sjoerg 
constrainSelectedInstRegOperands(MachineInstr & I,const TargetInstrInfo & TII,const TargetRegisterInfo & TRI,const RegisterBankInfo & RBI)1347330f729Sjoerg bool llvm::constrainSelectedInstRegOperands(MachineInstr &I,
1357330f729Sjoerg                                             const TargetInstrInfo &TII,
1367330f729Sjoerg                                             const TargetRegisterInfo &TRI,
1377330f729Sjoerg                                             const RegisterBankInfo &RBI) {
1387330f729Sjoerg   assert(!isPreISelGenericOpcode(I.getOpcode()) &&
1397330f729Sjoerg          "A selected instruction is expected");
1407330f729Sjoerg   MachineBasicBlock &MBB = *I.getParent();
1417330f729Sjoerg   MachineFunction &MF = *MBB.getParent();
1427330f729Sjoerg   MachineRegisterInfo &MRI = MF.getRegInfo();
1437330f729Sjoerg 
1447330f729Sjoerg   for (unsigned OpI = 0, OpE = I.getNumExplicitOperands(); OpI != OpE; ++OpI) {
1457330f729Sjoerg     MachineOperand &MO = I.getOperand(OpI);
1467330f729Sjoerg 
1477330f729Sjoerg     // There's nothing to be done on non-register operands.
1487330f729Sjoerg     if (!MO.isReg())
1497330f729Sjoerg       continue;
1507330f729Sjoerg 
1517330f729Sjoerg     LLVM_DEBUG(dbgs() << "Converting operand: " << MO << '\n');
1527330f729Sjoerg     assert(MO.isReg() && "Unsupported non-reg operand");
1537330f729Sjoerg 
1547330f729Sjoerg     Register Reg = MO.getReg();
1557330f729Sjoerg     // Physical registers don't need to be constrained.
1567330f729Sjoerg     if (Register::isPhysicalRegister(Reg))
1577330f729Sjoerg       continue;
1587330f729Sjoerg 
1597330f729Sjoerg     // Register operands with a value of 0 (e.g. predicate operands) don't need
1607330f729Sjoerg     // to be constrained.
1617330f729Sjoerg     if (Reg == 0)
1627330f729Sjoerg       continue;
1637330f729Sjoerg 
1647330f729Sjoerg     // If the operand is a vreg, we should constrain its regclass, and only
1657330f729Sjoerg     // insert COPYs if that's impossible.
1667330f729Sjoerg     // constrainOperandRegClass does that for us.
167*82d56013Sjoerg     constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, I.getDesc(), MO, OpI);
1687330f729Sjoerg 
1697330f729Sjoerg     // Tie uses to defs as indicated in MCInstrDesc if this hasn't already been
1707330f729Sjoerg     // done.
1717330f729Sjoerg     if (MO.isUse()) {
1727330f729Sjoerg       int DefIdx = I.getDesc().getOperandConstraint(OpI, MCOI::TIED_TO);
1737330f729Sjoerg       if (DefIdx != -1 && !I.isRegTiedToUseOperand(DefIdx))
1747330f729Sjoerg         I.tieOperands(DefIdx, OpI);
1757330f729Sjoerg     }
1767330f729Sjoerg   }
1777330f729Sjoerg   return true;
1787330f729Sjoerg }
1797330f729Sjoerg 
canReplaceReg(Register DstReg,Register SrcReg,MachineRegisterInfo & MRI)180*82d56013Sjoerg bool llvm::canReplaceReg(Register DstReg, Register SrcReg,
181*82d56013Sjoerg                          MachineRegisterInfo &MRI) {
182*82d56013Sjoerg   // Give up if either DstReg or SrcReg  is a physical register.
183*82d56013Sjoerg   if (DstReg.isPhysical() || SrcReg.isPhysical())
184*82d56013Sjoerg     return false;
185*82d56013Sjoerg   // Give up if the types don't match.
186*82d56013Sjoerg   if (MRI.getType(DstReg) != MRI.getType(SrcReg))
187*82d56013Sjoerg     return false;
188*82d56013Sjoerg   // Replace if either DstReg has no constraints or the register
189*82d56013Sjoerg   // constraints match.
190*82d56013Sjoerg   return !MRI.getRegClassOrRegBank(DstReg) ||
191*82d56013Sjoerg          MRI.getRegClassOrRegBank(DstReg) == MRI.getRegClassOrRegBank(SrcReg);
192*82d56013Sjoerg }
193*82d56013Sjoerg 
isTriviallyDead(const MachineInstr & MI,const MachineRegisterInfo & MRI)1947330f729Sjoerg bool llvm::isTriviallyDead(const MachineInstr &MI,
1957330f729Sjoerg                            const MachineRegisterInfo &MRI) {
196*82d56013Sjoerg   // FIXME: This logical is mostly duplicated with
197*82d56013Sjoerg   // DeadMachineInstructionElim::isDead. Why is LOCAL_ESCAPE not considered in
198*82d56013Sjoerg   // MachineInstr::isLabel?
199*82d56013Sjoerg 
200*82d56013Sjoerg   // Don't delete frame allocation labels.
201*82d56013Sjoerg   if (MI.getOpcode() == TargetOpcode::LOCAL_ESCAPE)
202*82d56013Sjoerg     return false;
203*82d56013Sjoerg   // LIFETIME markers should be preserved even if they seem dead.
204*82d56013Sjoerg   if (MI.getOpcode() == TargetOpcode::LIFETIME_START ||
205*82d56013Sjoerg       MI.getOpcode() == TargetOpcode::LIFETIME_END)
206*82d56013Sjoerg     return false;
207*82d56013Sjoerg 
2087330f729Sjoerg   // If we can move an instruction, we can remove it.  Otherwise, it has
2097330f729Sjoerg   // a side-effect of some sort.
2107330f729Sjoerg   bool SawStore = false;
2117330f729Sjoerg   if (!MI.isSafeToMove(/*AA=*/nullptr, SawStore) && !MI.isPHI())
2127330f729Sjoerg     return false;
2137330f729Sjoerg 
2147330f729Sjoerg   // Instructions without side-effects are dead iff they only define dead vregs.
2157330f729Sjoerg   for (auto &MO : MI.operands()) {
2167330f729Sjoerg     if (!MO.isReg() || !MO.isDef())
2177330f729Sjoerg       continue;
2187330f729Sjoerg 
2197330f729Sjoerg     Register Reg = MO.getReg();
2207330f729Sjoerg     if (Register::isPhysicalRegister(Reg) || !MRI.use_nodbg_empty(Reg))
2217330f729Sjoerg       return false;
2227330f729Sjoerg   }
2237330f729Sjoerg   return true;
2247330f729Sjoerg }
2257330f729Sjoerg 
reportGISelDiagnostic(DiagnosticSeverity Severity,MachineFunction & MF,const TargetPassConfig & TPC,MachineOptimizationRemarkEmitter & MORE,MachineOptimizationRemarkMissed & R)226*82d56013Sjoerg static void reportGISelDiagnostic(DiagnosticSeverity Severity,
227*82d56013Sjoerg                                   MachineFunction &MF,
228*82d56013Sjoerg                                   const TargetPassConfig &TPC,
229*82d56013Sjoerg                                   MachineOptimizationRemarkEmitter &MORE,
230*82d56013Sjoerg                                   MachineOptimizationRemarkMissed &R) {
231*82d56013Sjoerg   bool IsFatal = Severity == DS_Error &&
232*82d56013Sjoerg                  TPC.isGlobalISelAbortEnabled();
233*82d56013Sjoerg   // Print the function name explicitly if we don't have a debug location (which
234*82d56013Sjoerg   // makes the diagnostic less useful) or if we're going to emit a raw error.
235*82d56013Sjoerg   if (!R.getLocation().isValid() || IsFatal)
236*82d56013Sjoerg     R << (" (in function: " + MF.getName() + ")").str();
237*82d56013Sjoerg 
238*82d56013Sjoerg   if (IsFatal)
239*82d56013Sjoerg     report_fatal_error(R.getMsg());
240*82d56013Sjoerg   else
241*82d56013Sjoerg     MORE.emit(R);
242*82d56013Sjoerg }
243*82d56013Sjoerg 
reportGISelWarning(MachineFunction & MF,const TargetPassConfig & TPC,MachineOptimizationRemarkEmitter & MORE,MachineOptimizationRemarkMissed & R)244*82d56013Sjoerg void llvm::reportGISelWarning(MachineFunction &MF, const TargetPassConfig &TPC,
245*82d56013Sjoerg                               MachineOptimizationRemarkEmitter &MORE,
246*82d56013Sjoerg                               MachineOptimizationRemarkMissed &R) {
247*82d56013Sjoerg   reportGISelDiagnostic(DS_Warning, MF, TPC, MORE, R);
248*82d56013Sjoerg }
249*82d56013Sjoerg 
reportGISelFailure(MachineFunction & MF,const TargetPassConfig & TPC,MachineOptimizationRemarkEmitter & MORE,MachineOptimizationRemarkMissed & R)2507330f729Sjoerg void llvm::reportGISelFailure(MachineFunction &MF, const TargetPassConfig &TPC,
2517330f729Sjoerg                               MachineOptimizationRemarkEmitter &MORE,
2527330f729Sjoerg                               MachineOptimizationRemarkMissed &R) {
2537330f729Sjoerg   MF.getProperties().set(MachineFunctionProperties::Property::FailedISel);
254*82d56013Sjoerg   reportGISelDiagnostic(DS_Error, MF, TPC, MORE, R);
2557330f729Sjoerg }
2567330f729Sjoerg 
reportGISelFailure(MachineFunction & MF,const TargetPassConfig & TPC,MachineOptimizationRemarkEmitter & MORE,const char * PassName,StringRef Msg,const MachineInstr & MI)2577330f729Sjoerg void llvm::reportGISelFailure(MachineFunction &MF, const TargetPassConfig &TPC,
2587330f729Sjoerg                               MachineOptimizationRemarkEmitter &MORE,
2597330f729Sjoerg                               const char *PassName, StringRef Msg,
2607330f729Sjoerg                               const MachineInstr &MI) {
2617330f729Sjoerg   MachineOptimizationRemarkMissed R(PassName, "GISelFailure: ",
2627330f729Sjoerg                                     MI.getDebugLoc(), MI.getParent());
2637330f729Sjoerg   R << Msg;
2647330f729Sjoerg   // Printing MI is expensive;  only do it if expensive remarks are enabled.
2657330f729Sjoerg   if (TPC.isGlobalISelAbortEnabled() || MORE.allowExtraAnalysis(PassName))
2667330f729Sjoerg     R << ": " << ore::MNV("Inst", MI);
2677330f729Sjoerg   reportGISelFailure(MF, TPC, MORE, R);
2687330f729Sjoerg }
2697330f729Sjoerg 
getConstantVRegVal(Register VReg,const MachineRegisterInfo & MRI)270*82d56013Sjoerg Optional<APInt> llvm::getConstantVRegVal(Register VReg,
2717330f729Sjoerg                                          const MachineRegisterInfo &MRI) {
2727330f729Sjoerg   Optional<ValueAndVReg> ValAndVReg =
2737330f729Sjoerg       getConstantVRegValWithLookThrough(VReg, MRI, /*LookThroughInstrs*/ false);
2747330f729Sjoerg   assert((!ValAndVReg || ValAndVReg->VReg == VReg) &&
2757330f729Sjoerg          "Value found while looking through instrs");
2767330f729Sjoerg   if (!ValAndVReg)
2777330f729Sjoerg     return None;
2787330f729Sjoerg   return ValAndVReg->Value;
2797330f729Sjoerg }
2807330f729Sjoerg 
getConstantVRegSExtVal(Register VReg,const MachineRegisterInfo & MRI)281*82d56013Sjoerg Optional<int64_t> llvm::getConstantVRegSExtVal(Register VReg,
282*82d56013Sjoerg                                                const MachineRegisterInfo &MRI) {
283*82d56013Sjoerg   Optional<APInt> Val = getConstantVRegVal(VReg, MRI);
284*82d56013Sjoerg   if (Val && Val->getBitWidth() <= 64)
285*82d56013Sjoerg     return Val->getSExtValue();
286*82d56013Sjoerg   return None;
287*82d56013Sjoerg }
288*82d56013Sjoerg 
getConstantVRegValWithLookThrough(Register VReg,const MachineRegisterInfo & MRI,bool LookThroughInstrs,bool HandleFConstant,bool LookThroughAnyExt)2897330f729Sjoerg Optional<ValueAndVReg> llvm::getConstantVRegValWithLookThrough(
290*82d56013Sjoerg     Register VReg, const MachineRegisterInfo &MRI, bool LookThroughInstrs,
291*82d56013Sjoerg     bool HandleFConstant, bool LookThroughAnyExt) {
2927330f729Sjoerg   SmallVector<std::pair<unsigned, unsigned>, 4> SeenOpcodes;
2937330f729Sjoerg   MachineInstr *MI;
2947330f729Sjoerg   auto IsConstantOpcode = [HandleFConstant](unsigned Opcode) {
2957330f729Sjoerg     return Opcode == TargetOpcode::G_CONSTANT ||
2967330f729Sjoerg            (HandleFConstant && Opcode == TargetOpcode::G_FCONSTANT);
2977330f729Sjoerg   };
2987330f729Sjoerg   auto GetImmediateValue = [HandleFConstant,
2997330f729Sjoerg                             &MRI](const MachineInstr &MI) -> Optional<APInt> {
3007330f729Sjoerg     const MachineOperand &CstVal = MI.getOperand(1);
3017330f729Sjoerg     if (!CstVal.isImm() && !CstVal.isCImm() &&
3027330f729Sjoerg         (!HandleFConstant || !CstVal.isFPImm()))
3037330f729Sjoerg       return None;
3047330f729Sjoerg     if (!CstVal.isFPImm()) {
3057330f729Sjoerg       unsigned BitWidth =
3067330f729Sjoerg           MRI.getType(MI.getOperand(0).getReg()).getSizeInBits();
3077330f729Sjoerg       APInt Val = CstVal.isImm() ? APInt(BitWidth, CstVal.getImm())
3087330f729Sjoerg                                  : CstVal.getCImm()->getValue();
3097330f729Sjoerg       assert(Val.getBitWidth() == BitWidth &&
3107330f729Sjoerg              "Value bitwidth doesn't match definition type");
3117330f729Sjoerg       return Val;
3127330f729Sjoerg     }
3137330f729Sjoerg     return CstVal.getFPImm()->getValueAPF().bitcastToAPInt();
3147330f729Sjoerg   };
3157330f729Sjoerg   while ((MI = MRI.getVRegDef(VReg)) && !IsConstantOpcode(MI->getOpcode()) &&
3167330f729Sjoerg          LookThroughInstrs) {
3177330f729Sjoerg     switch (MI->getOpcode()) {
318*82d56013Sjoerg     case TargetOpcode::G_ANYEXT:
319*82d56013Sjoerg       if (!LookThroughAnyExt)
320*82d56013Sjoerg         return None;
321*82d56013Sjoerg       LLVM_FALLTHROUGH;
3227330f729Sjoerg     case TargetOpcode::G_TRUNC:
3237330f729Sjoerg     case TargetOpcode::G_SEXT:
3247330f729Sjoerg     case TargetOpcode::G_ZEXT:
3257330f729Sjoerg       SeenOpcodes.push_back(std::make_pair(
3267330f729Sjoerg           MI->getOpcode(),
3277330f729Sjoerg           MRI.getType(MI->getOperand(0).getReg()).getSizeInBits()));
3287330f729Sjoerg       VReg = MI->getOperand(1).getReg();
3297330f729Sjoerg       break;
3307330f729Sjoerg     case TargetOpcode::COPY:
3317330f729Sjoerg       VReg = MI->getOperand(1).getReg();
3327330f729Sjoerg       if (Register::isPhysicalRegister(VReg))
3337330f729Sjoerg         return None;
3347330f729Sjoerg       break;
3357330f729Sjoerg     case TargetOpcode::G_INTTOPTR:
3367330f729Sjoerg       VReg = MI->getOperand(1).getReg();
3377330f729Sjoerg       break;
3387330f729Sjoerg     default:
3397330f729Sjoerg       return None;
3407330f729Sjoerg     }
3417330f729Sjoerg   }
3427330f729Sjoerg   if (!MI || !IsConstantOpcode(MI->getOpcode()))
3437330f729Sjoerg     return None;
3447330f729Sjoerg 
3457330f729Sjoerg   Optional<APInt> MaybeVal = GetImmediateValue(*MI);
3467330f729Sjoerg   if (!MaybeVal)
3477330f729Sjoerg     return None;
3487330f729Sjoerg   APInt &Val = *MaybeVal;
3497330f729Sjoerg   while (!SeenOpcodes.empty()) {
3507330f729Sjoerg     std::pair<unsigned, unsigned> OpcodeAndSize = SeenOpcodes.pop_back_val();
3517330f729Sjoerg     switch (OpcodeAndSize.first) {
3527330f729Sjoerg     case TargetOpcode::G_TRUNC:
3537330f729Sjoerg       Val = Val.trunc(OpcodeAndSize.second);
3547330f729Sjoerg       break;
355*82d56013Sjoerg     case TargetOpcode::G_ANYEXT:
3567330f729Sjoerg     case TargetOpcode::G_SEXT:
3577330f729Sjoerg       Val = Val.sext(OpcodeAndSize.second);
3587330f729Sjoerg       break;
3597330f729Sjoerg     case TargetOpcode::G_ZEXT:
3607330f729Sjoerg       Val = Val.zext(OpcodeAndSize.second);
3617330f729Sjoerg       break;
3627330f729Sjoerg     }
3637330f729Sjoerg   }
3647330f729Sjoerg 
365*82d56013Sjoerg   return ValueAndVReg{Val, VReg};
3667330f729Sjoerg }
3677330f729Sjoerg 
getConstantIntVRegVal(Register VReg,const MachineRegisterInfo & MRI)368*82d56013Sjoerg const ConstantInt *llvm::getConstantIntVRegVal(Register VReg,
3697330f729Sjoerg                                                const MachineRegisterInfo &MRI) {
3707330f729Sjoerg   MachineInstr *MI = MRI.getVRegDef(VReg);
371*82d56013Sjoerg   if (MI->getOpcode() != TargetOpcode::G_CONSTANT)
372*82d56013Sjoerg     return nullptr;
373*82d56013Sjoerg   return MI->getOperand(1).getCImm();
374*82d56013Sjoerg }
375*82d56013Sjoerg 
376*82d56013Sjoerg const ConstantFP *
getConstantFPVRegVal(Register VReg,const MachineRegisterInfo & MRI)377*82d56013Sjoerg llvm::getConstantFPVRegVal(Register VReg, const MachineRegisterInfo &MRI) {
378*82d56013Sjoerg   MachineInstr *MI = MRI.getVRegDef(VReg);
3797330f729Sjoerg   if (TargetOpcode::G_FCONSTANT != MI->getOpcode())
3807330f729Sjoerg     return nullptr;
3817330f729Sjoerg   return MI->getOperand(1).getFPImm();
3827330f729Sjoerg }
3837330f729Sjoerg 
384*82d56013Sjoerg Optional<DefinitionAndSourceRegister>
getDefSrcRegIgnoringCopies(Register Reg,const MachineRegisterInfo & MRI)385*82d56013Sjoerg llvm::getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI) {
386*82d56013Sjoerg   Register DefSrcReg = Reg;
3877330f729Sjoerg   auto *DefMI = MRI.getVRegDef(Reg);
3887330f729Sjoerg   auto DstTy = MRI.getType(DefMI->getOperand(0).getReg());
3897330f729Sjoerg   if (!DstTy.isValid())
390*82d56013Sjoerg     return None;
391*82d56013Sjoerg   unsigned Opc = DefMI->getOpcode();
392*82d56013Sjoerg   while (Opc == TargetOpcode::COPY || isPreISelGenericOptimizationHint(Opc)) {
3937330f729Sjoerg     Register SrcReg = DefMI->getOperand(1).getReg();
3947330f729Sjoerg     auto SrcTy = MRI.getType(SrcReg);
395*82d56013Sjoerg     if (!SrcTy.isValid())
3967330f729Sjoerg       break;
3977330f729Sjoerg     DefMI = MRI.getVRegDef(SrcReg);
398*82d56013Sjoerg     DefSrcReg = SrcReg;
399*82d56013Sjoerg     Opc = DefMI->getOpcode();
4007330f729Sjoerg   }
401*82d56013Sjoerg   return DefinitionAndSourceRegister{DefMI, DefSrcReg};
4027330f729Sjoerg }
4037330f729Sjoerg 
getDefIgnoringCopies(Register Reg,const MachineRegisterInfo & MRI)404*82d56013Sjoerg MachineInstr *llvm::getDefIgnoringCopies(Register Reg,
405*82d56013Sjoerg                                          const MachineRegisterInfo &MRI) {
406*82d56013Sjoerg   Optional<DefinitionAndSourceRegister> DefSrcReg =
407*82d56013Sjoerg       getDefSrcRegIgnoringCopies(Reg, MRI);
408*82d56013Sjoerg   return DefSrcReg ? DefSrcReg->MI : nullptr;
409*82d56013Sjoerg }
410*82d56013Sjoerg 
getSrcRegIgnoringCopies(Register Reg,const MachineRegisterInfo & MRI)411*82d56013Sjoerg Register llvm::getSrcRegIgnoringCopies(Register Reg,
412*82d56013Sjoerg                                        const MachineRegisterInfo &MRI) {
413*82d56013Sjoerg   Optional<DefinitionAndSourceRegister> DefSrcReg =
414*82d56013Sjoerg       getDefSrcRegIgnoringCopies(Reg, MRI);
415*82d56013Sjoerg   return DefSrcReg ? DefSrcReg->Reg : Register();
416*82d56013Sjoerg }
417*82d56013Sjoerg 
getOpcodeDef(unsigned Opcode,Register Reg,const MachineRegisterInfo & MRI)418*82d56013Sjoerg MachineInstr *llvm::getOpcodeDef(unsigned Opcode, Register Reg,
4197330f729Sjoerg                                  const MachineRegisterInfo &MRI) {
4207330f729Sjoerg   MachineInstr *DefMI = getDefIgnoringCopies(Reg, MRI);
4217330f729Sjoerg   return DefMI && DefMI->getOpcode() == Opcode ? DefMI : nullptr;
4227330f729Sjoerg }
4237330f729Sjoerg 
getAPFloatFromSize(double Val,unsigned Size)4247330f729Sjoerg APFloat llvm::getAPFloatFromSize(double Val, unsigned Size) {
4257330f729Sjoerg   if (Size == 32)
4267330f729Sjoerg     return APFloat(float(Val));
4277330f729Sjoerg   if (Size == 64)
4287330f729Sjoerg     return APFloat(Val);
4297330f729Sjoerg   if (Size != 16)
4307330f729Sjoerg     llvm_unreachable("Unsupported FPConstant size");
4317330f729Sjoerg   bool Ignored;
4327330f729Sjoerg   APFloat APF(Val);
4337330f729Sjoerg   APF.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
4347330f729Sjoerg   return APF;
4357330f729Sjoerg }
4367330f729Sjoerg 
ConstantFoldBinOp(unsigned Opcode,const Register Op1,const Register Op2,const MachineRegisterInfo & MRI)437*82d56013Sjoerg Optional<APInt> llvm::ConstantFoldBinOp(unsigned Opcode, const Register Op1,
438*82d56013Sjoerg                                         const Register Op2,
4397330f729Sjoerg                                         const MachineRegisterInfo &MRI) {
4407330f729Sjoerg   auto MaybeOp2Cst = getConstantVRegVal(Op2, MRI);
441*82d56013Sjoerg   if (!MaybeOp2Cst)
442*82d56013Sjoerg     return None;
443*82d56013Sjoerg 
444*82d56013Sjoerg   auto MaybeOp1Cst = getConstantVRegVal(Op1, MRI);
445*82d56013Sjoerg   if (!MaybeOp1Cst)
446*82d56013Sjoerg     return None;
447*82d56013Sjoerg 
448*82d56013Sjoerg   const APInt &C1 = *MaybeOp1Cst;
449*82d56013Sjoerg   const APInt &C2 = *MaybeOp2Cst;
4507330f729Sjoerg   switch (Opcode) {
4517330f729Sjoerg   default:
4527330f729Sjoerg     break;
4537330f729Sjoerg   case TargetOpcode::G_ADD:
4547330f729Sjoerg     return C1 + C2;
4557330f729Sjoerg   case TargetOpcode::G_AND:
4567330f729Sjoerg     return C1 & C2;
4577330f729Sjoerg   case TargetOpcode::G_ASHR:
4587330f729Sjoerg     return C1.ashr(C2);
4597330f729Sjoerg   case TargetOpcode::G_LSHR:
4607330f729Sjoerg     return C1.lshr(C2);
4617330f729Sjoerg   case TargetOpcode::G_MUL:
4627330f729Sjoerg     return C1 * C2;
4637330f729Sjoerg   case TargetOpcode::G_OR:
4647330f729Sjoerg     return C1 | C2;
4657330f729Sjoerg   case TargetOpcode::G_SHL:
4667330f729Sjoerg     return C1 << C2;
4677330f729Sjoerg   case TargetOpcode::G_SUB:
4687330f729Sjoerg     return C1 - C2;
4697330f729Sjoerg   case TargetOpcode::G_XOR:
4707330f729Sjoerg     return C1 ^ C2;
4717330f729Sjoerg   case TargetOpcode::G_UDIV:
4727330f729Sjoerg     if (!C2.getBoolValue())
4737330f729Sjoerg       break;
4747330f729Sjoerg     return C1.udiv(C2);
4757330f729Sjoerg   case TargetOpcode::G_SDIV:
4767330f729Sjoerg     if (!C2.getBoolValue())
4777330f729Sjoerg       break;
4787330f729Sjoerg     return C1.sdiv(C2);
4797330f729Sjoerg   case TargetOpcode::G_UREM:
4807330f729Sjoerg     if (!C2.getBoolValue())
4817330f729Sjoerg       break;
4827330f729Sjoerg     return C1.urem(C2);
4837330f729Sjoerg   case TargetOpcode::G_SREM:
4847330f729Sjoerg     if (!C2.getBoolValue())
4857330f729Sjoerg       break;
4867330f729Sjoerg     return C1.srem(C2);
4877330f729Sjoerg   }
488*82d56013Sjoerg 
489*82d56013Sjoerg   return None;
4907330f729Sjoerg }
491*82d56013Sjoerg 
ConstantFoldFPBinOp(unsigned Opcode,const Register Op1,const Register Op2,const MachineRegisterInfo & MRI)492*82d56013Sjoerg Optional<APFloat> llvm::ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
493*82d56013Sjoerg                                             const Register Op2,
494*82d56013Sjoerg                                             const MachineRegisterInfo &MRI) {
495*82d56013Sjoerg   const ConstantFP *Op2Cst = getConstantFPVRegVal(Op2, MRI);
496*82d56013Sjoerg   if (!Op2Cst)
497*82d56013Sjoerg     return None;
498*82d56013Sjoerg 
499*82d56013Sjoerg   const ConstantFP *Op1Cst = getConstantFPVRegVal(Op1, MRI);
500*82d56013Sjoerg   if (!Op1Cst)
501*82d56013Sjoerg     return None;
502*82d56013Sjoerg 
503*82d56013Sjoerg   APFloat C1 = Op1Cst->getValueAPF();
504*82d56013Sjoerg   const APFloat &C2 = Op2Cst->getValueAPF();
505*82d56013Sjoerg   switch (Opcode) {
506*82d56013Sjoerg   case TargetOpcode::G_FADD:
507*82d56013Sjoerg     C1.add(C2, APFloat::rmNearestTiesToEven);
508*82d56013Sjoerg     return C1;
509*82d56013Sjoerg   case TargetOpcode::G_FSUB:
510*82d56013Sjoerg     C1.subtract(C2, APFloat::rmNearestTiesToEven);
511*82d56013Sjoerg     return C1;
512*82d56013Sjoerg   case TargetOpcode::G_FMUL:
513*82d56013Sjoerg     C1.multiply(C2, APFloat::rmNearestTiesToEven);
514*82d56013Sjoerg     return C1;
515*82d56013Sjoerg   case TargetOpcode::G_FDIV:
516*82d56013Sjoerg     C1.divide(C2, APFloat::rmNearestTiesToEven);
517*82d56013Sjoerg     return C1;
518*82d56013Sjoerg   case TargetOpcode::G_FREM:
519*82d56013Sjoerg     C1.mod(C2);
520*82d56013Sjoerg     return C1;
521*82d56013Sjoerg   case TargetOpcode::G_FCOPYSIGN:
522*82d56013Sjoerg     C1.copySign(C2);
523*82d56013Sjoerg     return C1;
524*82d56013Sjoerg   case TargetOpcode::G_FMINNUM:
525*82d56013Sjoerg     return minnum(C1, C2);
526*82d56013Sjoerg   case TargetOpcode::G_FMAXNUM:
527*82d56013Sjoerg     return maxnum(C1, C2);
528*82d56013Sjoerg   case TargetOpcode::G_FMINIMUM:
529*82d56013Sjoerg     return minimum(C1, C2);
530*82d56013Sjoerg   case TargetOpcode::G_FMAXIMUM:
531*82d56013Sjoerg     return maximum(C1, C2);
532*82d56013Sjoerg   case TargetOpcode::G_FMINNUM_IEEE:
533*82d56013Sjoerg   case TargetOpcode::G_FMAXNUM_IEEE:
534*82d56013Sjoerg     // FIXME: These operations were unfortunately named. fminnum/fmaxnum do not
535*82d56013Sjoerg     // follow the IEEE behavior for signaling nans and follow libm's fmin/fmax,
536*82d56013Sjoerg     // and currently there isn't a nice wrapper in APFloat for the version with
537*82d56013Sjoerg     // correct snan handling.
538*82d56013Sjoerg     break;
539*82d56013Sjoerg   default:
540*82d56013Sjoerg     break;
541*82d56013Sjoerg   }
542*82d56013Sjoerg 
5437330f729Sjoerg   return None;
5447330f729Sjoerg }
5457330f729Sjoerg 
isKnownNeverNaN(Register Val,const MachineRegisterInfo & MRI,bool SNaN)5467330f729Sjoerg bool llvm::isKnownNeverNaN(Register Val, const MachineRegisterInfo &MRI,
5477330f729Sjoerg                            bool SNaN) {
5487330f729Sjoerg   const MachineInstr *DefMI = MRI.getVRegDef(Val);
5497330f729Sjoerg   if (!DefMI)
5507330f729Sjoerg     return false;
5517330f729Sjoerg 
552*82d56013Sjoerg   const TargetMachine& TM = DefMI->getMF()->getTarget();
553*82d56013Sjoerg   if (DefMI->getFlag(MachineInstr::FmNoNans) || TM.Options.NoNaNsFPMath)
5547330f729Sjoerg     return true;
5557330f729Sjoerg 
556*82d56013Sjoerg   // If the value is a constant, we can obviously see if it is a NaN or not.
557*82d56013Sjoerg   if (const ConstantFP *FPVal = getConstantFPVRegVal(Val, MRI)) {
558*82d56013Sjoerg     return !FPVal->getValueAPF().isNaN() ||
559*82d56013Sjoerg            (SNaN && !FPVal->getValueAPF().isSignaling());
560*82d56013Sjoerg   }
561*82d56013Sjoerg 
562*82d56013Sjoerg   if (DefMI->getOpcode() == TargetOpcode::G_BUILD_VECTOR) {
563*82d56013Sjoerg     for (const auto &Op : DefMI->uses())
564*82d56013Sjoerg       if (!isKnownNeverNaN(Op.getReg(), MRI, SNaN))
565*82d56013Sjoerg         return false;
566*82d56013Sjoerg     return true;
567*82d56013Sjoerg   }
568*82d56013Sjoerg 
569*82d56013Sjoerg   switch (DefMI->getOpcode()) {
570*82d56013Sjoerg   default:
571*82d56013Sjoerg     break;
572*82d56013Sjoerg   case TargetOpcode::G_FMINNUM_IEEE:
573*82d56013Sjoerg   case TargetOpcode::G_FMAXNUM_IEEE: {
574*82d56013Sjoerg     if (SNaN)
575*82d56013Sjoerg       return true;
576*82d56013Sjoerg     // This can return a NaN if either operand is an sNaN, or if both operands
577*82d56013Sjoerg     // are NaN.
578*82d56013Sjoerg     return (isKnownNeverNaN(DefMI->getOperand(1).getReg(), MRI) &&
579*82d56013Sjoerg             isKnownNeverSNaN(DefMI->getOperand(2).getReg(), MRI)) ||
580*82d56013Sjoerg            (isKnownNeverSNaN(DefMI->getOperand(1).getReg(), MRI) &&
581*82d56013Sjoerg             isKnownNeverNaN(DefMI->getOperand(2).getReg(), MRI));
582*82d56013Sjoerg   }
583*82d56013Sjoerg   case TargetOpcode::G_FMINNUM:
584*82d56013Sjoerg   case TargetOpcode::G_FMAXNUM: {
585*82d56013Sjoerg     // Only one needs to be known not-nan, since it will be returned if the
586*82d56013Sjoerg     // other ends up being one.
587*82d56013Sjoerg     return isKnownNeverNaN(DefMI->getOperand(1).getReg(), MRI, SNaN) ||
588*82d56013Sjoerg            isKnownNeverNaN(DefMI->getOperand(2).getReg(), MRI, SNaN);
589*82d56013Sjoerg   }
590*82d56013Sjoerg   }
591*82d56013Sjoerg 
5927330f729Sjoerg   if (SNaN) {
5937330f729Sjoerg     // FP operations quiet. For now, just handle the ones inserted during
5947330f729Sjoerg     // legalization.
5957330f729Sjoerg     switch (DefMI->getOpcode()) {
5967330f729Sjoerg     case TargetOpcode::G_FPEXT:
5977330f729Sjoerg     case TargetOpcode::G_FPTRUNC:
5987330f729Sjoerg     case TargetOpcode::G_FCANONICALIZE:
5997330f729Sjoerg       return true;
6007330f729Sjoerg     default:
6017330f729Sjoerg       return false;
6027330f729Sjoerg     }
6037330f729Sjoerg   }
6047330f729Sjoerg 
6057330f729Sjoerg   return false;
6067330f729Sjoerg }
6077330f729Sjoerg 
inferAlignFromPtrInfo(MachineFunction & MF,const MachinePointerInfo & MPO)608*82d56013Sjoerg Align llvm::inferAlignFromPtrInfo(MachineFunction &MF,
609*82d56013Sjoerg                                   const MachinePointerInfo &MPO) {
610*82d56013Sjoerg   auto PSV = MPO.V.dyn_cast<const PseudoSourceValue *>();
611*82d56013Sjoerg   if (auto FSPV = dyn_cast_or_null<FixedStackPseudoSourceValue>(PSV)) {
612*82d56013Sjoerg     MachineFrameInfo &MFI = MF.getFrameInfo();
613*82d56013Sjoerg     return commonAlignment(MFI.getObjectAlign(FSPV->getFrameIndex()),
614*82d56013Sjoerg                            MPO.Offset);
615*82d56013Sjoerg   }
616*82d56013Sjoerg 
617*82d56013Sjoerg   if (const Value *V = MPO.V.dyn_cast<const Value *>()) {
618*82d56013Sjoerg     const Module *M = MF.getFunction().getParent();
619*82d56013Sjoerg     return V->getPointerAlignment(M->getDataLayout());
620*82d56013Sjoerg   }
621*82d56013Sjoerg 
622*82d56013Sjoerg   return Align(1);
623*82d56013Sjoerg }
624*82d56013Sjoerg 
getFunctionLiveInPhysReg(MachineFunction & MF,const TargetInstrInfo & TII,MCRegister PhysReg,const TargetRegisterClass & RC,LLT RegTy)625*82d56013Sjoerg Register llvm::getFunctionLiveInPhysReg(MachineFunction &MF,
626*82d56013Sjoerg                                         const TargetInstrInfo &TII,
627*82d56013Sjoerg                                         MCRegister PhysReg,
628*82d56013Sjoerg                                         const TargetRegisterClass &RC,
629*82d56013Sjoerg                                         LLT RegTy) {
630*82d56013Sjoerg   DebugLoc DL; // FIXME: Is no location the right choice?
631*82d56013Sjoerg   MachineBasicBlock &EntryMBB = MF.front();
632*82d56013Sjoerg   MachineRegisterInfo &MRI = MF.getRegInfo();
633*82d56013Sjoerg   Register LiveIn = MRI.getLiveInVirtReg(PhysReg);
634*82d56013Sjoerg   if (LiveIn) {
635*82d56013Sjoerg     MachineInstr *Def = MRI.getVRegDef(LiveIn);
636*82d56013Sjoerg     if (Def) {
637*82d56013Sjoerg       // FIXME: Should the verifier check this is in the entry block?
638*82d56013Sjoerg       assert(Def->getParent() == &EntryMBB && "live-in copy not in entry block");
639*82d56013Sjoerg       return LiveIn;
640*82d56013Sjoerg     }
641*82d56013Sjoerg 
642*82d56013Sjoerg     // It's possible the incoming argument register and copy was added during
643*82d56013Sjoerg     // lowering, but later deleted due to being/becoming dead. If this happens,
644*82d56013Sjoerg     // re-insert the copy.
645*82d56013Sjoerg   } else {
646*82d56013Sjoerg     // The live in register was not present, so add it.
647*82d56013Sjoerg     LiveIn = MF.addLiveIn(PhysReg, &RC);
648*82d56013Sjoerg     if (RegTy.isValid())
649*82d56013Sjoerg       MRI.setType(LiveIn, RegTy);
650*82d56013Sjoerg   }
651*82d56013Sjoerg 
652*82d56013Sjoerg   BuildMI(EntryMBB, EntryMBB.begin(), DL, TII.get(TargetOpcode::COPY), LiveIn)
653*82d56013Sjoerg     .addReg(PhysReg);
654*82d56013Sjoerg   if (!EntryMBB.isLiveIn(PhysReg))
655*82d56013Sjoerg     EntryMBB.addLiveIn(PhysReg);
656*82d56013Sjoerg   return LiveIn;
657*82d56013Sjoerg }
658*82d56013Sjoerg 
ConstantFoldExtOp(unsigned Opcode,const Register Op1,uint64_t Imm,const MachineRegisterInfo & MRI)659*82d56013Sjoerg Optional<APInt> llvm::ConstantFoldExtOp(unsigned Opcode, const Register Op1,
6607330f729Sjoerg                                         uint64_t Imm,
6617330f729Sjoerg                                         const MachineRegisterInfo &MRI) {
6627330f729Sjoerg   auto MaybeOp1Cst = getConstantVRegVal(Op1, MRI);
6637330f729Sjoerg   if (MaybeOp1Cst) {
6647330f729Sjoerg     switch (Opcode) {
6657330f729Sjoerg     default:
6667330f729Sjoerg       break;
667*82d56013Sjoerg     case TargetOpcode::G_SEXT_INREG: {
668*82d56013Sjoerg       LLT Ty = MRI.getType(Op1);
669*82d56013Sjoerg       return MaybeOp1Cst->trunc(Imm).sext(Ty.getScalarSizeInBits());
670*82d56013Sjoerg     }
6717330f729Sjoerg     }
6727330f729Sjoerg   }
6737330f729Sjoerg   return None;
6747330f729Sjoerg }
6757330f729Sjoerg 
isKnownToBeAPowerOfTwo(Register Reg,const MachineRegisterInfo & MRI,GISelKnownBits * KB)676*82d56013Sjoerg bool llvm::isKnownToBeAPowerOfTwo(Register Reg, const MachineRegisterInfo &MRI,
677*82d56013Sjoerg                                   GISelKnownBits *KB) {
678*82d56013Sjoerg   Optional<DefinitionAndSourceRegister> DefSrcReg =
679*82d56013Sjoerg       getDefSrcRegIgnoringCopies(Reg, MRI);
680*82d56013Sjoerg   if (!DefSrcReg)
681*82d56013Sjoerg     return false;
682*82d56013Sjoerg 
683*82d56013Sjoerg   const MachineInstr &MI = *DefSrcReg->MI;
684*82d56013Sjoerg   const LLT Ty = MRI.getType(Reg);
685*82d56013Sjoerg 
686*82d56013Sjoerg   switch (MI.getOpcode()) {
687*82d56013Sjoerg   case TargetOpcode::G_CONSTANT: {
688*82d56013Sjoerg     unsigned BitWidth = Ty.getScalarSizeInBits();
689*82d56013Sjoerg     const ConstantInt *CI = MI.getOperand(1).getCImm();
690*82d56013Sjoerg     return CI->getValue().zextOrTrunc(BitWidth).isPowerOf2();
691*82d56013Sjoerg   }
692*82d56013Sjoerg   case TargetOpcode::G_SHL: {
693*82d56013Sjoerg     // A left-shift of a constant one will have exactly one bit set because
694*82d56013Sjoerg     // shifting the bit off the end is undefined.
695*82d56013Sjoerg 
696*82d56013Sjoerg     // TODO: Constant splat
697*82d56013Sjoerg     if (auto ConstLHS = getConstantVRegVal(MI.getOperand(1).getReg(), MRI)) {
698*82d56013Sjoerg       if (*ConstLHS == 1)
699*82d56013Sjoerg         return true;
700*82d56013Sjoerg     }
701*82d56013Sjoerg 
702*82d56013Sjoerg     break;
703*82d56013Sjoerg   }
704*82d56013Sjoerg   case TargetOpcode::G_LSHR: {
705*82d56013Sjoerg     if (auto ConstLHS = getConstantVRegVal(MI.getOperand(1).getReg(), MRI)) {
706*82d56013Sjoerg       if (ConstLHS->isSignMask())
707*82d56013Sjoerg         return true;
708*82d56013Sjoerg     }
709*82d56013Sjoerg 
710*82d56013Sjoerg     break;
711*82d56013Sjoerg   }
712*82d56013Sjoerg   case TargetOpcode::G_BUILD_VECTOR: {
713*82d56013Sjoerg     // TODO: Probably should have a recursion depth guard since you could have
714*82d56013Sjoerg     // bitcasted vector elements.
715*82d56013Sjoerg     for (unsigned I = 1, E = MI.getNumOperands(); I != E; ++I) {
716*82d56013Sjoerg       if (!isKnownToBeAPowerOfTwo(MI.getOperand(I).getReg(), MRI, KB))
717*82d56013Sjoerg         return false;
718*82d56013Sjoerg     }
719*82d56013Sjoerg 
720*82d56013Sjoerg     return true;
721*82d56013Sjoerg   }
722*82d56013Sjoerg   case TargetOpcode::G_BUILD_VECTOR_TRUNC: {
723*82d56013Sjoerg     // Only handle constants since we would need to know if number of leading
724*82d56013Sjoerg     // zeros is greater than the truncation amount.
725*82d56013Sjoerg     const unsigned BitWidth = Ty.getScalarSizeInBits();
726*82d56013Sjoerg     for (unsigned I = 1, E = MI.getNumOperands(); I != E; ++I) {
727*82d56013Sjoerg       auto Const = getConstantVRegVal(MI.getOperand(I).getReg(), MRI);
728*82d56013Sjoerg       if (!Const || !Const->zextOrTrunc(BitWidth).isPowerOf2())
729*82d56013Sjoerg         return false;
730*82d56013Sjoerg     }
731*82d56013Sjoerg 
732*82d56013Sjoerg     return true;
733*82d56013Sjoerg   }
734*82d56013Sjoerg   default:
735*82d56013Sjoerg     break;
736*82d56013Sjoerg   }
737*82d56013Sjoerg 
738*82d56013Sjoerg   if (!KB)
739*82d56013Sjoerg     return false;
740*82d56013Sjoerg 
741*82d56013Sjoerg   // More could be done here, though the above checks are enough
742*82d56013Sjoerg   // to handle some common cases.
743*82d56013Sjoerg 
744*82d56013Sjoerg   // Fall back to computeKnownBits to catch other known cases.
745*82d56013Sjoerg   KnownBits Known = KB->getKnownBits(Reg);
746*82d56013Sjoerg   return (Known.countMaxPopulation() == 1) && (Known.countMinPopulation() == 1);
747*82d56013Sjoerg }
748*82d56013Sjoerg 
getSelectionDAGFallbackAnalysisUsage(AnalysisUsage & AU)7497330f729Sjoerg void llvm::getSelectionDAGFallbackAnalysisUsage(AnalysisUsage &AU) {
7507330f729Sjoerg   AU.addPreserved<StackProtector>();
7517330f729Sjoerg }
7527330f729Sjoerg 
getLCMSize(unsigned OrigSize,unsigned TargetSize)753*82d56013Sjoerg static unsigned getLCMSize(unsigned OrigSize, unsigned TargetSize) {
754*82d56013Sjoerg   unsigned Mul = OrigSize * TargetSize;
755*82d56013Sjoerg   unsigned GCDSize = greatestCommonDivisor(OrigSize, TargetSize);
756*82d56013Sjoerg   return Mul / GCDSize;
7577330f729Sjoerg }
7587330f729Sjoerg 
getLCMType(LLT OrigTy,LLT TargetTy)759*82d56013Sjoerg LLT llvm::getLCMType(LLT OrigTy, LLT TargetTy) {
760*82d56013Sjoerg   const unsigned OrigSize = OrigTy.getSizeInBits();
761*82d56013Sjoerg   const unsigned TargetSize = TargetTy.getSizeInBits();
7627330f729Sjoerg 
763*82d56013Sjoerg   if (OrigSize == TargetSize)
764*82d56013Sjoerg     return OrigTy;
765*82d56013Sjoerg 
766*82d56013Sjoerg   if (OrigTy.isVector()) {
767*82d56013Sjoerg     const LLT OrigElt = OrigTy.getElementType();
768*82d56013Sjoerg 
769*82d56013Sjoerg     if (TargetTy.isVector()) {
770*82d56013Sjoerg       const LLT TargetElt = TargetTy.getElementType();
771*82d56013Sjoerg 
772*82d56013Sjoerg       if (OrigElt.getSizeInBits() == TargetElt.getSizeInBits()) {
773*82d56013Sjoerg         int GCDElts = greatestCommonDivisor(OrigTy.getNumElements(),
774*82d56013Sjoerg                                             TargetTy.getNumElements());
775*82d56013Sjoerg         // Prefer the original element type.
776*82d56013Sjoerg         int Mul = OrigTy.getNumElements() * TargetTy.getNumElements();
777*82d56013Sjoerg         return LLT::vector(Mul / GCDElts, OrigTy.getElementType());
778*82d56013Sjoerg       }
779*82d56013Sjoerg     } else {
780*82d56013Sjoerg       if (OrigElt.getSizeInBits() == TargetSize)
781*82d56013Sjoerg         return OrigTy;
782*82d56013Sjoerg     }
783*82d56013Sjoerg 
784*82d56013Sjoerg     unsigned LCMSize = getLCMSize(OrigSize, TargetSize);
785*82d56013Sjoerg     return LLT::vector(LCMSize / OrigElt.getSizeInBits(), OrigElt);
786*82d56013Sjoerg   }
787*82d56013Sjoerg 
788*82d56013Sjoerg   if (TargetTy.isVector()) {
789*82d56013Sjoerg     unsigned LCMSize = getLCMSize(OrigSize, TargetSize);
790*82d56013Sjoerg     return LLT::vector(LCMSize / OrigSize, OrigTy);
791*82d56013Sjoerg   }
792*82d56013Sjoerg 
793*82d56013Sjoerg   unsigned LCMSize = getLCMSize(OrigSize, TargetSize);
794*82d56013Sjoerg 
795*82d56013Sjoerg   // Preserve pointer types.
796*82d56013Sjoerg   if (LCMSize == OrigSize)
797*82d56013Sjoerg     return OrigTy;
798*82d56013Sjoerg   if (LCMSize == TargetSize)
799*82d56013Sjoerg     return TargetTy;
800*82d56013Sjoerg 
801*82d56013Sjoerg   return LLT::scalar(LCMSize);
802*82d56013Sjoerg }
803*82d56013Sjoerg 
getGCDType(LLT OrigTy,LLT TargetTy)804*82d56013Sjoerg LLT llvm::getGCDType(LLT OrigTy, LLT TargetTy) {
805*82d56013Sjoerg   const unsigned OrigSize = OrigTy.getSizeInBits();
806*82d56013Sjoerg   const unsigned TargetSize = TargetTy.getSizeInBits();
807*82d56013Sjoerg 
808*82d56013Sjoerg   if (OrigSize == TargetSize)
809*82d56013Sjoerg     return OrigTy;
810*82d56013Sjoerg 
811*82d56013Sjoerg   if (OrigTy.isVector()) {
812*82d56013Sjoerg     LLT OrigElt = OrigTy.getElementType();
813*82d56013Sjoerg     if (TargetTy.isVector()) {
814*82d56013Sjoerg       LLT TargetElt = TargetTy.getElementType();
815*82d56013Sjoerg       if (OrigElt.getSizeInBits() == TargetElt.getSizeInBits()) {
816*82d56013Sjoerg         int GCD = greatestCommonDivisor(OrigTy.getNumElements(),
817*82d56013Sjoerg                                         TargetTy.getNumElements());
818*82d56013Sjoerg         return LLT::scalarOrVector(GCD, OrigElt);
819*82d56013Sjoerg       }
820*82d56013Sjoerg     } else {
821*82d56013Sjoerg       // If the source is a vector of pointers, return a pointer element.
822*82d56013Sjoerg       if (OrigElt.getSizeInBits() == TargetSize)
823*82d56013Sjoerg         return OrigElt;
824*82d56013Sjoerg     }
825*82d56013Sjoerg 
826*82d56013Sjoerg     unsigned GCD = greatestCommonDivisor(OrigSize, TargetSize);
827*82d56013Sjoerg     if (GCD == OrigElt.getSizeInBits())
828*82d56013Sjoerg       return OrigElt;
829*82d56013Sjoerg 
830*82d56013Sjoerg     // If we can't produce the original element type, we have to use a smaller
831*82d56013Sjoerg     // scalar.
832*82d56013Sjoerg     if (GCD < OrigElt.getSizeInBits())
833*82d56013Sjoerg       return LLT::scalar(GCD);
834*82d56013Sjoerg     return LLT::vector(GCD / OrigElt.getSizeInBits(), OrigElt);
835*82d56013Sjoerg   }
836*82d56013Sjoerg 
837*82d56013Sjoerg   if (TargetTy.isVector()) {
838*82d56013Sjoerg     // Try to preserve the original element type.
839*82d56013Sjoerg     LLT TargetElt = TargetTy.getElementType();
840*82d56013Sjoerg     if (TargetElt.getSizeInBits() == OrigSize)
841*82d56013Sjoerg       return OrigTy;
842*82d56013Sjoerg   }
843*82d56013Sjoerg 
844*82d56013Sjoerg   unsigned GCD = greatestCommonDivisor(OrigSize, TargetSize);
845*82d56013Sjoerg   return LLT::scalar(GCD);
846*82d56013Sjoerg }
847*82d56013Sjoerg 
getSplatIndex(MachineInstr & MI)848*82d56013Sjoerg Optional<int> llvm::getSplatIndex(MachineInstr &MI) {
849*82d56013Sjoerg   assert(MI.getOpcode() == TargetOpcode::G_SHUFFLE_VECTOR &&
850*82d56013Sjoerg          "Only G_SHUFFLE_VECTOR can have a splat index!");
851*82d56013Sjoerg   ArrayRef<int> Mask = MI.getOperand(3).getShuffleMask();
852*82d56013Sjoerg   auto FirstDefinedIdx = find_if(Mask, [](int Elt) { return Elt >= 0; });
853*82d56013Sjoerg 
854*82d56013Sjoerg   // If all elements are undefined, this shuffle can be considered a splat.
855*82d56013Sjoerg   // Return 0 for better potential for callers to simplify.
856*82d56013Sjoerg   if (FirstDefinedIdx == Mask.end())
857*82d56013Sjoerg     return 0;
858*82d56013Sjoerg 
859*82d56013Sjoerg   // Make sure all remaining elements are either undef or the same
860*82d56013Sjoerg   // as the first non-undef value.
861*82d56013Sjoerg   int SplatValue = *FirstDefinedIdx;
862*82d56013Sjoerg   if (any_of(make_range(std::next(FirstDefinedIdx), Mask.end()),
863*82d56013Sjoerg              [&SplatValue](int Elt) { return Elt >= 0 && Elt != SplatValue; }))
864*82d56013Sjoerg     return None;
865*82d56013Sjoerg 
866*82d56013Sjoerg   return SplatValue;
867*82d56013Sjoerg }
868*82d56013Sjoerg 
isBuildVectorOp(unsigned Opcode)869*82d56013Sjoerg static bool isBuildVectorOp(unsigned Opcode) {
870*82d56013Sjoerg   return Opcode == TargetOpcode::G_BUILD_VECTOR ||
871*82d56013Sjoerg          Opcode == TargetOpcode::G_BUILD_VECTOR_TRUNC;
872*82d56013Sjoerg }
873*82d56013Sjoerg 
874*82d56013Sjoerg // TODO: Handle mixed undef elements.
isBuildVectorConstantSplat(const MachineInstr & MI,const MachineRegisterInfo & MRI,int64_t SplatValue)875*82d56013Sjoerg static bool isBuildVectorConstantSplat(const MachineInstr &MI,
876*82d56013Sjoerg                                        const MachineRegisterInfo &MRI,
877*82d56013Sjoerg                                        int64_t SplatValue) {
878*82d56013Sjoerg   if (!isBuildVectorOp(MI.getOpcode()))
879*82d56013Sjoerg     return false;
880*82d56013Sjoerg 
881*82d56013Sjoerg   const unsigned NumOps = MI.getNumOperands();
882*82d56013Sjoerg   for (unsigned I = 1; I != NumOps; ++I) {
883*82d56013Sjoerg     Register Element = MI.getOperand(I).getReg();
884*82d56013Sjoerg     if (!mi_match(Element, MRI, m_SpecificICst(SplatValue)))
885*82d56013Sjoerg       return false;
886*82d56013Sjoerg   }
887*82d56013Sjoerg 
888*82d56013Sjoerg   return true;
889*82d56013Sjoerg }
890*82d56013Sjoerg 
891*82d56013Sjoerg Optional<int64_t>
getBuildVectorConstantSplat(const MachineInstr & MI,const MachineRegisterInfo & MRI)892*82d56013Sjoerg llvm::getBuildVectorConstantSplat(const MachineInstr &MI,
893*82d56013Sjoerg                                   const MachineRegisterInfo &MRI) {
894*82d56013Sjoerg   if (!isBuildVectorOp(MI.getOpcode()))
895*82d56013Sjoerg     return None;
896*82d56013Sjoerg 
897*82d56013Sjoerg   const unsigned NumOps = MI.getNumOperands();
898*82d56013Sjoerg   Optional<int64_t> Scalar;
899*82d56013Sjoerg   for (unsigned I = 1; I != NumOps; ++I) {
900*82d56013Sjoerg     Register Element = MI.getOperand(I).getReg();
901*82d56013Sjoerg     int64_t ElementValue;
902*82d56013Sjoerg     if (!mi_match(Element, MRI, m_ICst(ElementValue)))
903*82d56013Sjoerg       return None;
904*82d56013Sjoerg     if (!Scalar)
905*82d56013Sjoerg       Scalar = ElementValue;
906*82d56013Sjoerg     else if (*Scalar != ElementValue)
907*82d56013Sjoerg       return None;
908*82d56013Sjoerg   }
909*82d56013Sjoerg 
910*82d56013Sjoerg   return Scalar;
911*82d56013Sjoerg }
912*82d56013Sjoerg 
isBuildVectorAllZeros(const MachineInstr & MI,const MachineRegisterInfo & MRI)913*82d56013Sjoerg bool llvm::isBuildVectorAllZeros(const MachineInstr &MI,
914*82d56013Sjoerg                                  const MachineRegisterInfo &MRI) {
915*82d56013Sjoerg   return isBuildVectorConstantSplat(MI, MRI, 0);
916*82d56013Sjoerg }
917*82d56013Sjoerg 
isBuildVectorAllOnes(const MachineInstr & MI,const MachineRegisterInfo & MRI)918*82d56013Sjoerg bool llvm::isBuildVectorAllOnes(const MachineInstr &MI,
919*82d56013Sjoerg                                 const MachineRegisterInfo &MRI) {
920*82d56013Sjoerg   return isBuildVectorConstantSplat(MI, MRI, -1);
921*82d56013Sjoerg }
922*82d56013Sjoerg 
getVectorSplat(const MachineInstr & MI,const MachineRegisterInfo & MRI)923*82d56013Sjoerg Optional<RegOrConstant> llvm::getVectorSplat(const MachineInstr &MI,
924*82d56013Sjoerg                                              const MachineRegisterInfo &MRI) {
925*82d56013Sjoerg   unsigned Opc = MI.getOpcode();
926*82d56013Sjoerg   if (!isBuildVectorOp(Opc))
927*82d56013Sjoerg     return None;
928*82d56013Sjoerg   if (auto Splat = getBuildVectorConstantSplat(MI, MRI))
929*82d56013Sjoerg     return RegOrConstant(*Splat);
930*82d56013Sjoerg   auto Reg = MI.getOperand(1).getReg();
931*82d56013Sjoerg   if (any_of(make_range(MI.operands_begin() + 2, MI.operands_end()),
932*82d56013Sjoerg              [&Reg](const MachineOperand &Op) { return Op.getReg() != Reg; }))
933*82d56013Sjoerg     return None;
934*82d56013Sjoerg   return RegOrConstant(Reg);
935*82d56013Sjoerg }
936*82d56013Sjoerg 
matchUnaryPredicate(const MachineRegisterInfo & MRI,Register Reg,std::function<bool (const Constant * ConstVal)> Match,bool AllowUndefs)937*82d56013Sjoerg bool llvm::matchUnaryPredicate(
938*82d56013Sjoerg     const MachineRegisterInfo &MRI, Register Reg,
939*82d56013Sjoerg     std::function<bool(const Constant *ConstVal)> Match, bool AllowUndefs) {
940*82d56013Sjoerg 
941*82d56013Sjoerg   const MachineInstr *Def = getDefIgnoringCopies(Reg, MRI);
942*82d56013Sjoerg   if (AllowUndefs && Def->getOpcode() == TargetOpcode::G_IMPLICIT_DEF)
943*82d56013Sjoerg     return Match(nullptr);
944*82d56013Sjoerg 
945*82d56013Sjoerg   // TODO: Also handle fconstant
946*82d56013Sjoerg   if (Def->getOpcode() == TargetOpcode::G_CONSTANT)
947*82d56013Sjoerg     return Match(Def->getOperand(1).getCImm());
948*82d56013Sjoerg 
949*82d56013Sjoerg   if (Def->getOpcode() != TargetOpcode::G_BUILD_VECTOR)
950*82d56013Sjoerg     return false;
951*82d56013Sjoerg 
952*82d56013Sjoerg   for (unsigned I = 1, E = Def->getNumOperands(); I != E; ++I) {
953*82d56013Sjoerg     Register SrcElt = Def->getOperand(I).getReg();
954*82d56013Sjoerg     const MachineInstr *SrcDef = getDefIgnoringCopies(SrcElt, MRI);
955*82d56013Sjoerg     if (AllowUndefs && SrcDef->getOpcode() == TargetOpcode::G_IMPLICIT_DEF) {
956*82d56013Sjoerg       if (!Match(nullptr))
957*82d56013Sjoerg         return false;
958*82d56013Sjoerg       continue;
959*82d56013Sjoerg     }
960*82d56013Sjoerg 
961*82d56013Sjoerg     if (SrcDef->getOpcode() != TargetOpcode::G_CONSTANT ||
962*82d56013Sjoerg         !Match(SrcDef->getOperand(1).getCImm()))
963*82d56013Sjoerg       return false;
964*82d56013Sjoerg   }
965*82d56013Sjoerg 
966*82d56013Sjoerg   return true;
967*82d56013Sjoerg }
968*82d56013Sjoerg 
isConstTrueVal(const TargetLowering & TLI,int64_t Val,bool IsVector,bool IsFP)969*82d56013Sjoerg bool llvm::isConstTrueVal(const TargetLowering &TLI, int64_t Val, bool IsVector,
970*82d56013Sjoerg                           bool IsFP) {
971*82d56013Sjoerg   switch (TLI.getBooleanContents(IsVector, IsFP)) {
972*82d56013Sjoerg   case TargetLowering::UndefinedBooleanContent:
973*82d56013Sjoerg     return Val & 0x1;
974*82d56013Sjoerg   case TargetLowering::ZeroOrOneBooleanContent:
975*82d56013Sjoerg     return Val == 1;
976*82d56013Sjoerg   case TargetLowering::ZeroOrNegativeOneBooleanContent:
977*82d56013Sjoerg     return Val == -1;
978*82d56013Sjoerg   }
979*82d56013Sjoerg   llvm_unreachable("Invalid boolean contents");
980*82d56013Sjoerg }
981*82d56013Sjoerg 
getICmpTrueVal(const TargetLowering & TLI,bool IsVector,bool IsFP)982*82d56013Sjoerg int64_t llvm::getICmpTrueVal(const TargetLowering &TLI, bool IsVector,
983*82d56013Sjoerg                              bool IsFP) {
984*82d56013Sjoerg   switch (TLI.getBooleanContents(IsVector, IsFP)) {
985*82d56013Sjoerg   case TargetLowering::UndefinedBooleanContent:
986*82d56013Sjoerg   case TargetLowering::ZeroOrOneBooleanContent:
987*82d56013Sjoerg     return 1;
988*82d56013Sjoerg   case TargetLowering::ZeroOrNegativeOneBooleanContent:
989*82d56013Sjoerg     return -1;
990*82d56013Sjoerg   }
991*82d56013Sjoerg   llvm_unreachable("Invalid boolean contents");
992*82d56013Sjoerg }
993*82d56013Sjoerg 
shouldOptForSize(const MachineBasicBlock & MBB,ProfileSummaryInfo * PSI,BlockFrequencyInfo * BFI)994*82d56013Sjoerg bool llvm::shouldOptForSize(const MachineBasicBlock &MBB,
995*82d56013Sjoerg                             ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) {
996*82d56013Sjoerg   const auto &F = MBB.getParent()->getFunction();
997*82d56013Sjoerg   return F.hasOptSize() || F.hasMinSize() ||
998*82d56013Sjoerg          llvm::shouldOptimizeForSize(MBB.getBasicBlock(), PSI, BFI);
999*82d56013Sjoerg }
1000*82d56013Sjoerg 
getIntrinsicID(const MachineInstr & MI)1001*82d56013Sjoerg unsigned llvm::getIntrinsicID(const MachineInstr &MI) {
1002*82d56013Sjoerg #ifndef NDEBUG
1003*82d56013Sjoerg   unsigned Opc = MI.getOpcode();
1004*82d56013Sjoerg   assert(Opc == TargetOpcode::G_INTRINSIC ||
1005*82d56013Sjoerg          Opc == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS);
1006*82d56013Sjoerg #endif
1007*82d56013Sjoerg   return MI.getOperand(MI.getNumExplicitDefs()).getIntrinsicID();
10087330f729Sjoerg }
1009