LLVM: lib/IR/Intrinsics.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

18#include "llvm/IR/IntrinsicsAArch64.h"

19#include "llvm/IR/IntrinsicsAMDGPU.h"

20#include "llvm/IR/IntrinsicsARM.h"

21#include "llvm/IR/IntrinsicsBPF.h"

22#include "llvm/IR/IntrinsicsHexagon.h"

23#include "llvm/IR/IntrinsicsLoongArch.h"

24#include "llvm/IR/IntrinsicsMips.h"

25#include "llvm/IR/IntrinsicsNVPTX.h"

26#include "llvm/IR/IntrinsicsPowerPC.h"

27#include "llvm/IR/IntrinsicsR600.h"

28#include "llvm/IR/IntrinsicsRISCV.h"

29#include "llvm/IR/IntrinsicsS390.h"

30#include "llvm/IR/IntrinsicsSPIRV.h"

31#include "llvm/IR/IntrinsicsVE.h"

32#include "llvm/IR/IntrinsicsX86.h"

33#include "llvm/IR/IntrinsicsXCore.h"

37

38using namespace llvm;

39

40

41#define GET_INTRINSIC_NAME_TABLE

42#include "llvm/IR/IntrinsicImpl.inc"

43#undef GET_INTRINSIC_NAME_TABLE

44

46 assert(id < num_intrinsics && "Invalid intrinsic ID!");

47 return IntrinsicNameTable[IntrinsicNameOffsetTable[id]];

48}

49

51 assert(id < num_intrinsics && "Invalid intrinsic ID!");

53 "This version of getName does not support overloading");

55}

56

57

58

59

60

61

62

63

64

65

66

67

68

70 std::string Result;

72 Result += "p" + utostr(PTyp->getAddressSpace());

74 Result += "a" + utostr(ATyp->getNumElements()) +

77 if (!STyp->isLiteral()) {

78 Result += "s_";

79 if (STyp->hasName())

80 Result += STyp->getName();

81 else

82 HasUnnamedType = true;

83 } else {

84 Result += "sl_";

85 for (auto *Elem : STyp->elements())

87 }

88

89 Result += "s";

91 Result += "f_" + getMangledTypeStr(FT->getReturnType(), HasUnnamedType);

92 for (size_t i = 0; i < FT->getNumParams(); i++)

94 if (FT->isVarArg())

95 Result += "vararg";

96

97 Result += "f";

100 if (EC.isScalable())

101 Result += "nx";

102 Result += "v" + utostr(EC.getKnownMinValue()) +

105 Result += "t";

106 Result += TETy->getName();

107 for (Type *ParamTy : TETy->type_params())

109 for (unsigned IntParam : TETy->int_params())

110 Result += "_" + utostr(IntParam);

111

112 Result += "t";

113 } else if (Ty) {

114 switch (Ty->getTypeID()) {

115 default:

118 Result += "isVoid";

119 break;

121 Result += "Metadata";

122 break;

124 Result += "f16";

125 break;

127 Result += "bf16";

128 break;

130 Result += "f32";

131 break;

133 Result += "f64";

134 break;

136 Result += "f80";

137 break;

139 Result += "f128";

140 break;

142 Result += "ppcf128";

143 break;

145 Result += "x86amx";

146 break;

149 break;

150 }

151 }

152 return Result;

153}

154

157 bool EarlyModuleCheck) {

158

159 assert(Id < Intrinsic::num_intrinsics && "Invalid intrinsic ID!");

161 "This version of getName is for overloaded intrinsics only");

162 (void)EarlyModuleCheck;

163 assert((!EarlyModuleCheck || M ||

165 "Intrinsic overloading on pointer types need to provide a Module");

166 bool HasUnnamedType = false;

168 for (Type *Ty : Tys)

170 if (HasUnnamedType) {

171 assert(M && "unnamed types need a module");

172 if (!FT)

174 else

176 "Provided FunctionType must match arguments");

177 return M->getUniqueIntrinsicName(Result, Id, FT);

178 }

179 return Result;

180}

181

184 assert(M && "We need to have a Module");

186}

187

191

192

193

194

195

197#define GET_INTRINSIC_IITINFO

198#include "llvm/IR/IntrinsicImpl.inc"

199#undef GET_INTRINSIC_IITINFO

200};

201

202static void

207

208 bool IsScalableVector = (LastInfo == IIT_SCALABLE_VEC);

209

211

212 switch (Info) {

213 case IIT_Done:

214 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Void, 0));

215 return;

216 case IIT_VARARG:

217 OutputTable.push_back(IITDescriptor::get(IITDescriptor::VarArg, 0));

218 return;

219 case IIT_MMX:

220 OutputTable.push_back(IITDescriptor::get(IITDescriptor::MMX, 0));

221 return;

222 case IIT_AMX:

223 OutputTable.push_back(IITDescriptor::get(IITDescriptor::AMX, 0));

