LLVM: include/llvm/CodeGen/TargetInstrInfo.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13#ifndef LLVM_CODEGEN_TARGETINSTRINFO_H

14#define LLVM_CODEGEN_TARGETINSTRINFO_H

15

34#include

35#include

36#include

37#include

38#include

39#include

40

41namespace llvm {

42

43class DFAPacketizer;

44class InstrItineraryData;

45class LiveIntervals;

46class LiveVariables;

47class MachineLoop;

48class MachineMemOperand;

49class MachineModuleInfo;

50class MachineRegisterInfo;

51class MCAsmInfo;

52class MCInst;

53struct MCSchedModel;

55class ScheduleDAG;

56class ScheduleDAGMI;

57class ScheduleHazardRecognizer;

58class SDNode;

59class SelectionDAG;

60class SMSchedule;

61class SwingSchedulerDAG;

62class RegScavenger;

63class TargetRegisterClass;

64class TargetRegisterInfo;

65class TargetSchedModel;

66class TargetSubtargetInfo;

68

69template class SmallVectorImpl;

70

72

76

79};

80

81

85

87};

88

89

90

91

92

95 Basic = 0,

96 SExtScaledReg = 1,

97 ZExtScaledReg = 2

98 };

99

106};

107

108

109

110

111

113public:

114 TargetInstrInfo(unsigned CFSetupOpcode = ~0u, unsigned CFDestroyOpcode = ~0u,

115 unsigned CatchRetOpcode = ~0u, unsigned ReturnOpcode = ~0u)

116 : CallFrameSetupOpcode(CFSetupOpcode),

117 CallFrameDestroyOpcode(CFDestroyOpcode), CatchRetOpcode(CatchRetOpcode),

118 ReturnOpcode(ReturnOpcode) {}

122

124 return Opc <= TargetOpcode::GENERIC_OP_END;

125 }

126

128 return Opc >= TargetOpcode::GENERIC_ATOMICRMW_OP_START &&

129 Opc <= TargetOpcode::GENERIC_ATOMICRMW_OP_END;

130 }

131

132

133

134 virtual

138

139

140

142

143

144

145

146

147

149 return (MI.getOpcode() == TargetOpcode::IMPLICIT_DEF &&

150 MI.getNumOperands() == 1) ||

151 (MI.getDesc().isRematerializable() &&

153 }

154

155

156

158 return false;

159 }

160

163 return true;

164 }

165

166

167

169 return false;

170 }

171

172protected:

173

174

175

176

177

178

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

197 unsigned OpIdx1,

198 unsigned OpIdx2) const;

199

200

201

202

203

204

205

206

207

208

209

211 unsigned CommutableOpIdx1,

212 unsigned CommutableOpIdx2);

213

214public:

215

216

217

218

219

220

223

224

228 }

229

230

233 }

234

235

236

237

238

239

240

241

242

245 assert(I.getOperand(0).getImm() >= 0);

246 return I.getOperand(0).getImm();

247 }

248

249

250

251

254 assert(I.getOperand(1).getImm() >= 0 &&

255 "Frame size must not be negative");

257 }

259 }

260

263

264

265

266

267

269

270

271

272

273

274

276 Register &DstReg, unsigned &SubIdx) const {

277 return false;

278 }

279

280

281

282

283

284

286 int &FrameIndex) const {

287 return 0;

288 }

289

290

291

292

293

295 int &FrameIndex,

296 unsigned &MemBytes) const {

297 MemBytes = 0;

299 }

300

301

302

304 int &FrameIndex) const {

305 return 0;

306 }

307

308

309

310

311

312

313

317

318

319

320

321

322

324 int &FrameIndex) const {

325 return 0;

326 }

327

328

329

330

331

333 int &FrameIndex,

334 unsigned &MemBytes) const {

335 MemBytes = 0;

337 }

338

339

340

342 int &FrameIndex) const {

343 return 0;

344 }

345

346

347

348

349

350

351

355

356

357

358

360 int &SrcFrameIndex) const {

361 return false;

362 }

363

364

365

366

367

368

369

370

371

372

373

374

375

376

380

381

382

385 }

386

387

388

390 return ~0U;

391 }

392

393

394

395

396

398 return MI.isAsCheapAsAMove();

399 }

400

401

402

403

404

405

407

408

409

410

411

412

413

416 return true;

417 }

418

419

420

421

422

423

428

429

430

431

432

433

437

438

439

440

441

442

443

444

445

446

447

448

449

450

454 return nullptr;

455 }

456

457

458

459

460

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

502 unsigned &SrcOpIdx1,

503 unsigned &SrcOpIdx2) const;

504

505

506

507

509 return false;

510 }

511

512

513

517

520

522 return Reg == P.Reg && SubReg == P.SubReg;

523 }

525 return !(*this == P);

526 }

527 };

528

529

530

531

534

538 };

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558 bool

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

579

580

581

582

583

584

585

586

587

588

589

590

591

592

593

594

595

596

600

601

602

603

604

605

609

610

611

613 int64_t BrOffset) const {

615 }

616

617

620 }

621

622

623

624

625

629 const DebugLoc &DL, int64_t BrOffset = 0,

632 }

633

634

635

636

637

638

639

640

641

642

643

644

645

646

647

648

649

650

651

652

653

654

655

656

657

658

659

660

664 bool AllowModify = false) const {

665 return true;

666 }

667

668

669

670

671

672

673

676 PRED_EQ,

677 PRED_NE,

680

687

688

689

690

692

694 };

695

696

697

698

699

700

701

702

705 bool AllowModify = false) const {

706 return true;

707 }

708

709

710

711

712

713

715 int *BytesRemoved = nullptr) const {

716 llvm_unreachable("Target didn't implement TargetInstrInfo::removeBranch!");

717 }

718

719

720

721

722

723

724

725

726

727

728

729

730

731

736 int *BytesAdded = nullptr) const {

737 llvm_unreachable("Target didn't implement TargetInstrInfo::insertBranch!");

738 }

739

743 int *BytesAdded = nullptr) const {

745 BytesAdded);

746 }

747

748

749

750

752 public:

754

755

756

758

759

760

761

763 return true;

764 }

765

766

767

768

769

770

771

772

773

774

775

776

777 virtual std::optional

780

781

782

783

784

785

786

787

788

789

790

791

792

797 "Target didn't implement "

798 "PipelinerLoopInfo::createRemainingIterationsGreaterCondition!");

799 }

800

801

802

804

805

807

808

809

810

811

812

814

815

816

818 };

819

820

821

822 virtual std::unique_ptr

824 return nullptr;

825 }

826

827

828

829

832 return true;

833 }

834

835

836

837

838

844 unsigned Iter, unsigned MaxIter) const {

846 }

847

848

849

852

853

854

855

858 return true;

859 }

860

861

862

863

864

865

867 unsigned ExtraPredCycles,

869 return false;

870 }

871

872

873

874

875

876

877

879 unsigned ExtraTCycles,

881 unsigned ExtraFCycles,

883 return false;

884 }

885

886

887

888

889

890

891

893 unsigned NumCycles,

895 return false;

896 }

897

898

899

901 unsigned NumInsts) const {

902 return 0;

903 }

904

905

906

909 }

910

911

912

913

914

915

916

917

918

919

920

921

924 return false;

925 }

926

927

928

929

930

931

932

933

934

935

936

937

938

939

940

941

942

943

944

948 int &CondCycles, int &TrueCycles,

949 int &FalseCycles) const {

950 return false;

951 }

952

953

954

955

956

957

958

959

