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