224 return;

225 case IIT_TOKEN:

226 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Token, 0));

227 return;

228 case IIT_METADATA:

229 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Metadata, 0));

230 return;

231 case IIT_F16:

232 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Half, 0));

233 return;

234 case IIT_BF16:

235 OutputTable.push_back(IITDescriptor::get(IITDescriptor::BFloat, 0));

236 return;

237 case IIT_F32:

238 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Float, 0));

239 return;

240 case IIT_F64:

241 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Double, 0));

242 return;

243 case IIT_F128:

244 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Quad, 0));

245 return;

246 case IIT_PPCF128:

247 OutputTable.push_back(IITDescriptor::get(IITDescriptor::PPCQuad, 0));

248 return;

249 case IIT_I1:

250 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 1));

251 return;

252 case IIT_I2:

253 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 2));

254 return;

255 case IIT_I4:

256 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 4));

257 return;

258 case IIT_AARCH64_SVCOUNT:

259 OutputTable.push_back(IITDescriptor::get(IITDescriptor::AArch64Svcount, 0));

260 return;

261 case IIT_I8:

262 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 8));

263 return;

264 case IIT_I16:

265 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 16));

266 return;

267 case IIT_I32:

268 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 32));

269 return;

270 case IIT_I64:

271 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 64));

272 return;

273 case IIT_I128:

274 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 128));

275 return;

276 case IIT_V1:

277 OutputTable.push_back(IITDescriptor::getVector(1, IsScalableVector));

279 return;

280 case IIT_V2:

281 OutputTable.push_back(IITDescriptor::getVector(2, IsScalableVector));

283 return;

284 case IIT_V3:

285 OutputTable.push_back(IITDescriptor::getVector(3, IsScalableVector));

287 return;

288 case IIT_V4:

289 OutputTable.push_back(IITDescriptor::getVector(4, IsScalableVector));

291 return;

292 case IIT_V6:

293 OutputTable.push_back(IITDescriptor::getVector(6, IsScalableVector));

295 return;

296 case IIT_V8:

297 OutputTable.push_back(IITDescriptor::getVector(8, IsScalableVector));

299 return;

300 case IIT_V10:

301 OutputTable.push_back(IITDescriptor::getVector(10, IsScalableVector));

303 return;

304 case IIT_V16:

305 OutputTable.push_back(IITDescriptor::getVector(16, IsScalableVector));

307 return;

308 case IIT_V32:

309 OutputTable.push_back(IITDescriptor::getVector(32, IsScalableVector));

311 return;

312 case IIT_V64:

313 OutputTable.push_back(IITDescriptor::getVector(64, IsScalableVector));

315 return;

316 case IIT_V128:

317 OutputTable.push_back(IITDescriptor::getVector(128, IsScalableVector));

319 return;

320 case IIT_V256:

321 OutputTable.push_back(IITDescriptor::getVector(256, IsScalableVector));

323 return;

324 case IIT_V512:

325 OutputTable.push_back(IITDescriptor::getVector(512, IsScalableVector));

327 return;

328 case IIT_V1024:

329 OutputTable.push_back(IITDescriptor::getVector(1024, IsScalableVector));

331 return;

332 case IIT_V2048:

333 OutputTable.push_back(IITDescriptor::getVector(2048, IsScalableVector));

335 return;

336 case IIT_V4096:

337 OutputTable.push_back(IITDescriptor::getVector(4096, IsScalableVector));

339 return;

340 case IIT_EXTERNREF:

341 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 10));

342 return;

343 case IIT_FUNCREF:

344 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 20));

345 return;

346 case IIT_PTR:

347 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 0));

348 return;

349 case IIT_ANYPTR:

351 IITDescriptor::get(IITDescriptor::Pointer, Infos[NextElt++]));

352 return;

353 case IIT_ARG: {

354 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

355 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Argument, ArgInfo));

356 return;

357 }

358 case IIT_EXTEND_ARG: {

359 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

361 IITDescriptor::get(IITDescriptor::ExtendArgument, ArgInfo));

362 return;

363 }

364 case IIT_TRUNC_ARG: {

365 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

367 IITDescriptor::get(IITDescriptor::TruncArgument, ArgInfo));

368 return;

369 }

370 case IIT_ONE_NTH_ELTS_VEC_ARG: {

371 unsigned short ArgNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

372 unsigned short N = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

374 IITDescriptor::get(IITDescriptor::OneNthEltsVecArgument, N, ArgNo));

375 return;

376 }

377 case IIT_SAME_VEC_WIDTH_ARG: {

378 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

380 IITDescriptor::get(IITDescriptor::SameVecWidthArgument, ArgInfo));

381 return;

382 }

383 case IIT_VEC_OF_ANYPTRS_TO_ELT: {

384 unsigned short ArgNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

385 unsigned short RefNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

387 IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt, ArgNo, RefNo));