960

961

962

963

964

965

966

967

972 llvm_unreachable("Target didn't implement TargetInstrInfo::insertSelect!");

973 }

974

975

976

977

978

979

980

981

982

983

984

985

986

987

988

989

990

991

992

995 unsigned &TrueOp, unsigned &FalseOp,

996 bool &Optimizable) const {

997 assert(MI.getDesc().isSelect() && "MI must be a select instruction");

998 return true;

999 }

1000

1001

1002

1003

1004

1005

1006

1007

1008

1009

1010

1011

1012

1013

1014

1015

1018 bool PreferFalse = false) const {

1019

1020 llvm_unreachable("Target must implement TargetInstrInfo::optimizeSelect!");

1021 }

1022

1023

1024

1025

1026

1027

1028

1029

1030

1031

1032

1033

1034

1035

1039 bool RenamableDest = false,

1040 bool RenamableSrc = false) const {

1041 llvm_unreachable("Target didn't implement TargetInstrInfo::copyPhysReg!");

1042 }

1043

1044

1045

1046

1047

1048

1049

1050

1051

1052

1054 return false;

1055 }

1056

1057

1058

1060

1061protected:

1062

1063

1064

1065

1066 virtual std::optional

1068 return std::nullopt;

1069 }

1070

1071 virtual std::optional

1073 return std::nullopt;

1074 }

1075

1076

1077

1078

1079

1080

1081

1082

1084 return false;

1085 }

1086

1087public:

1088

1089

1090

1091

1092

1093

1095 if (MI.isCopy()) {

1097 }

1099 }

1100

1101

1102

1105 return IsCopyInstr;

1107 }

1108

1111 if (!DestSrc)

1112 return false;

1113

1114 const MachineOperand *DestRegOp = DestSrc->Destination;

1117 }

1118

1119

1120

1121

1122

1125 return std::nullopt;

1126 }

1127

1128

1129

1130

1133 int64_t &ImmVal) const {

1134 return false;

1135 }

1136

1137

1138

1139

1140

1141

1142

1143

1144

1145

1148 Register SrcReg, bool isKill, int FrameIndex,

1153 "TargetInstrInfo::storeRegToStackSlot!");

1154 }

1155

1156

1157

1158

1159

1160

1161

1162

1163

1166 Register DestReg, int FrameIndex,

1171 "TargetInstrInfo::loadRegFromStackSlot!");

1172 }

1173

1174

1175

1176

1177

1178

1179

1181

1182

1183

1184

1185

1186

1187

1188

1189

1190

1191

1192

1193

1195

1196

1197

1198

1199

1200

1201

1202

1203 virtual std::pair<unsigned, unsigned>

1205

1206

1207

1208

1209

1210

1211

1212

1213

1215 int FI,

1218

1219

1220

1224

1225

1226

1228

1229

1230

1231

1232

1233

1234

1235

1238 bool DoRegPressureReduce) const;

1239

1240

1241

1242 virtual bool

1245 return false;

1246 }

1247

1248

1249 virtual void

1252

1253

1254

1255

1257

1258

1259

1261

1262

1263

1264

1265

1266

1268

1269

1270

1272 bool Invert = false) const {

1273 return false;

1274 }

1275

1276

1277

1279 return std::nullopt;

1280 }

1281

1282

1284

1285

1288

1289

1291 bool &Commuted) const;

1292

1293

1294

1295

1296

1297

1298

1299

1300

1301

1302

1308

1309

1310

1311

1313 return true;

1314 }

1315

1316

1317

1318

1319

1320 virtual void

1323

1324

1325

1331

1332

1333

1334

1335

1336 std::pair<unsigned, unsigned>

1339

1340

1342

1343

1344

1348

1349

1351

1352

1354

1355

1356

1358

1359protected:

1360

1361

1362

1363

1364

1371 return nullptr;

1372 }

1373

1374

1375

1376

1377

1378

1383 return nullptr;

1384 }

1385

1386

1387

1388

1389

1390

1391

1392

1393

1397 return false;

1398 }

1399

1400

1401

1402

1403

1404

1405

1406

1407

1409 unsigned DefIdx,

1411 return false;

1412 }

1413

1414

1415

1416

1417

1418

1419

1420

1421

1422 virtual bool

1426 return false;

1427 }

1428

1429public:

1430

1431

1432

1433 virtual bool

1435 bool UnfoldLoad, bool UnfoldStore,

1437 return false;

1438 }

1439

1442 return false;

1443 }

1444

1445

1446

1447

1448

1449

1450

1451 virtual unsigned

1453 unsigned *LoadRegIndex = nullptr) const {

1454 return 0;

1455 }

1456

1457

1458

1459

1460

1462 int64_t &Offset1,

1463 int64_t &Offset2) const {

1464 return false;

1465 }

1466

1467

1468

1469

1470

1471

1472

1473

1474

1476 int64_t Offset1, int64_t Offset2,

1477 unsigned NumLoads) const {

1478 return false;

1479 }

1480

1481

1482

1483

1484

1485

1488 bool &OffsetIsScalable,

1490

1491

1492

1493

1494

1495

1496

1497

1498

1499

1504 return false;

1505 }

1506

1507

1508

1509

1511 unsigned &BasePos,

1512 unsigned &OffsetPos) const {

1513 return false;

1514 }

1515

1516

1517

1518

1519

1520 virtual std::optional

1523 return std::nullopt;

1524 }

1525

1526

1527

1528

1529

1530

1531

1535 return false;

1536 }

1537

1538

1539

1540

1543 llvm_unreachable("target did not implement emitLdStWithAddr()");

1544 }

1545

1546

1547

1548

1549

1550

1552 const Register NullValueReg,

1554 return false;

1555 }

1556

1557

1559 return false;

1560 }

1561

1562

1563

1564

1565

1566

1567

1568

1569

1570

1571

1572

1573

1574

1575

1576

1577

1579 int64_t Offset1, bool OffsetIsScalable1,

1581 int64_t Offset2, bool OffsetIsScalable2,

1582 unsigned ClusterSize,

1583 unsigned NumBytes) const {

1584 llvm_unreachable("target did not implement shouldClusterMemOps()");

1585 }

1586

1587

1588

1589 virtual bool

1591 return true;

1592 }

1593

1594

1597

1598

1601 unsigned Quantity) const;

1602

1603

1605

1606

1608

1609

1611

1612

1613

1616 return false;

1617 }

1618

1619

1620 virtual std::string

1623

1624

1625

1627

1628

1630 return false;

1631 }

1632

1633

1636 return false;

1637 }

1638

1639

1643 llvm_unreachable("Target didn't implement replaceBranchWithTailCall!");

1644 }

1645

1646

1647

1650

1651

1652

1655 return false;

1656 }

1657

1658

1659

1660

1661

1662

1663

1664

1666 std::vector &Pred,

1667 bool SkipDead) const {

1668 return false;

1669 }

1670

1671

1672

1673

1675 return MI.getDesc().isPredicable();

1676 }

1677

1678

1679

1681 return true;

1682 }

1683

1684

1685

1689

1690

1691

1693 const char *Str, const MCAsmInfo &MAI,

1695

1696

1697

1701

1702

1703

1707

1708

1709

1713

1714

1715

1718 return nullptr;

1719 }

1720

1721

1722

1724

1725

1726

1727

1728

1730 Register &SrcReg2, int64_t &Mask,

1731 int64_t &Value) const {

1732 return false;

1733 }

1734

1735

1736

1737

1739 Register SrcReg2, int64_t Mask,

1742 return false;