388 return;

389 }

390 case IIT_EMPTYSTRUCT:

391 OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0));

392 return;

393 case IIT_STRUCT: {

394 unsigned StructElts = Infos[NextElt++] + 2;

395

397 IITDescriptor::get(IITDescriptor::Struct, StructElts));

398

399 for (unsigned i = 0; i != StructElts; ++i)

401 return;

402 }

403 case IIT_SUBDIVIDE2_ARG: {

404 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

406 IITDescriptor::get(IITDescriptor::Subdivide2Argument, ArgInfo));

407 return;

408 }

409 case IIT_SUBDIVIDE4_ARG: {

410 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

412 IITDescriptor::get(IITDescriptor::Subdivide4Argument, ArgInfo));

413 return;

414 }

415 case IIT_VEC_ELEMENT: {

416 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

418 IITDescriptor::get(IITDescriptor::VecElementArgument, ArgInfo));

419 return;

420 }

421 case IIT_SCALABLE_VEC: {

423 return;

424 }

425 case IIT_VEC_OF_BITCASTS_TO_INT: {

426 unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]);

428 IITDescriptor::get(IITDescriptor::VecOfBitcastsToInt, ArgInfo));

429 return;

430 }

431 }

433}

434

435#define GET_INTRINSIC_GENERATOR_GLOBAL

436#include "llvm/IR/IntrinsicImpl.inc"

437#undef GET_INTRINSIC_GENERATOR_GLOBAL

438

441 static_assert(sizeof(IIT_Table[0]) == 2,

442 "Expect 16-bit entries in IIT_Table");

443

444 uint16_t TableVal = IIT_Table[id - 1];

445

446

449 unsigned NextElt = 0;

450 if (TableVal >> 15) {

451

452 IITEntries = IIT_LongEncodingTable;

453

454

455 NextElt = TableVal & 0x7fff;

456 } else {

457

458

459 do {

460 IITValues.push_back(TableVal & 0xF);

461 TableVal >>= 4;

462 } while (TableVal);

463

464 IITEntries = IITValues;

465 NextElt = 0;

466 }

467

468

470 while (NextElt != IITEntries.size() && IITEntries[NextElt] != 0)

472}

473

477

478 IITDescriptor D = Infos.front();

479 Infos = Infos.slice(1);

480

481 switch (D.Kind) {

482 case IITDescriptor::Void:

484 case IITDescriptor::VarArg:

486 case IITDescriptor::MMX:

488 case IITDescriptor::AMX:

490 case IITDescriptor::Token:

492 case IITDescriptor::Metadata:

494 case IITDescriptor::Half:

496 case IITDescriptor::BFloat:

498 case IITDescriptor::Float:

500 case IITDescriptor::Double:

502 case IITDescriptor::Quad:

504 case IITDescriptor::PPCQuad:

506 case IITDescriptor::AArch64Svcount:

508

509 case IITDescriptor::Integer:

511 case IITDescriptor::Vector:

513 D.Vector_Width);

514 case IITDescriptor::Pointer:

516 case IITDescriptor::Struct: {

518 for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i)

521 }

522 case IITDescriptor::Argument:

523 return Tys[D.getArgumentNumber()];

524 case IITDescriptor::ExtendArgument: {

525 Type *Ty = Tys[D.getArgumentNumber()];

528

530 }

531 case IITDescriptor::TruncArgument: {

532 Type *Ty = Tys[D.getArgumentNumber()];

535

539 }

540 case IITDescriptor::Subdivide2Argument:

541 case IITDescriptor::Subdivide4Argument: {

542 Type *Ty = Tys[D.getArgumentNumber()];

544 assert(VTy && "Expected an argument of Vector Type");

545 int SubDivs = D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;

547 }

548 case IITDescriptor::OneNthEltsVecArgument:

551 case IITDescriptor::SameVecWidthArgument: {

553 Type *Ty = Tys[D.getArgumentNumber()];

556 return EltTy;

557 }

558 case IITDescriptor::VecElementArgument: {

559 Type *Ty = Tys[D.getArgumentNumber()];

561 return VTy->getElementType();

563 }

564 case IITDescriptor::VecOfBitcastsToInt: {

565 Type *Ty = Tys[D.getArgumentNumber()];

567 assert(VTy && "Expected an argument of Vector Type");

569 }

570 case IITDescriptor::VecOfAnyPtrsToElt:

571

572 return Tys[D.getOverloadArgNumber()];

573 }

575}

576

581

584

588

589

590

591

592 if (!ArgTys.empty() && ArgTys.back()->isVoidTy()) {

595 }

597}

598

600#define GET_INTRINSIC_OVERLOAD_TABLE

601#include "llvm/IR/IntrinsicImpl.inc"

602#undef GET_INTRINSIC_OVERLOAD_TABLE

603}

604

606#define GET_INTRINSIC_PRETTY_PRINT_TABLE

607#include "llvm/IR/IntrinsicImpl.inc"

608#undef GET_INTRINSIC_PRETTY_PRINT_TABLE

609}

610

611

612#define GET_INTRINSIC_TARGET_DATA

613#include "llvm/IR/IntrinsicImpl.inc"

614#undef GET_INTRINSIC_TARGET_DATA

615

617 return IID > TargetInfos[0].Count;

618}

619

620

621

622

623

626 assert(Name.starts_with("llvm.") && "Unexpected intrinsic prefix");

627 assert(Name.drop_front(5).starts_with(Target) && "Unexpected target");

628

629

630

631

632

633

634

635

636 size_t CmpEnd = 4;

638 CmpEnd += 1 + Target.size();

639

640 const unsigned *Low = NameOffsetTable.begin();

641 const unsigned *High = NameOffsetTable.end();

642 const unsigned *LastLow = Low;

643 while (CmpEnd < Name.size() && High - Low > 0) {

644 size_t CmpStart = CmpEnd;

645 CmpEnd = Name.find('.', CmpStart + 1);

646 CmpEnd = CmpEnd == StringRef::npos ? Name.size() : CmpEnd;

647 auto Cmp = [CmpStart, CmpEnd](auto LHS, auto RHS) {

648

649

650

651 const char *LHSStr;

652 if constexpr (std::is_integral_v<decltype(LHS)>)

653 LHSStr = IntrinsicNameTable.getCString(LHS);

654 else

655 LHSStr = LHS;

656

657 const char *RHSStr;

658 if constexpr (std::is_integral_v<decltype(RHS)>)

659 RHSStr = IntrinsicNameTable.getCString(RHS);

660 else

661 RHSStr = RHS;

662

663 return strncmp(LHSStr + CmpStart, RHSStr + CmpStart, CmpEnd - CmpStart) <

664 0;

665 };

666 LastLow = Low;

667 std::tie(Low, High) = std::equal_range(Low, High, Name.data(), Cmp);

668 }

670 LastLow = Low;

671

672 if (LastLow == NameOffsetTable.end())

673 return -1;

674 StringRef NameFound = IntrinsicNameTable[*LastLow];

675 if (Name == NameFound ||

676 (Name.starts_with(NameFound) && Name[NameFound.size()] == '.'))

677 return LastLow - NameOffsetTable.begin();

678 return -1;

679}

680

681

682

683

684

685

686static std::pair<ArrayRef, StringRef>

688 assert(Name.starts_with("llvm."));

689

691

692

695 Targets, [=](const IntrinsicTargetInfo &TI) { return TI.Name < Target; });

696

697

698 const auto &TI = It != Targets.end() && It->Name == Target ? *It : Targets[0];

699 return {ArrayRef(&IntrinsicNameOffsetTable[1] + TI.Offset, TI.Count),

700 TI.Name};

701}

702

703

704

708 if (Idx == -1)

710

711

712

713 int Adjust = NameOffsetTable.data() - IntrinsicNameOffsetTable;

715

716

717

718 const auto MatchSize = IntrinsicNameTable[NameOffsetTable[Idx]].size();

719 assert(Name.size() >= MatchSize && "Expected either exact or prefix match");

720 bool IsExactMatch = Name.size() == MatchSize;

723}

724

725

726#define GET_INTRINSIC_ATTRIBUTES

727#include "llvm/IR/IntrinsicImpl.inc"

728#undef GET_INTRINSIC_ATTRIBUTES

729

737 FT)

738 .getCallee());

739 if (F->getFunctionType() == FT)

740 return F;

741

742

743

744

745

746

747 F->setName(F->getName() + ".invalid");

751 FT)

752 .getCallee());

753}

754

762

765

768

769

773

775

776

781 "intrinsic signature mismatch");

782

783

786

787 assert(TableRef.empty() && "Unprocessed descriptors remain");

788

790}

791

795

801

802

803#define GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN

804#include "llvm/IR/IntrinsicImpl.inc"

805#undef GET_LLVM_INTRINSIC_FOR_CLANG_BUILTIN

806

807

808#define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN

809#include "llvm/IR/IntrinsicImpl.inc"

810#undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN

811

813 switch (QID) {

814#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \

815 case Intrinsic::INTRINSIC:

816#include "llvm/IR/ConstrainedOps.def"

817#undef INSTRUCTION

818 return true;

819 default:

820 return false;

821 }

822}

823

825 switch (QID) {

826#define INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC) \

827 case Intrinsic::INTRINSIC: \

828 return ROUND_MODE == 1;

829#include "llvm/IR/ConstrainedOps.def"

830#undef INSTRUCTION

831 default:

832 return false;

833 }

834}

835

837 std::pair<Type *, ArrayRefIntrinsic::IITDescriptor>;

838

839static bool