1743 }

1745

1746

1747

1748

1749

1750

1751

1752

1757 return nullptr;

1758 }

1759

1760

1761

1762

1763

1764

1765

1768 return false;

1769 }

1770

1771

1772

1773

1774

1777

1778

1779

1780

1781

1783 return Opcode <= TargetOpcode::COPY;

1784 }

1785

1786 virtual std::optional

1788 unsigned DefIdx, SDNode *UseNode, unsigned UseIdx) const;

1789

1790

1791

1792

1793

1794

1795

1796

1797

1798 virtual std::optional

1802

1803

1804

1805

1808 unsigned *PredCost = nullptr) const;

1809

1811

1814

1815

1818

1819

1821

1822

1823

1824

1825

1826

1831 unsigned UseIdx) const {

1832 return false;

1833 }

1834

1835

1836

1839 unsigned DefIdx) const;

1840

1841

1844 return true;

1845 }

1846

1847

1848

1849

1850

1851

1852

1853

1854

1855

1856

1857

1858

1859

1860

1861

1862

1863

1864

1865

1866 virtual std::pair<uint16_t, uint16_t>

1868 return std::make_pair(0, 0);

1869 }

1870

1871

1872

1873

1874

1876

1877

1878

1879

1880

1881

1882

1883

1884

1885

1886

1887

1888

1889

1890

1891

1892

1893

1894

1895

1896

1897

1898

1899

1900

1901

1902

1903

1904

1905

1906

1907

1908

1909

1910

1911

1912

1913

1914

1915

1916 virtual unsigned

1919

1920 return 0;

1921 }

1922

1923

1924

1925

1926

1927

1928

1929

1930

1931

1932

1933

1934

1935

1936

1939

1940 return 0;

1941 }

1942

1943

1944

1945

1946

1947

1948

1949

1950

1951

1952

1953

1954

1955

1956

1957

1958

1959

1962

1963

1966 return nullptr;

1967 }

1968

1969

1970

1971

1972

1973

1974

1975

1976

1977

1978

1979

1980 virtual bool

1984 "MIa must load from or modify a memory location");

1986 "MIb must load from or modify a memory location");

1987 return false;

1988 }

1989

1990

1991

1993

1994

1995 return 5;

1996 }

1997

1998

1999

2000

2001

2002

2003

2004

2005

2006

2007

2008

2009

2010

2012

2013

2014

2015

2016

2017

2020 return {};

2021 }

2022

2023

2024

2025 virtual std::pair<unsigned, unsigned>

2027 return std::make_pair(0u, 0u);

2028 }

2029

2030

2031

2032

2033

2034

2037 return {};

2038 }

2039

2040

2041

2042

2043

2044

2047 return {};

2048 }

2049

2050

2051

2052

2053

2054

2057 return {};

2058 }

2059

2060

2061

2062

2065 }

2066

2067

2068

2069

2070

2073 return false;

2074 }

2075

2076

2077

2080 return TargetOpcode::COPY;

2081 }

2082

2083

2084

2085

2089 return BuildMI(MBB, InsPt, DL, get(TargetOpcode::COPY), Dst)

2091 }

2092

2093

2094

2095

2099 unsigned SrcSubReg,

2101 return BuildMI(MBB, InsPt, DL, get(TargetOpcode::COPY), Dst)

2102 .addReg(Src, 0, SrcSubReg);

2103 }

2104

2105

2106

2107

2108

2109 virtual std::optional<std::unique_ptroutliner::OutlinedFunction>

2112 std::vectoroutliner::Candidate &RepeatedSequenceLocs,

2113 unsigned MinRepeats) const {

2115 "Target didn't implement TargetInstrInfo::getOutliningCandidateInfo!");

2116 }

2117

2118

2119

2120

2122 Function &F, std::vectoroutliner::Candidate &Candidates) const;

2123

2124protected:

2125

2130 "Target didn't implement TargetInstrInfo::getOutliningTypeImpl!");

2131 }

2132

2133public:

2134

2135

2138 unsigned Flags) const;

2139

2140

2141

2143 unsigned &Flags) const;

2144

2145

2146

2147

2148

2149

2150

2151

2152

2153

2154

2155

2156

2157

2159 std::pair<MachineBasicBlock::iterator, MachineBasicBlock::iterator>>

2161 return {std::make_pair(MBB.begin(), MBB.end())};

2162 }

2163

2164

2168 "Target didn't implement TargetInstrInfo::buildOutlinedFrame!");

2169 }

2170

2171

2172

2173

2179 "Target didn't implement TargetInstrInfo::insertOutlinedCall!");

2180 }

2181

2182

2183

2184

2188 bool AllowSideEffects = true) const {

2189#if 0

2190

2191

2193 "Target didn't implement TargetInstrInfo::buildClearRegister!");

2194#endif

2195 }

2196

2197

2198

2199

2200

2202 bool OutlineFromLinkOnceODRs) const {

2204 "TargetInstrInfo::isFunctionSafeToOutlineFrom!");

2205 }

2206

2207

2209 return false;

2210 }

2211

2212

2213

2215

2216

2217

2218

2220 return true;

2221 }

2222

2223

2224

2225

2226 virtual std::optional

2228

2229

2230

2231

2234 return false;

2235 }

2236

2237

2238

2240 if (!Formatter)

2241 Formatter = std::make_unique();

2242 return Formatter.get();

2243 }

2244

2245

2246

2247

2250 }

2251

2252

2253

2255 return 3;

2256 }

2257

2258

2260 return MI.getOperand(0);

2261 }

2262

2263

2267 }

2268

2269

2270

2271

2272

2274 int64_t &Offset) const {

2275 return false;

2276 }

2277

2278

2280

2281

2282

2283

2284

2285

2287 int FI) const {

2289 }

2290

2291private:

2292 mutable std::unique_ptr Formatter;

2293 unsigned CallFrameSetupOpcode, CallFrameDestroyOpcode;

2294 unsigned CatchRetOpcode;

2295 unsigned ReturnOpcode;

2296};

2297

2298

2302

2305 SubRegInfo::getEmptyKey());

2306 }

2307

2310 SubRegInfo::getTombstoneKey());

2311 }

2312

2313

2314

2317 std::make_pair(Val.Reg, Val.SubReg));

2318 }

2319

2323 }

2324};

2325

2326}

2327

2328#endif

unsigned const MachineRegisterInfo * MRI

MachineInstrBuilder & UseMI

MachineInstrBuilder MachineInstrBuilder & DefMI

SmallVector< int16_t, MAX_SRC_OPERANDS_NUM > OperandIndices

MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL

MachineBasicBlock MachineBasicBlock::iterator MBBI

This file defines DenseMapInfo traits for DenseMap.

This file defines the DenseMap class.

Machine Check Debug Module

Contains all data structures shared between the outliner implemented in MachineOutliner....

unsigned const TargetRegisterInfo * TRI

const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB

const SmallVectorImpl< MachineOperand > & Cond

assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())

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

This class is the base class for the comparison instructions.

This class represents an Operation in the Expression.

Itinerary data supplied by a subtarget to be used by a target.

This class is intended to be used as a base class for asm properties and features specific to the tar...

Instances of this class represent a single low-level machine instruction.

Describe properties that are true of each instruction in the target description file.

Interface to description of machine instruction set.

const MCInstrDesc & get(unsigned Opcode) const

Return the machine instruction descriptor that corresponds to the specified instruction opcode.

Wrapper class representing physical registers. Should be passed by value.

MIRFormater - Interface to format MIR operand based on target.