843 bool IsDeferredCheck) {

845

846

847 if (Infos.empty())

848 return true;

849

850

851 auto InfosRef = Infos;

852 auto DeferCheck = [&DeferredChecks, &InfosRef](Type *T) {

854 return false;

855 };

856

857 IITDescriptor D = Infos.front();

858 Infos = Infos.slice(1);

859

860 switch (D.Kind) {

861 case IITDescriptor::Void:

862 return !Ty->isVoidTy();

863 case IITDescriptor::VarArg:

864 return true;

865 case IITDescriptor::MMX: {

869 }

870 case IITDescriptor::AMX:

871 return !Ty->isX86_AMXTy();

872 case IITDescriptor::Token:

873 return !Ty->isTokenTy();

874 case IITDescriptor::Metadata:

875 return !Ty->isMetadataTy();

876 case IITDescriptor::Half:

877 return !Ty->isHalfTy();

878 case IITDescriptor::BFloat:

879 return !Ty->isBFloatTy();

880 case IITDescriptor::Float:

881 return !Ty->isFloatTy();

882 case IITDescriptor::Double:

883 return !Ty->isDoubleTy();

884 case IITDescriptor::Quad:

885 return !Ty->isFP128Ty();

886 case IITDescriptor::PPCQuad:

887 return !Ty->isPPC_FP128Ty();

888 case IITDescriptor::Integer:

889 return !Ty->isIntegerTy(D.Integer_Width);

890 case IITDescriptor::AArch64Svcount:

893 case IITDescriptor::Vector: {

895 return !VT || VT->getElementCount() != D.Vector_Width ||

897 DeferredChecks, IsDeferredCheck);

898 }

899 case IITDescriptor::Pointer: {

901 return !PT || PT->getAddressSpace() != D.Pointer_AddressSpace;

902 }

903

904 case IITDescriptor::Struct: {

906 if (!ST || !ST->isLiteral() || ST->isPacked() ||

907 ST->getNumElements() != D.Struct_NumElements)

908 return true;

909

910 for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i)

912 DeferredChecks, IsDeferredCheck))

913 return true;

914 return false;

915 }

916

917 case IITDescriptor::Argument:

918

919

920 if (D.getArgumentNumber() < ArgTys.size())

921 return Ty != ArgTys[D.getArgumentNumber()];

922

923 if (D.getArgumentNumber() > ArgTys.size() ||

924 D.getArgumentKind() == IITDescriptor::AK_MatchType)

925 return IsDeferredCheck || DeferCheck(Ty);

926

927 assert(D.getArgumentNumber() == ArgTys.size() && !IsDeferredCheck &&

928 "Table consistency error");

930

931 switch (D.getArgumentKind()) {

932 case IITDescriptor::AK_Any:

933 return false;

934 case IITDescriptor::AK_AnyInteger:

935 return !Ty->isIntOrIntVectorTy();

936 case IITDescriptor::AK_AnyFloat:

937 return !Ty->isFPOrFPVectorTy();

938 case IITDescriptor::AK_AnyVector:

940 case IITDescriptor::AK_AnyPointer:

942 default:

943 break;

944 }

946

947 case IITDescriptor::ExtendArgument: {

948

949 if (D.getArgumentNumber() >= ArgTys.size())

950 return IsDeferredCheck || DeferCheck(Ty);

951

952 Type *NewTy = ArgTys[D.getArgumentNumber()];

956 NewTy = IntegerType::get(ITy->getContext(), 2 * ITy->getBitWidth());

957 else

958 return true;

959

960 return Ty != NewTy;

961 }

962 case IITDescriptor::TruncArgument: {

963

964 if (D.getArgumentNumber() >= ArgTys.size())

965 return IsDeferredCheck || DeferCheck(Ty);

966

967 Type *NewTy = ArgTys[D.getArgumentNumber()];

971 NewTy = IntegerType::get(ITy->getContext(), ITy->getBitWidth() / 2);

972 else

973 return true;

974

975 return Ty != NewTy;

976 }

977 case IITDescriptor::OneNthEltsVecArgument:

978

979 if (D.getRefArgNumber() >= ArgTys.size())

980 return IsDeferredCheck || DeferCheck(Ty);

984 D.getVectorDivisor()) != Ty;

985 case IITDescriptor::SameVecWidthArgument: {

986 if (D.getArgumentNumber() >= ArgTys.size()) {

987

988 Infos = Infos.slice(1);

989 return IsDeferredCheck || DeferCheck(Ty);

990 }

993

994 if ((ReferenceType != nullptr) != (ThisArgType != nullptr))

995 return true;

996 Type *EltTy = Ty;

997 if (ThisArgType) {

998 if (ReferenceType->getElementCount() != ThisArgType->getElementCount())

999 return true;

1000 EltTy = ThisArgType->getElementType();

1001 }

1003 IsDeferredCheck);

1004 }

1005 case IITDescriptor::VecOfAnyPtrsToElt: {

1006 unsigned RefArgNumber = D.getRefArgNumber();

1007 if (RefArgNumber >= ArgTys.size()) {

1008 if (IsDeferredCheck)

1009 return true;

1010

1011

1013 return DeferCheck(Ty);

1014 }

1015

1016 if (!IsDeferredCheck) {

1017 assert(D.getOverloadArgNumber() == ArgTys.size() &&

1018 "Table consistency error");

1020 }

1021

1022

1023

1024

1028 (ReferenceType->getElementCount() != ThisArgVecTy->getElementCount()))

1029 return true;

1030 return !ThisArgVecTy->getElementType()->isPointerTy();

1031 }

1032 case IITDescriptor::VecElementArgument: {

1033 if (D.getArgumentNumber() >= ArgTys.size())

1034 return IsDeferredCheck ? true : DeferCheck(Ty);

1037 }

1038 case IITDescriptor::Subdivide2Argument:

1039 case IITDescriptor::Subdivide4Argument: {

1040

1041 if (D.getArgumentNumber() >= ArgTys.size())

1042 return IsDeferredCheck || DeferCheck(Ty);

1043

1044 Type *NewTy = ArgTys[D.getArgumentNumber()];

1046 int SubDivs = D.Kind == IITDescriptor::Subdivide2Argument ? 1 : 2;

1048 return Ty != NewTy;

1049 }

1050 return true;

1051 }

1052 case IITDescriptor::VecOfBitcastsToInt: {

1053 if (D.getArgumentNumber() >= ArgTys.size())

1054 return IsDeferredCheck || DeferCheck(Ty);

1058 return true;

1060 }

1061 }

1063}

1064

1071 false))

1073

1074 unsigned NumDeferredReturnChecks = DeferredChecks.size();

1075

1076 for (auto *Ty : FTy->params())

1079

1080 for (unsigned I = 0, E = DeferredChecks.size(); I != E; ++I) {

1083 true))

1086 }

1087

1089}

1090

1093

1094 if (Infos.empty())

1095 return isVarArg;

1096

1097

1098 if (Infos.size() != 1)

1099 return true;

1100

1101

1103 Infos = Infos.slice(1);

1105 return !isVarArg;

1106

1107 return true;

1108}

1109

1112 if (ID)

1113 return false;

1114

1118

1121 return false;

1122 }

1124 return false;

1125 return true;

1126}

1127

1133

1137 return std::nullopt;

1138

1141 std::string WantedName =

1143 if (Name == WantedName)

1144 return std::nullopt;

1145

1147 if (auto *ExistingGV = F->getParent()->getNamedValue(WantedName)) {

1149 if (ExistingF->getFunctionType() == F->getFunctionType())

1150 return ExistingF;

1151

1152

1153

1154

1155

1156 ExistingGV->setName(WantedName + ".renamed");

1157 }

1159 }();

1160

1163 "Shouldn't change the signature");

1164 return NewDecl;

1165}

1166

1170

1172 {Intrinsic::vector_interleave2, Intrinsic::vector_deinterleave2},

1173 {Intrinsic::vector_interleave3, Intrinsic::vector_deinterleave3},

1174 {Intrinsic::vector_interleave4, Intrinsic::vector_deinterleave4},

1175 {Intrinsic::vector_interleave5, Intrinsic::vector_deinterleave5},

1176 {Intrinsic::vector_interleave6, Intrinsic::vector_deinterleave6},

1177 {Intrinsic::vector_interleave7, Intrinsic::vector_deinterleave7},

1178 {Intrinsic::vector_interleave8, Intrinsic::vector_deinterleave8},

1179};

1180

1182 assert(Factor >= 2 && Factor <= 8 && "Unexpected factor");

1184}

1185

1187 assert(Factor >= 2 && Factor <= 8 && "Unexpected factor");

1189}

1190

1191#define GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS

1192#include "llvm/IR/IntrinsicImpl.inc"

1193#undef GET_INTRINSIC_PRETTY_PRINT_ARGUMENTS

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

ArrayRef< TableEntry > TableRef

static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")

Analysis containing CSE Info

Module.h This file contains the declarations for the Module class.

static bool matchIntrinsicType(Type *Ty, ArrayRef< Intrinsic::IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys, SmallVectorImpl< DeferredIntrinsicMatchPair > &DeferredChecks, bool IsDeferredCheck)

Definition Intrinsics.cpp:840

static std::string getIntrinsicNameImpl(Intrinsic::ID Id, ArrayRef< Type * > Tys, Module *M, FunctionType *FT, bool EarlyModuleCheck)

Definition Intrinsics.cpp:155

static InterleaveIntrinsic InterleaveIntrinsics[]

Definition Intrinsics.cpp:1171

static Function * getOrInsertIntrinsicDeclarationImpl(Module *M, Intrinsic::ID id, ArrayRef< Type * > Tys, FunctionType *FT)