const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const

Add a new virtual register operand.

Representation of each machine instruction.

bool isReturn(QueryType Type=AnyInBundle) const

bool mayLoadOrStore(QueryType Type=AnyInBundle) const

Return true if this instruction could possibly read or modify memory.

bool isCall(QueryType Type=AnyInBundle) const

This class contains meta information specific to a module.

MachineOperand class - Representation of each machine instruction operand.

unsigned getSubReg() const

static MachineOperand CreateImm(int64_t Val)

MachineRegisterInfo - Keep track of information for virtual and physical registers,...

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

Wrapper class representing virtual and physical registers.

Represents one node in the SelectionDAG.

This class represents the scheduled code.

ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...

HazardRecognizer - This determines whether or not an instruction can be issued this cycle,...

This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...

A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...

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

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.

This class builds the dependence graph for the instructions in a loop, and attempts to schedule the i...

Object returned by analyzeLoopForPipelining.

virtual bool isMVEExpanderSupported()

Return true if the target can expand pipelined schedule with modulo variable expansion.

virtual void disposed()=0

Called when the loop is being removed.

virtual ~PipelinerLoopInfo()

virtual void createRemainingIterationsGreaterCondition(int TC, MachineBasicBlock &MBB, SmallVectorImpl< MachineOperand > &Cond, DenseMap< MachineInstr *, MachineInstr * > &LastStage0Insts)

Create a condition to determine if the remaining trip count for a phase is greater than TC.

virtual void adjustTripCount(int TripCountAdjust)=0

Modify the loop such that the trip count is OriginalTC + TripCountAdjust.

virtual bool shouldIgnoreForPipelining(const MachineInstr *MI) const =0

Return true if the given instruction should not be pipelined and should be ignored.

virtual void setPreheader(MachineBasicBlock *NewPreheader)=0

Called when the loop's preheader has been modified to NewPreheader.

virtual bool shouldUseSchedule(SwingSchedulerDAG &SSD, SMSchedule &SMS)

Return true if the proposed schedule should used.

virtual std::optional< bool > createTripCountGreaterCondition(int TC, MachineBasicBlock &MBB, SmallVectorImpl< MachineOperand > &Cond)=0

Create a condition to determine if the trip count of the loop is greater than TC, where TC is always ...

TargetInstrInfo - Interface to description of machine instruction set.

virtual ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *, const ScheduleDAG *DAG) const

Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...

virtual SmallVector< std::pair< MachineBasicBlock::iterator, MachineBasicBlock::iterator > > getOutlinableRanges(MachineBasicBlock &MBB, unsigned &Flags) const

Optional target hook which partitions MBB into outlinable ranges for instruction mapping purposes.

virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const

Return true if it's profitable to predicate instructions with accumulated instruction latency of "Num...

virtual bool isBasicBlockPrologue(const MachineInstr &MI, Register Reg=Register()) const

True if the instruction is bound to the top of its basic block and no other instructions shall be ins...

virtual bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const

Reverses the branch condition of the specified condition list, returning false on success and true if...

virtual MachineInstr * optimizeLoadInstr(MachineInstr &MI, const MachineRegisterInfo *MRI, Register &FoldAsLoadDefReg, MachineInstr *&DefMI) const

Try to remove the load by folding it to a register operand at the use.

virtual unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const

Remove the branching code at the end of the specific MBB.

virtual std::unique_ptr< PipelinerLoopInfo > analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const

Analyze loop L, which must be a single-basic-block loop, and if the conditions can be understood enou...

virtual bool ClobbersPredicate(MachineInstr &MI, std::vector< MachineOperand > &Pred, bool SkipDead) const

If the specified instruction defines any predicate or condition code register(s) used for predication...

virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const

Target-dependent implementation for foldMemoryOperand.

virtual bool canPredicatePredicatedInstr(const MachineInstr &MI) const

Assumes the instruction is already predicated and returns true if the instruction can be predicated a...

virtual bool hasLowDefLatency(const TargetSchedModel &SchedModel, const MachineInstr &DefMI, unsigned DefIdx) const

Compute operand latency of a def of 'Reg'.

virtual void setSpecialOperandAttr(MachineInstr &OldMI1, MachineInstr &OldMI2, MachineInstr &NewMI1, MachineInstr &NewMI2) const

This is an architecture-specific helper function of reassociateOps.

bool isZeroCost(unsigned Opcode) const

Return true for pseudo instructions that don't consume any machine resources in their current form.

virtual void buildClearRegister(Register Reg, MachineBasicBlock &MBB, MachineBasicBlock::iterator Iter, DebugLoc &DL, bool AllowSideEffects=true) const

Insert an architecture-specific instruction to clear a register.

virtual void getFrameIndexOperands(SmallVectorImpl< MachineOperand > &Ops, int FI) const

Fills in the necessary MachineOperands to refer to a frame index.

virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const

Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....

virtual bool isExtendLikelyToBeFolded(MachineInstr &ExtMI, MachineRegisterInfo &MRI) const

Given the generic extension instruction ExtMI, returns true if this extension is a likely candidate f...

virtual bool isSafeToSink(MachineInstr &MI, MachineBasicBlock *SuccToSinkTo, MachineCycleInfo *CI) const

virtual std::optional< DestSourcePair > isCopyLikeInstrImpl(const MachineInstr &MI) const

virtual unsigned getPartialRegUpdateClearance(const MachineInstr &MI, unsigned OpNum, const TargetRegisterInfo *TRI) const

Returns the preferred minimum clearance before an instruction with an unwanted partial register updat...

virtual bool canMakeTailCallConditional(SmallVectorImpl< MachineOperand > &Cond, const MachineInstr &TailCall) const

Returns true if the tail call can be made conditional on BranchCond.

virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData, const MachineInstr &MI) const

Return the number of u-operations the given machine instruction will be decoded to on the target cpu.

virtual DFAPacketizer * CreateTargetScheduleState(const TargetSubtargetInfo &) const

Create machine specific model for scheduling.

virtual unsigned reduceLoopCount(MachineBasicBlock &MBB, MachineBasicBlock &PreHeader, MachineInstr *IndVar, MachineInstr &Cmp, SmallVectorImpl< MachineOperand > &Cond, SmallVectorImpl< MachineInstr * > &PrevInsts, unsigned Iter, unsigned MaxIter) const

Generate code to reduce the loop iteration by one and check if the loop is finished.

virtual bool isPostIncrement(const MachineInstr &MI) const

Return true for post-incremented instructions.

bool isTriviallyReMaterializable(const MachineInstr &MI) const

Return true if the instruction is trivially rematerializable, meaning it has no side effects and requ...

virtual int getSPAdjust(const MachineInstr &MI) const

Returns the actual stack pointer adjustment made by an instruction as part of a call sequence.

virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const

Load the specified register of the given register class from the specified stack frame index.

virtual bool isCoalescableExtInstr(const MachineInstr &MI, Register &SrcReg, Register &DstReg, unsigned &SubIdx) const

Return true if the instruction is a "coalescable" extension instruction.

virtual void insertIndirectBranch(MachineBasicBlock &MBB, MachineBasicBlock &NewDestBB, MachineBasicBlock &RestoreBB, const DebugLoc &DL, int64_t BrOffset=0, RegScavenger *RS=nullptr) const

Insert an unconditional indirect branch at the end of MBB to NewDestBB.

virtual void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail, MachineBasicBlock *NewDest) const

Delete the instruction OldInst and everything after it, replacing it with an unconditional branch to ...