Definition Intrinsics.cpp:730

static std::pair< ArrayRef< unsigned >, StringRef > findTargetSubtable(StringRef Name)

Find the segment of IntrinsicNameOffsetTable for intrinsics with the same target as Name,...

Definition Intrinsics.cpp:687

std::pair< Type *, ArrayRef< Intrinsic::IITDescriptor > > DeferredIntrinsicMatchPair

Definition Intrinsics.cpp:836

static void DecodeIITType(unsigned &NextElt, ArrayRef< unsigned char > Infos, IIT_Info LastInfo, SmallVectorImpl< Intrinsic::IITDescriptor > &OutputTable)

Definition Intrinsics.cpp:203

IIT_Info

IIT_Info - These are enumerators that describe the entries returned by the getIntrinsicInfoTableEntri...

Definition Intrinsics.cpp:196

static Type * DecodeFixedType(ArrayRef< Intrinsic::IITDescriptor > &Infos, ArrayRef< Type * > Tys, LLVMContext &Context)

Definition Intrinsics.cpp:474

static int lookupLLVMIntrinsicByName(ArrayRef< unsigned > NameOffsetTable, StringRef Name, StringRef Target="")

Looks up Name in NameTable via binary search.

Definition Intrinsics.cpp:624

static std::string getMangledTypeStr(Type *Ty, bool &HasUnnamedType)

Returns a stable mangling for the type specified for use in the name mangling scheme used by 'any' ty...

Definition Intrinsics.cpp:69

This file contains the definitions of the enumerations and flags associated with NVVM Intrinsics,...

static StringRef getName(Value *V)

static SymbolRef::Type getType(const Symbol *Sym)

static unsigned getBitWidth(Type *Ty, const DataLayout &DL)

Returns the bitwidth of the given scalar or pointer type.

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

const T & front() const

front - Get the first element.

size_t size() const

size - Get the array size.

bool empty() const

empty - Check if the array is empty.

ArrayRef< T > slice(size_t N, size_t M) const

slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.

Class to represent fixed width SIMD vectors.

unsigned getNumElements() const

static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)

Class to represent function types.

ArrayRef< Type * > params() const

Type * getReturnType() const

static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)

This static method is the primary way of constructing a FunctionType.

FunctionType * getFunctionType() const

Returns the FunctionType for me.

const Function & getFunction() const

void setCallingConv(CallingConv::ID CC)

Class to represent integer types.

static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)

This static method is the primary way of constructing an IntegerType.

unsigned getBitWidth() const

Get the number of bits in this IntegerType.

This is an important class for using LLVM in a threaded context.

A Module instance is used to store all the information related to an LLVM module.

static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)

This constructs a pointer to an object of the specified type in a numbered address space.

This class consists of common code factored out of the SmallVector class to reduce code duplication b...

reference emplace_back(ArgTypes &&... Args)

void push_back(const T &Elt)

This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.

StringRef - Represent a constant reference to a string, i.e.

static constexpr size_t npos

constexpr size_t size() const

size - Get the string size.

Class to represent struct types.

static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)

This static method is the primary way to create a literal StructType.

Class to represent target extensions types, which are generally unintrospectable from target-independ...

static LLVM_ABI TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})

Return a target extension type having the specified name and optional type and integer parameters.

Target - Wrapper for Target specific information.

The instances of the Type class are immutable: once they are created, they are never changed.

static LLVM_ABI Type * getX86_AMXTy(LLVMContext &C)

static LLVM_ABI Type * getMetadataTy(LLVMContext &C)

static LLVM_ABI Type * getTokenTy(LLVMContext &C)

static LLVM_ABI Type * getPPC_FP128Ty(LLVMContext &C)

static LLVM_ABI Type * getFP128Ty(LLVMContext &C)

@ X86_AMXTyID

AMX vectors (8192 bits, X86 specific)

@ HalfTyID

16-bit floating point type

@ VoidTyID

type with no size

@ FloatTyID

32-bit floating point type

@ IntegerTyID

Arbitrary bit width integers.

@ BFloatTyID

16-bit floating point type (7-bit significand)

@ DoubleTyID

64-bit floating point type

@ X86_FP80TyID

80-bit floating point type (X87)

@ PPC_FP128TyID

128-bit floating point type (two 64-bits, PowerPC)

@ FP128TyID

128-bit floating point type (112-bit significand)

static LLVM_ABI Type * getVoidTy(LLVMContext &C)

bool isIntegerTy() const

True if this is an instance of IntegerType.

static LLVM_ABI Type * getDoubleTy(LLVMContext &C)

static LLVM_ABI Type * getFloatTy(LLVMContext &C)

static LLVM_ABI Type * getBFloatTy(LLVMContext &C)

static LLVM_ABI Type * getHalfTy(LLVMContext &C)

static VectorType * getExtendedElementVectorType(VectorType *VTy)