virtual ArrayRef< std::pair< MachineMemOperand::Flags, const char * > > getSerializableMachineMemOperandTargetFlags() const

Return an array that contains the MMO target flag values and their names.

virtual bool getBaseAndOffsetPosition(const MachineInstr &MI, unsigned &BasePos, unsigned &OffsetPos) const

Return true if the instruction contains a base register and offset.

virtual bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Pred) const

Convert the instruction into a predicated instruction.

virtual unsigned getOpcodeAfterMemoryUnfold(unsigned Opc, bool UnfoldLoad, bool UnfoldStore, unsigned *LoadRegIndex=nullptr) const

Returns the opcode of the would be new instruction after load / store are unfolded from an instructio...

bool areOpcodesEqualOrInverse(unsigned Opcode1, unsigned Opcode2) const

Return true when \P Opcode1 or its inversion is equal to \P Opcode2.

virtual outliner::InstrType getOutliningTypeImpl(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MIT, unsigned Flags) const

Target-dependent implementation for getOutliningTypeImpl.

virtual bool analyzeBranchPredicate(MachineBasicBlock &MBB, MachineBranchPredicate &MBP, bool AllowModify=false) const

Analyze the branching code at the end of MBB and parse it into the MachineBranchPredicate structure i...

virtual bool getInsertSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPair &BaseReg, RegSubRegPairAndIdx &InsertedReg) const

Target-dependent implementation of getInsertSubregInputs.

virtual bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const

Return true if the function should be outlined from by default.

outliner::InstrType getOutliningType(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MIT, unsigned Flags) const

Returns how or if MIT should be outlined.

virtual MachineInstr * optimizeSelect(MachineInstr &MI, SmallPtrSetImpl< MachineInstr * > &NewMIs, bool PreferFalse=false) const

Given a select instruction that was understood by analyzeSelect and returned Optimizable = true,...

virtual bool isThroughputPattern(unsigned Pattern) const

Return true when a code sequence can improve throughput.

virtual bool canFoldIntoAddrMode(const MachineInstr &MemI, Register Reg, const MachineInstr &AddrI, ExtAddrMode &AM) const

Check if it's possible and beneficial to fold the addressing computation AddrI into the addressing mo...

virtual const MIRFormatter * getMIRFormatter() const

Return MIR formatter to format/parse MIR operands.

virtual std::pair< unsigned, unsigned > getPatchpointUnfoldableRange(const MachineInstr &MI) const

For a patchpoint, stackmap, or statepoint intrinsic, return the range of operands which can't be fold...

virtual bool shouldReduceRegisterPressure(const MachineBasicBlock *MBB, const RegisterClassInfo *RegClassInfo) const

Return true if target supports reassociation of instructions in machine combiner pass to reduce regis...

virtual ArrayRef< std::pair< int, const char * > > getSerializableTargetIndices() const

Return an array that contains the ids of the target indices (used for the TargetIndex machine operand...

bool isFullCopyInstr(const MachineInstr &MI) const

virtual unsigned getUndefRegClearance(const MachineInstr &MI, unsigned OpNum, const TargetRegisterInfo *TRI) const

Return the minimum clearance before an instruction that reads an unused register.

virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg) const

Store the specified register of the given register class to the specified stack frame index.

virtual bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1, unsigned &SrcOpIdx2) const

Returns true iff the routine could find two commutable operands in the given machine instruction.

virtual void mergeOutliningCandidateAttributes(Function &F, std::vector< outliner::Candidate > &Candidates) const

Optional target hook to create the LLVM IR attributes for the outlined function.

virtual bool preservesZeroValueInReg(const MachineInstr *MI, const Register NullValueReg, const TargetRegisterInfo *TRI) const

Returns true if MI's Def is NullValueReg, and the MI does not change the Zero value.

virtual bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const

Perform target-specific instruction verification.

virtual void finalizeInsInstrs(MachineInstr &Root, unsigned &Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs) const

Fix up the placeholder we may add in genAlternativeCodeSequence().

virtual bool isUnconditionalTailCall(const MachineInstr &MI) const

Returns true if MI is an unconditional tail call.

bool isUnpredicatedTerminator(const MachineInstr &MI) const

Returns true if the instruction is a terminator instruction that has not been predicated.

virtual bool hasHighOperandLatency(const TargetSchedModel &SchedModel, const MachineRegisterInfo *MRI, const MachineInstr &DefMI, unsigned DefIdx, const MachineInstr &UseMI, unsigned UseIdx) const

Compute operand latency between a def of 'Reg' and a use in the current loop.

bool isUnspillableTerminator(const MachineInstr *MI) const

Return true if the given instruction is terminator that is unspillable, according to isUnspillableTer...

virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const

Return true if it's profitable to unpredicate one side of a 'diamond', i.e.

virtual bool useMachineCombiner() const

Return true when a target supports MachineCombiner.

virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const

Insert a noop into the instruction stream at the specified point.

virtual bool SubsumesPredicate(ArrayRef< MachineOperand > Pred1, ArrayRef< MachineOperand > Pred2) const

Returns true if the first specified predicate subsumes the second, e.g.

bool isFrameInstr(const MachineInstr &I) const

Returns true if the argument is a frame pseudo instruction.

virtual void breakPartialRegDependency(MachineInstr &MI, unsigned OpNum, const TargetRegisterInfo *TRI) const

Insert a dependency-breaking instruction before MI to eliminate an unwanted dependency on OpNum.

virtual bool getRegSequenceLikeInputs(const MachineInstr &MI, unsigned DefIdx, SmallVectorImpl< RegSubRegPairAndIdx > &InputRegs) const

Target-dependent implementation of getRegSequenceInputs.

virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB, unsigned NumTCycles, unsigned ExtraTCycles, MachineBasicBlock &FMBB, unsigned NumFCycles, unsigned ExtraFCycles, BranchProbability Probability) const

Second variant of isProfitableToIfCvt.

virtual int getExtendResourceLenLimit() const

The limit on resource length extension we accept in MachineCombiner Pass.

virtual ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const MachineFunction &MF) const

Allocate and return a hazard recognizer to use for by non-scheduling passes.

virtual void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, Register DstReg, ArrayRef< MachineOperand > Cond, Register TrueReg, Register FalseReg) const

Insert a select instruction into MBB before I that will copy TrueReg to DstReg when Cond is true,...

virtual bool getStackSlotRange(const TargetRegisterClass *RC, unsigned SubIdx, unsigned &Size, unsigned &Offset, const MachineFunction &MF) const

Compute the size in bytes and offset within a stack slot of a spilled register or subregister.

virtual ScheduleHazardRecognizer * CreateTargetMIHazardRecognizer(const InstrItineraryData *, const ScheduleDAGMI *DAG) const

Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...

virtual bool hasStoreToStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const

If the specified machine instruction has a store to a stack slot, return true along with the FrameInd...

virtual bool shouldBreakCriticalEdgeToSink(MachineInstr &MI) const

For a "cheap" instruction which doesn't enable additional sinking, should MachineSink break a critica...

virtual bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const

Sometimes, it is possible for the target to tell, even without aliasing information,...

virtual bool hasReassociableOperands(const MachineInstr &Inst, const MachineBasicBlock *MBB) const

Return true when \P Inst has reassociable operands in the same \P MBB.

virtual bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const

unsigned getReturnOpcode() const

virtual unsigned getInlineAsmLength(const char *Str, const MCAsmInfo &MAI, const TargetSubtargetInfo *STI=nullptr) const

Measure the specified inline asm to determine an approximation of its length.

virtual bool isIgnorableUse(const MachineOperand &MO) const

Given MO is a PhysReg use return if it can be ignored for the purpose of instruction rematerializatio...

virtual void genAlternativeCodeSequence(MachineInstr &Root, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, DenseMap< unsigned, unsigned > &InstIdxForVirtReg) const

When getMachineCombinerPatterns() finds patterns, this function generates the instructions that could...

virtual std::optional< ParamLoadedValue > describeLoadedValue(const MachineInstr &MI, Register Reg) const

Produce the expression describing the MI loading a value into the physical register Reg.

void lowerCopy(MachineInstr *MI, const TargetRegisterInfo *TRI) const

This function defines the logic to lower COPY instruction to target specific instruction(s).

virtual Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const

If the specified machine instruction is a direct load from a stack slot, return the virtual or physic...

MachineInstr * foldMemoryOperand(MachineInstr &MI, ArrayRef< unsigned > Ops, int FI, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const

Attempt to fold a load or store of the specified stack slot into the specified machine instruction fo...

virtual bool shouldClusterMemOps(ArrayRef< const MachineOperand * > BaseOps1, int64_t Offset1, bool OffsetIsScalable1, ArrayRef< const MachineOperand * > BaseOps2, int64_t Offset2, bool OffsetIsScalable2, unsigned ClusterSize, unsigned NumBytes) const

Returns true if the two given memory operations should be scheduled adjacent.

virtual unsigned getLiveRangeSplitOpcode(Register Reg, const MachineFunction &MF) const

Allows targets to use appropriate copy instruction while spilitting live range of a register in regis...

virtual bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg, Register SrcReg2, int64_t Mask, int64_t Value, const MachineRegisterInfo *MRI) const

See if the comparison instruction can be converted into something more efficient.

virtual unsigned getMemOperandAACheckLimit() const

Return the maximal number of alias checks on memory operands.

virtual bool isFunctionSafeToOutlineFrom(MachineFunction &MF, bool OutlineFromLinkOnceODRs) const

Return true if the function can safely be outlined from.

virtual ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetSubtargetInfo *STI, const ScheduleDAG *DAG) const

Allocate and return a hazard recognizer to use for this target when scheduling the machine instructio...

virtual bool isMBBSafeToSplitToCold(const MachineBasicBlock &MBB) const

Return true if the MachineBasicBlock can safely be split to the cold section.

virtual void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF, const outliner::OutlinedFunction &OF) const

Insert a custom frame for outlined functions.

virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const

This is a used by the pre-regalloc scheduler to determine (in conjunction with areLoadsFromSameBasePt...

virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const

Insert branch code into the end of the specified MachineBasicBlock.

virtual bool canCopyGluedNodeDuringSchedule(SDNode *N) const

Return true if the given SDNode can be copied during scheduling even if it has glue.

virtual std::optional< ExtAddrMode > getAddrModeFromMemoryOp(const MachineInstr &MemI, const TargetRegisterInfo *TRI) const

Target dependent implementation to get the values constituting the address MachineInstr that is acces...

virtual std::optional< DestSourcePair > isCopyInstrImpl(const MachineInstr &MI) const

Target-dependent implementation for IsCopyInstr.

virtual MachineInstr * createPHIDestinationCopy(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsPt, const DebugLoc &DL, Register Src, Register Dst) const

During PHI eleimination lets target to make necessary checks and insert the copy to the PHI destinati...

virtual bool getConstValDefinedInReg(const MachineInstr &MI, const Register Reg, int64_t &ImmVal) const

Returns true if MI is an instruction that defines Reg to have a constant value and the value is recor...

static bool isGenericOpcode(unsigned Opc)

TargetInstrInfo & operator=(const TargetInstrInfo &)=delete

std::optional< DestSourcePair > isCopyLikeInstr(const MachineInstr &MI) const

virtual ArrayRef< std::pair< unsigned, const char * > > getSerializableBitmaskMachineOperandTargetFlags() const

Return an array that contains the bitmask target flag values and their names.

unsigned getCallFrameSetupOpcode() const

These methods return the opcode of the frame setup/destroy instructions if they exist (-1 otherwise).

virtual bool isSubregFoldable() const

Check whether the target can fold a load that feeds a subreg operand (or a subreg operand that feeds ...

virtual bool getMachineCombinerPatterns(MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns, bool DoRegPressureReduce) const

Return true when there is potentially a faster code sequence for an instruction chain ending in Root.

virtual MCInst getNop() const

Return the noop instruction to use for a noop.

unsigned getCallFrameSizeAt(MachineInstr &MI) const

virtual Register isStoreToStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const

Check for post-frame ptr elimination stack locations as well.

virtual MachineInstr & duplicate(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, const MachineInstr &Orig) const

Clones instruction or the whole instruction bundle Orig and insert into MBB before InsertBefore.

virtual Register isLoadFromStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const

Check for post-frame ptr elimination stack locations as well.

std::pair< unsigned, unsigned > getReassociationOpcodes(unsigned Pattern, const MachineInstr &Root, const MachineInstr &Prev) const

Reassociation of some instructions requires inverse operations (e.g.

virtual std::pair< uint16_t, uint16_t > getExecutionDomain(const MachineInstr &MI) const

Return the current execution domain and bit mask of possible domains for instruction.

virtual bool optimizeCondBranch(MachineInstr &MI) const

virtual bool analyzeLoop(MachineLoop &L, MachineInstr *&IndVarInst, MachineInstr *&CmpInst) const

Analyze the loop code, return true if it cannot be understood.

virtual bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB, unsigned &Flags) const

Optional target hook that returns true if MBB is safe to outline from, and returns any target-specifi...

unsigned getCatchReturnOpcode() const

virtual void getReassociateOperandIndices(const MachineInstr &Root, unsigned Pattern, std::array< unsigned, 5 > &OperandIndices) const

The returned array encodes the operand index for each parameter because the operands may be commuted;...

virtual unsigned getTailMergeSize(const MachineFunction &MF) const

Returns the target-specific default value for tail merging.

virtual InstructionUniformity getInstructionUniformity(const MachineInstr &MI) const

Return the uniformity behavior of the given instruction.

virtual bool isAsCheapAsAMove(const MachineInstr &MI) const

Return true if the instruction is as cheap as a move instruction.

virtual bool isTailCall(const MachineInstr &Inst) const

Determines whether Inst is a tail call instruction.

virtual const MachineOperand & getCalleeOperand(const MachineInstr &MI) const

Returns the callee operand from the given MI.

virtual Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const

If the specified machine instruction is a direct store to a stack slot, return the virtual or physica...

int64_t getFrameTotalSize(const MachineInstr &I) const

Returns the total frame size, which is made up of the space set up inside the pair of frame start-sto...

MachineInstr * commuteInstruction(MachineInstr &MI, bool NewMI=false, unsigned OpIdx1=CommuteAnyOperandIndex, unsigned OpIdx2=CommuteAnyOperandIndex) const

This method commutes the operands of the given machine instruction MI.

virtual bool foldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, Register Reg, MachineRegisterInfo *MRI) const

'Reg' is known to be defined by a move immediate instruction, try to fold the immediate into the use ...

virtual bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr &MI, unsigned Reg, bool UnfoldLoad, bool UnfoldStore, SmallVectorImpl< MachineInstr * > &NewMIs) const

unfoldMemoryOperand - Separate a single instruction which folded a load or a store or a load and a st...

virtual bool isStackSlotCopy(const MachineInstr &MI, int &DestFrameIndex, int &SrcFrameIndex) const