This static method is like getInteger except that the element types are twice as wide as the elements...

static VectorType * getOneNthElementsVectorType(VectorType *VTy, unsigned Denominator)

static VectorType * getSubdividedVectorType(VectorType *VTy, int NumSubdivs)

static VectorType * getInteger(VectorType *VTy)

This static method gets a VectorType with the same number of elements as the input type,...

static VectorType * getTruncatedElementVectorType(VectorType *VTy)

static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)

This static method is the primary way to construct an VectorType.

Type * getElementType() const

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.

LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})

Look up the Function declaration of the intrinsic id in the Module M.

Definition Intrinsics.cpp:755

LLVM_ABI Intrinsic::ID getDeinterleaveIntrinsicID(unsigned Factor)

Returns the corresponding llvm.vector.deinterleaveN intrinsic for factor N.

Definition Intrinsics.cpp:1186

LLVM_ABI MatchIntrinsicTypesResult matchIntrinsicSignature(FunctionType *FTy, ArrayRef< IITDescriptor > &Infos, SmallVectorImpl< Type * > &ArgTys)

Match the specified function type with the type constraints specified by the .td file.

Definition Intrinsics.cpp:1066

LLVM_ABI void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl< IITDescriptor > &T)

Return the IIT table descriptor for the specified intrinsic into an array of IITDescriptors.

Definition Intrinsics.cpp:439

MatchIntrinsicTypesResult

@ MatchIntrinsicTypes_Match

@ MatchIntrinsicTypes_NoMatchRet

@ MatchIntrinsicTypes_NoMatchArg

LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)

Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.

Definition Intrinsics.cpp:792

LLVM_ABI std::string getNameNoUnnamedTypes(ID Id, ArrayRef< Type * > Tys)

Return the LLVM name for an intrinsic.

Definition Intrinsics.cpp:188

LLVM_ABI std::optional< Function * > remangleIntrinsicFunction(Function *F)

Definition Intrinsics.cpp:1134

LLVM_ABI bool hasConstrainedFPRoundingModeOperand(ID QID)

Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics" that take r...

Definition Intrinsics.cpp:824

LLVM_ABI StringRef getName(ID id)

Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".

Definition Intrinsics.cpp:50

LLVM_ABI bool isConstrainedFPIntrinsic(ID QID)

Returns true if the intrinsic ID is for one of the "ConstrainedFloating-Point Intrinsics".

Definition Intrinsics.cpp:812

LLVM_ABI ID lookupIntrinsicID(StringRef Name)

This does the actual lookup of an intrinsic ID which matches the given function name.

Definition Intrinsics.cpp:705

LLVM_ABI bool hasPrettyPrintedArgs(ID id)

Returns true if the intrinsic has pretty printed immediate arguments.

Definition Intrinsics.cpp:605

LLVM_ABI StringRef getBaseName(ID id)

Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....

Definition Intrinsics.cpp:45

LLVM_ABI Intrinsic::ID getInterleaveIntrinsicID(unsigned Factor)

Returns the corresponding llvm.vector.interleaveN intrinsic for factor N.

Definition Intrinsics.cpp:1181

LLVM_ABI bool isOverloaded(ID id)

Returns true if the intrinsic can be overloaded.

Definition Intrinsics.cpp:599

LLVM_ABI FunctionType * getType(LLVMContext &Context, ID id, ArrayRef< Type * > Tys={})

Return the function type for an intrinsic.

Definition Intrinsics.cpp:577

LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)

Gets the type arguments of an intrinsic call by matching type contraints specified by the ....

Definition Intrinsics.cpp:1110

LLVM_ABI bool isTargetIntrinsic(ID IID)

isTargetIntrinsic - Returns true if IID is an intrinsic specific to a certain target.

Definition Intrinsics.cpp:616

LLVM_ABI bool matchIntrinsicVarArg(bool isVarArg, ArrayRef< IITDescriptor > &Infos)

Verify if the intrinsic has variable arguments.

Definition Intrinsics.cpp:1091

This is an optimization pass for GlobalISel generic memory operations.

@ Low

Lower the current thread's priority such that it does not affect foreground tasks significantly.

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

auto partition_point(R &&Range, Predicate P)

Binary search for the first iterator in a range where a predicate is false.

std::string utostr(uint64_t X, bool isNeg=false)

bool any_of(R &&range, UnaryPredicate P)

Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.

bool isa(const From &Val)

isa - Return true if the parameter to the template is an instance of one of the template type argu...

ArrayRef(const T &OneElt) -> ArrayRef< T >

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

Definition Intrinsics.cpp:1167

Intrinsic::ID Interleave

Definition Intrinsics.cpp:1168

Intrinsic::ID Deinterleave

Definition Intrinsics.cpp:1168

Helper struct shared between Function Specialization and SCCP Solver.

This is a type descriptor which explains the type requirements of an intrinsic.