Return true if the specified machine instruction is a copy of one stack slot to another and has no ot...

virtual std::optional< unsigned > getOperandLatency(const InstrItineraryData *ItinData, SDNode *DefNode, unsigned DefIdx, SDNode *UseNode, unsigned UseIdx) const

virtual int getJumpTableIndex(const MachineInstr &MI) const

Return an index for MachineJumpTableInfo if insn is an indirect jump using a jump table,...

virtual bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert=false) const

Return true when \P Inst is both associative and commutative.

virtual bool isExplicitTargetIndexDef(const MachineInstr &MI, int &Index, int64_t &Offset) const

Returns true if the given MI defines a TargetIndex operand that can be tracked by their offset,...

virtual bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const

Allow targets to tell MachineVerifier whether a specific register MachineOperand can be used as part ...

virtual void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, unsigned SubIdx, const MachineInstr &Orig, const TargetRegisterInfo &TRI) const

Re-issue the specified 'original' instruction at the specific location targeting a new destination re...

virtual std::optional< std::unique_ptr< outliner::OutlinedFunction > > getOutliningCandidateInfo(const MachineModuleInfo &MMI, std::vector< outliner::Candidate > &RepeatedSequenceLocs, unsigned MinRepeats) const

Returns a outliner::OutlinedFunction struct containing target-specific information for a set of outli...

virtual MachineInstr * createPHISourceCopy(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsPt, const DebugLoc &DL, Register Src, unsigned SrcSubReg, Register Dst) const

During PHI eleimination lets target to make necessary checks and insert the copy to the PHI destinati...

virtual MachineBasicBlock::iterator insertOutlinedCall(Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It, MachineFunction &MF, outliner::Candidate &C) const

Insert a call to an outlined function into the program.

virtual std::optional< unsigned > getInverseOpcode(unsigned Opcode) const

Return the inverse operation opcode if it exists for \P Opcode (e.g.

TargetInstrInfo(unsigned CFSetupOpcode=~0u, unsigned CFDestroyOpcode=~0u, unsigned CatchRetOpcode=~0u, unsigned ReturnOpcode=~0u)

virtual void insertNoops(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned Quantity) const

Insert noops into the instruction stream at the specified point.

unsigned getCallFrameDestroyOpcode() const

int64_t getFrameSize(const MachineInstr &I) const

Returns size of the frame associated with the given frame instruction.

virtual bool isReallyTriviallyReMaterializable(const MachineInstr &MI) const

For instructions with opcodes for which the M_REMATERIALIZABLE flag is set, this hook lets the target...

virtual MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const

virtual bool isPredicated(const MachineInstr &MI) const

Returns true if the instruction is already predicated.

bool getInsertSubregInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPair &BaseReg, RegSubRegPairAndIdx &InsertedReg) const

Build the equivalent inputs of a INSERT_SUBREG for the given MI and DefIdx.

virtual void replaceBranchWithTailCall(MachineBasicBlock &MBB, SmallVectorImpl< MachineOperand > &Cond, const MachineInstr &TailCall) const

Replace the conditional branch in MBB with a conditional tail call.

TargetInstrInfo(const TargetInstrInfo &)=delete

virtual unsigned predictBranchSizeForIfCvt(MachineInstr &MI) const

Return an estimate for the code size reduction (in bytes) which will be caused by removing the given ...

virtual ~TargetInstrInfo()

virtual unsigned getInstrLatency(const InstrItineraryData *ItinData, const MachineInstr &MI, unsigned *PredCost=nullptr) const

Compute the instruction latency of a given instruction.

virtual bool produceSameValue(const MachineInstr &MI0, const MachineInstr &MI1, const MachineRegisterInfo *MRI=nullptr) const

Return true if two machine instructions would produce identical values.

bool isFrameSetup(const MachineInstr &I) const

Returns true if the argument is a frame setup pseudo instruction.

virtual unsigned extraSizeToPredicateInstructions(const MachineFunction &MF, unsigned NumInsts) const

Return the increase in code size needed to predicate a contiguous run of NumInsts instructions.

virtual bool accumulateInstrSeqToRootLatency(MachineInstr &Root) const

When calculate the latency of the root instruction, accumulate the latency of the sequence to the roo...

std::optional< DestSourcePair > isCopyInstr(const MachineInstr &MI) const

If the specific machine instruction is a instruction that moves/copies value from one register to ano...

bool isReassociationCandidate(const MachineInstr &Inst, bool &Commuted) const

Return true if the input \P Inst is part of a chain of dependent ops that are suitable for reassociat...

virtual bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const

Test if the given instruction should be considered a scheduling boundary.

virtual bool analyzeSelect(const MachineInstr &MI, SmallVectorImpl< MachineOperand > &Cond, unsigned &TrueOp, unsigned &FalseOp, bool &Optimizable) const

Analyze the given select instruction, returning true if it cannot be understood.

virtual bool getMemOperandsWithOffsetWidth(const MachineInstr &MI, SmallVectorImpl< const MachineOperand * > &BaseOps, int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width, const TargetRegisterInfo *TRI) const

Get zero or more base operands and the byte offset of an instruction that reads/writes memory.

virtual unsigned getInstSizeInBytes(const MachineInstr &MI) const

Returns the size in bytes of the specified MachineInstr, or ~0U when this function is not implemented...

virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, BranchProbability Probability) const

Return true if it's profitable for if-converter to duplicate instructions of specified accumulated in...

virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const

Emit instructions to copy a pair of physical registers.

virtual unsigned getPredicationCost(const MachineInstr &MI) const

virtual bool shouldSink(const MachineInstr &MI) const

Return true if the instruction should be sunk by MachineSink.

virtual MachineInstr * convertToThreeAddress(MachineInstr &MI, LiveVariables *LV, LiveIntervals *LIS) const

This method must be implemented by targets that set the M_CONVERTIBLE_TO_3_ADDR flag.

virtual void setExecutionDomain(MachineInstr &MI, unsigned Domain) const

Change the opcode of MI to execute in Domain.

virtual CombinerObjective getCombinerObjective(unsigned Pattern) const

Return the objective of a combiner pattern.

virtual bool isPredicable(const MachineInstr &MI) const

Return true if the specified instruction can be predicated.

virtual MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned OpIdx1, unsigned OpIdx2) const

This method commutes the operands of the given machine instruction MI.

virtual std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned) const

Decompose the machine operand's target flags into two values - the direct target flag value and any o...

virtual bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const

Return true if it's safe to move a machine instruction that defines the specified register class.

virtual bool canInsertSelect(const MachineBasicBlock &MBB, ArrayRef< MachineOperand > Cond, Register DstReg, Register TrueReg, Register FalseReg, int &CondCycles, int &TrueCycles, int &FalseCycles) const

Return true if it is possible to insert a select instruction that chooses between TrueReg and FalseRe...

virtual bool isFunctionSafeToSplit(const MachineFunction &MF) const

Return true if the function is a viable candidate for machine function splitting.

virtual MachineTraceStrategy getMachineCombinerTraceStrategy() const

Return a strategy that MachineCombiner must use when creating traces.

bool getRegSequenceInputs(const MachineInstr &MI, unsigned DefIdx, SmallVectorImpl< RegSubRegPairAndIdx > &InputRegs) const

Build the equivalent inputs of a REG_SEQUENCE for the given MI and DefIdx.

virtual bool hasLoadFromStackSlot(const MachineInstr &MI, SmallVectorImpl< const MachineMemOperand * > &Accesses) const

If the specified machine instruction has a load from a stack slot, return true along with the FrameIn...

virtual bool isGlobalMemoryObject(const MachineInstr *MI) const

Returns true if MI is an instruction we are unable to reason about (like a call or something with unm...

virtual bool isUnspillableTerminatorImpl(const MachineInstr *MI) const

Return true if the given terminator MI is not expected to spill.

virtual std::optional< RegImmPair > isAddImmediate(const MachineInstr &MI, Register Reg) const

If the specific machine instruction is an instruction that adds an immediate value and a register,...

unsigned defaultDefLatency(const MCSchedModel &SchedModel, const MachineInstr &DefMI) const

Return the default expected latency for a def based on its opcode.

void reassociateOps(MachineInstr &Root, MachineInstr &Prev, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, ArrayRef< unsigned > OperandIndices, DenseMap< unsigned, unsigned > &InstrIdxForVirtReg) const

Attempt to reassociate \P Root and \P Prev according to \P Pattern to reduce critical path length.

static bool isGenericAtomicRMWOpcode(unsigned Opc)

virtual bool hasCommutePreference(MachineInstr &MI, bool &Commute) const

Returns true if the target has a preference on the operands order of the given machine instruction.

static const unsigned CommuteAnyOperandIndex

virtual bool hasReassociableSibling(const MachineInstr &Inst, bool &Commuted) const

Return true when \P Inst has reassociable sibling.

virtual std::string createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op, unsigned OpIdx, const TargetRegisterInfo *TRI) const

virtual bool isHighLatencyDef(int opc) const

Return true if this opcode has high latency to its result.

virtual MachineInstr * emitLdStWithAddr(MachineInstr &MemI, const ExtAddrMode &AM) const

Emit a load/store instruction with the same value register as MemI, but using the address from AM.

virtual bool expandPostRAPseudo(MachineInstr &MI) const

This function is called for all pseudo instructions that remain after register allocation.

static bool fixCommutedOpIndices(unsigned &ResultIdx1, unsigned &ResultIdx2, unsigned CommutableOpIdx1, unsigned CommutableOpIdx2)

Assigns the (CommutableOpIdx1, CommutableOpIdx2) pair of commutable operand indices to (ResultIdx1,...

virtual ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const

Return an array that contains the direct target flag values and their names.

virtual bool shouldHoist(const MachineInstr &MI, const MachineLoop *FromLoop) const

Return false if the instruction should not be hoisted by MachineLICM.

bool getExtractSubregInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPairAndIdx &InputReg) const

Build the equivalent inputs of a EXTRACT_SUBREG for the given MI and DefIdx.

virtual bool getExtractSubregLikeInputs(const MachineInstr &MI, unsigned DefIdx, RegSubRegPairAndIdx &InputReg) const

Target-dependent implementation of getExtractSubregInputs.

virtual unsigned getTailDuplicateSize(CodeGenOptLevel OptLevel) const

Returns the target-specific default value for tail duplication.

bool usePreRAHazardRecognizer() const

Provide a global flag for disabling the PreRA hazard recognizer that targets may choose to honor.

unsigned insertUnconditionalBranch(MachineBasicBlock &MBB, MachineBasicBlock *DestBB, const DebugLoc &DL, int *BytesAdded=nullptr) const

virtual bool getIncrementValue(const MachineInstr &MI, int &Value) const

If the instruction is an increment of a constant value, return the amount.

virtual Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex, unsigned &MemBytes) const

Optional extension of isStoreToStackSlot that returns the number of bytes stored to the stack.

virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, MachineInstr &LoadMI, LiveIntervals *LIS=nullptr) const

Target-dependent implementation for foldMemoryOperand.

virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, int64_t &Offset2) const

This is used by the pre-regalloc scheduler to determine if two loads are loading from the same base a...

virtual bool unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N, SmallVectorImpl< SDNode * > &NewNodes) const

virtual const TargetRegisterClass * getRegClass(const MCInstrDesc &MCID, unsigned OpNum, const TargetRegisterInfo *TRI, const MachineFunction &MF) const

Given a machine instruction descriptor, returns the register class constraint for OpNum,...

virtual bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &Mask, int64_t &Value) const

For a comparison instruction, return the source registers in SrcReg and SrcReg2 if having two registe...

virtual unsigned getMachineCSELookAheadLimit() const

Return the value to use for the MachineCSE's LookAheadLimit, which is a heuristic used for CSE'ing ph...

virtual bool isLegalToSplitMBBAt(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI) const

Return true if it's legal to split the given basic block at the specified instruction (i....

virtual Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex, unsigned &MemBytes) const

Optional extension of isLoadFromStackSlot that returns the number of bytes loaded from the stack.

bool getMemOperandWithOffset(const MachineInstr &MI, const MachineOperand *&BaseOp, int64_t &Offset, bool &OffsetIsScalable, const TargetRegisterInfo *TRI) const

Get the base operand and byte offset of an instruction that reads/writes memory.

TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...

Provide an instruction scheduling machine model to CodeGen passes.

TargetSubtargetInfo - Generic base class for all target subtargets.

LLVM Value Representation.

#define llvm_unreachable(msg)

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

@ Tail

Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...

@ C

The default llvm calling convention, compatible with C.

InstrType

Represents how an instruction should be mapped by the outliner.

This is an optimization pass for GlobalISel generic memory operations.

MachineTraceStrategy

Strategies for selecting traces.

std::pair< MachineOperand, DIExpression * > ParamLoadedValue

MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)

Builder interface. Specify how to create the initial instruction itself.

CombinerObjective

The combiner's goal may differ based on which pattern it is attempting to optimize.

CodeGenOptLevel

Code generation optimization level.

InstructionUniformity

Enum describing how instructions behave with respect to uniformity and divergence,...

@ Default

The result values are uniform if and only if all operands are uniform.

static unsigned getHashValue(const TargetInstrInfo::RegSubRegPair &Val)

Reuse getHashValue implementation from std::pair<unsigned, unsigned>.

static TargetInstrInfo::RegSubRegPair getTombstoneKey()

static TargetInstrInfo::RegSubRegPair getEmptyKey()

static bool isEqual(const TargetInstrInfo::RegSubRegPair &LHS, const TargetInstrInfo::RegSubRegPair &RHS)

An information struct used to provide DenseMap with the various necessary components for a given valu...

const MachineOperand * Source

DestSourcePair(const MachineOperand &Dest, const MachineOperand &Src)

const MachineOperand * Destination

Used to describe addressing mode similar to ExtAddrMode in CodeGenPrepare.

Machine model for scheduling, bundling, and heuristics.

Used to describe a register and immediate addition.

RegImmPair(Register Reg, int64_t Imm)

Represents a predicate at the MachineFunction level.

bool SingleUseCondition

SingleUseCondition is true if ConditionDef is dead except for the branch(es) at the end of the basic ...

MachineBasicBlock * TrueDest

MachineInstr * ConditionDef

MachineBranchPredicate()=default

ComparePredicate Predicate

MachineBasicBlock * FalseDest

A pair composed of a pair of a register and a sub-register index, and another sub-register index.

RegSubRegPairAndIdx(Register Reg=Register(), unsigned SubReg=0, unsigned SubIdx=0)

A pair composed of a register and a sub-register index.

bool operator==(const RegSubRegPair &P) const

RegSubRegPair(Register Reg=Register(), unsigned SubReg=0)

bool operator!=(const RegSubRegPair &P) const

An individual sequence of instructions to be replaced with a call to an outlined function.

The information necessary to create an outlined function for some class of candidate.