Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file defines classes that make it really easy to deal with intrinsic
10
// functions with the isa/dyncast family of functions.  In particular, this
11
// allows you to do things like:
12
//
13
//     if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
14
//        ... MCI->getDest() ... MCI->getSource() ...
15
//
16
// All intrinsic function calls are instances of the call instruction, so these
17
// are all subclasses of the CallInst class.  Note that none of these classes
18
// has state or virtual methods, which is an important part of this gross/neat
19
// hack working.
20
//
21
//===----------------------------------------------------------------------===//
22
 
23
#ifndef LLVM_IR_INTRINSICINST_H
24
#define LLVM_IR_INTRINSICINST_H
25
 
26
#include "llvm/IR/Constants.h"
27
#include "llvm/IR/DebugInfoMetadata.h"
28
#include "llvm/IR/DerivedTypes.h"
29
#include "llvm/IR/FPEnv.h"
30
#include "llvm/IR/Function.h"
31
#include "llvm/IR/GlobalVariable.h"
32
#include "llvm/IR/Instructions.h"
33
#include "llvm/IR/Intrinsics.h"
34
#include "llvm/IR/Value.h"
35
#include "llvm/Support/Casting.h"
36
#include <cassert>
37
#include <cstdint>
38
#include <optional>
39
 
40
namespace llvm {
41
 
42
class Metadata;
43
 
44
/// A wrapper class for inspecting calls to intrinsic functions.
45
/// This allows the standard isa/dyncast/cast functionality to work with calls
46
/// to intrinsic functions.
47
class IntrinsicInst : public CallInst {
48
public:
49
  IntrinsicInst() = delete;
50
  IntrinsicInst(const IntrinsicInst &) = delete;
51
  IntrinsicInst &operator=(const IntrinsicInst &) = delete;
52
 
53
  /// Return the intrinsic ID of this intrinsic.
54
  Intrinsic::ID getIntrinsicID() const {
55
    return getCalledFunction()->getIntrinsicID();
56
  }
57
 
58
  /// Return true if swapping the first two arguments to the intrinsic produces
59
  /// the same result.
60
  bool isCommutative() const {
61
    switch (getIntrinsicID()) {
62
    case Intrinsic::maxnum:
63
    case Intrinsic::minnum:
64
    case Intrinsic::maximum:
65
    case Intrinsic::minimum:
66
    case Intrinsic::smax:
67
    case Intrinsic::smin:
68
    case Intrinsic::umax:
69
    case Intrinsic::umin:
70
    case Intrinsic::sadd_sat:
71
    case Intrinsic::uadd_sat:
72
    case Intrinsic::sadd_with_overflow:
73
    case Intrinsic::uadd_with_overflow:
74
    case Intrinsic::smul_with_overflow:
75
    case Intrinsic::umul_with_overflow:
76
    case Intrinsic::smul_fix:
77
    case Intrinsic::umul_fix:
78
    case Intrinsic::smul_fix_sat:
79
    case Intrinsic::umul_fix_sat:
80
    case Intrinsic::fma:
81
    case Intrinsic::fmuladd:
82
      return true;
83
    default:
84
      return false;
85
    }
86
  }
87
 
88
  /// Checks if the intrinsic is an annotation.
89
  bool isAssumeLikeIntrinsic() const {
90
    switch (getIntrinsicID()) {
91
    default: break;
92
    case Intrinsic::assume:
93
    case Intrinsic::sideeffect:
94
    case Intrinsic::pseudoprobe:
95
    case Intrinsic::dbg_assign:
96
    case Intrinsic::dbg_declare:
97
    case Intrinsic::dbg_value:
98
    case Intrinsic::dbg_label:
99
    case Intrinsic::invariant_start:
100
    case Intrinsic::invariant_end:
101
    case Intrinsic::lifetime_start:
102
    case Intrinsic::lifetime_end:
103
    case Intrinsic::experimental_noalias_scope_decl:
104
    case Intrinsic::objectsize:
105
    case Intrinsic::ptr_annotation:
106
    case Intrinsic::var_annotation:
107
      return true;
108
    }
109
    return false;
110
  }
111
 
112
  /// Check if the intrinsic might lower into a regular function call in the
113
  /// course of IR transformations
114
  static bool mayLowerToFunctionCall(Intrinsic::ID IID);
115
 
116
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
117
  static bool classof(const CallInst *I) {
118
    if (const Function *CF = I->getCalledFunction())
119
      return CF->isIntrinsic();
120
    return false;
121
  }
122
  static bool classof(const Value *V) {
123
    return isa<CallInst>(V) && classof(cast<CallInst>(V));
124
  }
125
};
126
 
127
/// Check if \p ID corresponds to a lifetime intrinsic.
128
static inline bool isLifetimeIntrinsic(Intrinsic::ID ID) {
129
  switch (ID) {
130
  case Intrinsic::lifetime_start:
131
  case Intrinsic::lifetime_end:
132
    return true;
133
  default:
134
    return false;
135
  }
136
}
137
 
138
/// This is the common base class for lifetime intrinsics.
139
class LifetimeIntrinsic : public IntrinsicInst {
140
public:
141
  /// \name Casting methods
142
  /// @{
143
  static bool classof(const IntrinsicInst *I) {
144
    return isLifetimeIntrinsic(I->getIntrinsicID());
145
  }
146
  static bool classof(const Value *V) {
147
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
148
  }
149
  /// @}
150
};
151
 
152
/// Check if \p ID corresponds to a debug info intrinsic.
153
static inline bool isDbgInfoIntrinsic(Intrinsic::ID ID) {
154
  switch (ID) {
155
  case Intrinsic::dbg_declare:
156
  case Intrinsic::dbg_value:
157
  case Intrinsic::dbg_addr:
158
  case Intrinsic::dbg_label:
159
  case Intrinsic::dbg_assign:
160
    return true;
161
  default:
162
    return false;
163
  }
164
}
165
 
166
/// This is the common base class for debug info intrinsics.
167
class DbgInfoIntrinsic : public IntrinsicInst {
168
public:
169
  /// \name Casting methods
170
  /// @{
171
  static bool classof(const IntrinsicInst *I) {
172
    return isDbgInfoIntrinsic(I->getIntrinsicID());
173
  }
174
  static bool classof(const Value *V) {
175
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
176
  }
177
  /// @}
178
};
179
 
180
/// This is the common base class for debug info intrinsics for variables.
181
class DbgVariableIntrinsic : public DbgInfoIntrinsic {
182
public:
183
  // Iterator for ValueAsMetadata that internally uses direct pointer iteration
184
  // over either a ValueAsMetadata* or a ValueAsMetadata**, dereferencing to the
185
  // ValueAsMetadata .
186
  class location_op_iterator
187
      : public iterator_facade_base<location_op_iterator,
188
                                    std::bidirectional_iterator_tag, Value *> {
189
    PointerUnion<ValueAsMetadata *, ValueAsMetadata **> I;
190
 
191
  public:
192
    location_op_iterator(ValueAsMetadata *SingleIter) : I(SingleIter) {}
193
    location_op_iterator(ValueAsMetadata **MultiIter) : I(MultiIter) {}
194
 
195
    location_op_iterator(const location_op_iterator &R) : I(R.I) {}
196
    location_op_iterator &operator=(const location_op_iterator &R) {
197
      I = R.I;
198
      return *this;
199
    }
200
    bool operator==(const location_op_iterator &RHS) const {
201
      return I == RHS.I;
202
    }
203
    const Value *operator*() const {
204
      ValueAsMetadata *VAM = I.is<ValueAsMetadata *>()
205
                                 ? I.get<ValueAsMetadata *>()
206
                                 : *I.get<ValueAsMetadata **>();
207
      return VAM->getValue();
208
    };
209
    Value *operator*() {
210
      ValueAsMetadata *VAM = I.is<ValueAsMetadata *>()
211
                                 ? I.get<ValueAsMetadata *>()
212
                                 : *I.get<ValueAsMetadata **>();
213
      return VAM->getValue();
214
    }
215
    location_op_iterator &operator++() {
216
      if (I.is<ValueAsMetadata *>())
217
        I = I.get<ValueAsMetadata *>() + 1;
218
      else
219
        I = I.get<ValueAsMetadata **>() + 1;
220
      return *this;
221
    }
222
    location_op_iterator &operator--() {
223
      if (I.is<ValueAsMetadata *>())
224
        I = I.get<ValueAsMetadata *>() - 1;
225
      else
226
        I = I.get<ValueAsMetadata **>() - 1;
227
      return *this;
228
    }
229
  };
230
 
231
  /// Get the locations corresponding to the variable referenced by the debug
232
  /// info intrinsic.  Depending on the intrinsic, this could be the
233
  /// variable's value or its address.
234
  iterator_range<location_op_iterator> location_ops() const;
235
 
236
  Value *getVariableLocationOp(unsigned OpIdx) const;
237
 
238
  void replaceVariableLocationOp(Value *OldValue, Value *NewValue);
239
  void replaceVariableLocationOp(unsigned OpIdx, Value *NewValue);
240
  /// Adding a new location operand will always result in this intrinsic using
241
  /// an ArgList, and must always be accompanied by a new expression that uses
242
  /// the new operand.
243
  void addVariableLocationOps(ArrayRef<Value *> NewValues,
244
                              DIExpression *NewExpr);
245
 
246
  void setVariable(DILocalVariable *NewVar) {
247
    setArgOperand(1, MetadataAsValue::get(NewVar->getContext(), NewVar));
248
  }
249
 
250
  void setExpression(DIExpression *NewExpr) {
251
    setArgOperand(2, MetadataAsValue::get(NewExpr->getContext(), NewExpr));
252
  }
253
 
254
  unsigned getNumVariableLocationOps() const {
255
    if (hasArgList())
256
      return cast<DIArgList>(getRawLocation())->getArgs().size();
257
    return 1;
258
  }
259
 
260
  bool hasArgList() const { return isa<DIArgList>(getRawLocation()); }
261
 
262
  /// Does this describe the address of a local variable. True for dbg.addr and
263
  /// dbg.declare, but not dbg.value, which describes its value, or dbg.assign,
264
  /// which describes a combination of the variable's value and address.
265
  bool isAddressOfVariable() const {
266
    return getIntrinsicID() != Intrinsic::dbg_value &&
267
           getIntrinsicID() != Intrinsic::dbg_assign;
268
  }
269
 
270
  void setKillLocation() {
271
    // TODO: When/if we remove duplicate values from DIArgLists, we don't need
272
    // this set anymore.
273
    SmallPtrSet<Value *, 4> RemovedValues;
274
    for (Value *OldValue : location_ops()) {
275
      if (!RemovedValues.insert(OldValue).second)
276
        continue;
277
      Value *Poison = PoisonValue::get(OldValue->getType());
278
      replaceVariableLocationOp(OldValue, Poison);
279
    }
280
  }
281
 
282
  bool isKillLocation() const {
283
    return (getNumVariableLocationOps() == 0 &&
284
            !getExpression()->isComplex()) ||
285
           any_of(location_ops(), [](Value *V) { return isa<UndefValue>(V); });
286
  }
287
 
288
  DILocalVariable *getVariable() const {
289
    return cast<DILocalVariable>(getRawVariable());
290
  }
291
 
292
  DIExpression *getExpression() const {
293
    return cast<DIExpression>(getRawExpression());
294
  }
295
 
296
  Metadata *getRawLocation() const {
297
    return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
298
  }
299
 
300
  Metadata *getRawVariable() const {
301
    return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
302
  }
303
 
304
  Metadata *getRawExpression() const {
305
    return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
306
  }
307
 
308
  /// Use of this should generally be avoided; instead,
309
  /// replaceVariableLocationOp and addVariableLocationOps should be used where
310
  /// possible to avoid creating invalid state.
311
  void setRawLocation(Metadata *Location) {
312
    return setArgOperand(0, MetadataAsValue::get(getContext(), Location));
313
  }
314
 
315
  /// Get the size (in bits) of the variable, or fragment of the variable that
316
  /// is described.
317
  std::optional<uint64_t> getFragmentSizeInBits() const;
318
 
319
  /// Get the FragmentInfo for the variable.
320
  std::optional<DIExpression::FragmentInfo> getFragment() const {
321
    return getExpression()->getFragmentInfo();
322
  }
323
 
324
  /// \name Casting methods
325
  /// @{
326
  static bool classof(const IntrinsicInst *I) {
327
    switch (I->getIntrinsicID()) {
328
    case Intrinsic::dbg_declare:
329
    case Intrinsic::dbg_value:
330
    case Intrinsic::dbg_addr:
331
    case Intrinsic::dbg_assign:
332
      return true;
333
    default:
334
      return false;
335
    }
336
  }
337
  static bool classof(const Value *V) {
338
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
339
  }
340
  /// @}
341
protected:
342
  void setArgOperand(unsigned i, Value *v) {
343
    DbgInfoIntrinsic::setArgOperand(i, v);
344
  }
345
  void setOperand(unsigned i, Value *v) { DbgInfoIntrinsic::setOperand(i, v); }
346
};
347
 
348
/// This represents the llvm.dbg.declare instruction.
349
class DbgDeclareInst : public DbgVariableIntrinsic {
350
public:
351
  Value *getAddress() const {
352
    assert(getNumVariableLocationOps() == 1 &&
353
           "dbg.declare must have exactly 1 location operand.");
354
    return getVariableLocationOp(0);
355
  }
356
 
357
  /// \name Casting methods
358
  /// @{
359
  static bool classof(const IntrinsicInst *I) {
360
    return I->getIntrinsicID() == Intrinsic::dbg_declare;
361
  }
362
  static bool classof(const Value *V) {
363
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
364
  }
365
  /// @}
366
};
367
 
368
/// This represents the llvm.dbg.addr instruction.
369
class DbgAddrIntrinsic : public DbgVariableIntrinsic {
370
public:
371
  Value *getAddress() const {
372
    assert(getNumVariableLocationOps() == 1 &&
373
           "dbg.addr must have exactly 1 location operand.");
374
    return getVariableLocationOp(0);
375
  }
376
 
377
  /// \name Casting methods
378
  /// @{
379
  static bool classof(const IntrinsicInst *I) {
380
    return I->getIntrinsicID() == Intrinsic::dbg_addr;
381
  }
382
  static bool classof(const Value *V) {
383
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
384
  }
385
};
386
 
387
/// This represents the llvm.dbg.value instruction.
388
class DbgValueInst : public DbgVariableIntrinsic {
389
public:
390
  // The default argument should only be used in ISel, and the default option
391
  // should be removed once ISel support for multiple location ops is complete.
392
  Value *getValue(unsigned OpIdx = 0) const {
393
    return getVariableLocationOp(OpIdx);
394
  }
395
  iterator_range<location_op_iterator> getValues() const {
396
    return location_ops();
397
  }
398
 
399
  /// \name Casting methods
400
  /// @{
401
  static bool classof(const IntrinsicInst *I) {
402
    return I->getIntrinsicID() == Intrinsic::dbg_value ||
403
           I->getIntrinsicID() == Intrinsic::dbg_assign;
404
  }
405
  static bool classof(const Value *V) {
406
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
407
  }
408
  /// @}
409
};
410
 
411
/// This represents the llvm.dbg.assign instruction.
412
class DbgAssignIntrinsic : public DbgValueInst {
413
  enum Operands {
414
    OpValue,
415
    OpVar,
416
    OpExpr,
417
    OpAssignID,
418
    OpAddress,
419
    OpAddressExpr,
420
  };
421
 
422
public:
423
  Value *getAddress() const;
424
  Metadata *getRawAddress() const {
425
    return cast<MetadataAsValue>(getArgOperand(OpAddress))->getMetadata();
426
  }
427
  Metadata *getRawAssignID() const {
428
    return cast<MetadataAsValue>(getArgOperand(OpAssignID))->getMetadata();
429
  }
430
  DIAssignID *getAssignID() const { return cast<DIAssignID>(getRawAssignID()); }
431
  Metadata *getRawAddressExpression() const {
432
    return cast<MetadataAsValue>(getArgOperand(OpAddressExpr))->getMetadata();
433
  }
434
  DIExpression *getAddressExpression() const {
435
    return cast<DIExpression>(getRawAddressExpression());
436
  }
437
  void setAddressExpression(DIExpression *NewExpr) {
438
    setArgOperand(OpAddressExpr,
439
                  MetadataAsValue::get(NewExpr->getContext(), NewExpr));
440
  }
441
  void setAssignId(DIAssignID *New);
442
  void setAddress(Value *V);
443
  /// Kill the address component.
444
  void setKillAddress();
445
  /// Check whether this kills the address component. This doesn't take into
446
  /// account the position of the intrinsic, therefore a returned value of false
447
  /// does not guarentee the address is a valid location for the variable at the
448
  /// intrinsic's position in IR.
449
  bool isKillAddress() const;
450
  void setValue(Value *V);
451
  /// \name Casting methods
452
  /// @{
453
  static bool classof(const IntrinsicInst *I) {
454
    return I->getIntrinsicID() == Intrinsic::dbg_assign;
455
  }
456
  static bool classof(const Value *V) {
457
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
458
  }
459
  /// @}
460
};
461
 
462
/// This represents the llvm.dbg.label instruction.
463
class DbgLabelInst : public DbgInfoIntrinsic {
464
public:
465
  DILabel *getLabel() const { return cast<DILabel>(getRawLabel()); }
466
 
467
  Metadata *getRawLabel() const {
468
    return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
469
  }
470
 
471
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
472
  /// @{
473
  static bool classof(const IntrinsicInst *I) {
474
    return I->getIntrinsicID() == Intrinsic::dbg_label;
475
  }
476
  static bool classof(const Value *V) {
477
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
478
  }
479
  /// @}
480
};
481
 
482
/// This is the common base class for vector predication intrinsics.
483
class VPIntrinsic : public IntrinsicInst {
484
public:
485
  /// \brief Declares a llvm.vp.* intrinsic in \p M that matches the parameters
486
  /// \p Params. Additionally, the load and gather intrinsics require
487
  /// \p ReturnType to be specified.
488
  static Function *getDeclarationForParams(Module *M, Intrinsic::ID,
489
                                           Type *ReturnType,
490
                                           ArrayRef<Value *> Params);
491
 
492
  static std::optional<unsigned> getMaskParamPos(Intrinsic::ID IntrinsicID);
493
  static std::optional<unsigned> getVectorLengthParamPos(
494
      Intrinsic::ID IntrinsicID);
495
 
496
  /// The llvm.vp.* intrinsics for this instruction Opcode
497
  static Intrinsic::ID getForOpcode(unsigned OC);
498
 
499
  // Whether \p ID is a VP intrinsic ID.
500
  static bool isVPIntrinsic(Intrinsic::ID);
501
 
502
  /// \return The mask parameter or nullptr.
503
  Value *getMaskParam() const;
504
  void setMaskParam(Value *);
505
 
506
  /// \return The vector length parameter or nullptr.
507
  Value *getVectorLengthParam() const;
508
  void setVectorLengthParam(Value *);
509
 
510
  /// \return Whether the vector length param can be ignored.
511
  bool canIgnoreVectorLengthParam() const;
512
 
513
  /// \return The static element count (vector number of elements) the vector
514
  /// length parameter applies to.
515
  ElementCount getStaticVectorLength() const;
516
 
517
  /// \return The alignment of the pointer used by this load/store/gather or
518
  /// scatter.
519
  MaybeAlign getPointerAlignment() const;
520
  // MaybeAlign setPointerAlignment(Align NewAlign); // TODO
521
 
522
  /// \return The pointer operand of this load,store, gather or scatter.
523
  Value *getMemoryPointerParam() const;
524
  static std::optional<unsigned> getMemoryPointerParamPos(Intrinsic::ID);
525
 
526
  /// \return The data (payload) operand of this store or scatter.
527
  Value *getMemoryDataParam() const;
528
  static std::optional<unsigned> getMemoryDataParamPos(Intrinsic::ID);
529
 
530
  // Methods for support type inquiry through isa, cast, and dyn_cast:
531
  static bool classof(const IntrinsicInst *I) {
532
    return isVPIntrinsic(I->getIntrinsicID());
533
  }
534
  static bool classof(const Value *V) {
535
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
536
  }
537
 
538
  // Equivalent non-predicated opcode
539
  std::optional<unsigned> getFunctionalOpcode() const {
540
    return getFunctionalOpcodeForVP(getIntrinsicID());
541
  }
542
 
543
  // Equivalent non-predicated opcode
544
  static std::optional<unsigned> getFunctionalOpcodeForVP(Intrinsic::ID ID);
545
};
546
 
547
/// This represents vector predication reduction intrinsics.
548
class VPReductionIntrinsic : public VPIntrinsic {
549
public:
550
  static bool isVPReduction(Intrinsic::ID ID);
551
 
552
  unsigned getStartParamPos() const;
553
  unsigned getVectorParamPos() const;
554
 
555
  static std::optional<unsigned> getStartParamPos(Intrinsic::ID ID);
556
  static std::optional<unsigned> getVectorParamPos(Intrinsic::ID ID);
557
 
558
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
559
  /// @{
560
  static bool classof(const IntrinsicInst *I) {
561
    return VPReductionIntrinsic::isVPReduction(I->getIntrinsicID());
562
  }
563
  static bool classof(const Value *V) {
564
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
565
  }
566
  /// @}
567
};
568
 
569
class VPCastIntrinsic : public VPIntrinsic {
570
public:
571
  static bool isVPCast(Intrinsic::ID ID);
572
 
573
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
574
  /// @{
575
  static bool classof(const IntrinsicInst *I) {
576
    return VPCastIntrinsic::isVPCast(I->getIntrinsicID());
577
  }
578
  static bool classof(const Value *V) {
579
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
580
  }
581
  /// @}
582
};
583
 
584
class VPCmpIntrinsic : public VPIntrinsic {
585
public:
586
  static bool isVPCmp(Intrinsic::ID ID);
587
 
588
  CmpInst::Predicate getPredicate() const;
589
 
590
  /// Methods for support type inquiry through isa, cast, and dyn_cast:
591
  /// @{
592
  static bool classof(const IntrinsicInst *I) {
593
    return VPCmpIntrinsic::isVPCmp(I->getIntrinsicID());
594
  }
595
  static bool classof(const Value *V) {
596
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
597
  }
598
  /// @}
599
};
600
 
601
/// This is the common base class for constrained floating point intrinsics.
602
class ConstrainedFPIntrinsic : public IntrinsicInst {
603
public:
604
  bool isUnaryOp() const;
605
  bool isTernaryOp() const;
606
  std::optional<RoundingMode> getRoundingMode() const;
607
  std::optional<fp::ExceptionBehavior> getExceptionBehavior() const;
608
  bool isDefaultFPEnvironment() const;
609
 
610
  // Methods for support type inquiry through isa, cast, and dyn_cast:
611
  static bool classof(const IntrinsicInst *I);
612
  static bool classof(const Value *V) {
613
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
614
  }
615
};
616
 
617
/// Constrained floating point compare intrinsics.
618
class ConstrainedFPCmpIntrinsic : public ConstrainedFPIntrinsic {
619
public:
620
  FCmpInst::Predicate getPredicate() const;
621
  bool isSignaling() const {
622
    return getIntrinsicID() == Intrinsic::experimental_constrained_fcmps;
623
  }
624
 
625
  // Methods for support type inquiry through isa, cast, and dyn_cast:
626
  static bool classof(const IntrinsicInst *I) {
627
    switch (I->getIntrinsicID()) {
628
    case Intrinsic::experimental_constrained_fcmp:
629
    case Intrinsic::experimental_constrained_fcmps:
630
      return true;
631
    default:
632
      return false;
633
    }
634
  }
635
  static bool classof(const Value *V) {
636
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
637
  }
638
};
639
 
640
/// This class represents min/max intrinsics.
641
class MinMaxIntrinsic : public IntrinsicInst {
642
public:
643
  static bool classof(const IntrinsicInst *I) {
644
    switch (I->getIntrinsicID()) {
645
    case Intrinsic::umin:
646
    case Intrinsic::umax:
647
    case Intrinsic::smin:
648
    case Intrinsic::smax:
649
      return true;
650
    default:
651
      return false;
652
    }
653
  }
654
  static bool classof(const Value *V) {
655
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
656
  }
657
 
658
  Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
659
  Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
660
 
661
  /// Returns the comparison predicate underlying the intrinsic.
662
  static ICmpInst::Predicate getPredicate(Intrinsic::ID ID) {
663
    switch (ID) {
664
    case Intrinsic::umin:
665
      return ICmpInst::Predicate::ICMP_ULT;
666
    case Intrinsic::umax:
667
      return ICmpInst::Predicate::ICMP_UGT;
668
    case Intrinsic::smin:
669
      return ICmpInst::Predicate::ICMP_SLT;
670
    case Intrinsic::smax:
671
      return ICmpInst::Predicate::ICMP_SGT;
672
    default:
673
      llvm_unreachable("Invalid intrinsic");
674
    }
675
  }
676
 
677
  /// Returns the comparison predicate underlying the intrinsic.
678
  ICmpInst::Predicate getPredicate() const {
679
    return getPredicate(getIntrinsicID());
680
  }
681
 
682
  /// Whether the intrinsic is signed or unsigned.
683
  static bool isSigned(Intrinsic::ID ID) {
684
    return ICmpInst::isSigned(getPredicate(ID));
685
  };
686
 
687
  /// Whether the intrinsic is signed or unsigned.
688
  bool isSigned() const { return isSigned(getIntrinsicID()); };
689
 
690
  /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
691
  /// so there is a certain threshold value, upon reaching which,
692
  /// their value can no longer change. Return said threshold.
693
  static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits) {
694
    switch (ID) {
695
    case Intrinsic::umin:
696
      return APInt::getMinValue(numBits);
697
    case Intrinsic::umax:
698
      return APInt::getMaxValue(numBits);
699
    case Intrinsic::smin:
700
      return APInt::getSignedMinValue(numBits);
701
    case Intrinsic::smax:
702
      return APInt::getSignedMaxValue(numBits);
703
    default:
704
      llvm_unreachable("Invalid intrinsic");
705
    }
706
  }
707
 
708
  /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
709
  /// so there is a certain threshold value, upon reaching which,
710
  /// their value can no longer change. Return said threshold.
711
  APInt getSaturationPoint(unsigned numBits) const {
712
    return getSaturationPoint(getIntrinsicID(), numBits);
713
  }
714
 
715
  /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
716
  /// so there is a certain threshold value, upon reaching which,
717
  /// their value can no longer change. Return said threshold.
718
  static Constant *getSaturationPoint(Intrinsic::ID ID, Type *Ty) {
719
    return Constant::getIntegerValue(
720
        Ty, getSaturationPoint(ID, Ty->getScalarSizeInBits()));
721
  }
722
 
723
  /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
724
  /// so there is a certain threshold value, upon reaching which,
725
  /// their value can no longer change. Return said threshold.
726
  Constant *getSaturationPoint(Type *Ty) const {
727
    return getSaturationPoint(getIntrinsicID(), Ty);
728
  }
729
};
730
 
731
/// This class represents an intrinsic that is based on a binary operation.
732
/// This includes op.with.overflow and saturating add/sub intrinsics.
733
class BinaryOpIntrinsic : public IntrinsicInst {
734
public:
735
  static bool classof(const IntrinsicInst *I) {
736
    switch (I->getIntrinsicID()) {
737
    case Intrinsic::uadd_with_overflow:
738
    case Intrinsic::sadd_with_overflow:
739
    case Intrinsic::usub_with_overflow:
740
    case Intrinsic::ssub_with_overflow:
741
    case Intrinsic::umul_with_overflow:
742
    case Intrinsic::smul_with_overflow:
743
    case Intrinsic::uadd_sat:
744
    case Intrinsic::sadd_sat:
745
    case Intrinsic::usub_sat:
746
    case Intrinsic::ssub_sat:
747
      return true;
748
    default:
749
      return false;
750
    }
751
  }
752
  static bool classof(const Value *V) {
753
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
754
  }
755
 
756
  Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
757
  Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
758
 
759
  /// Returns the binary operation underlying the intrinsic.
760
  Instruction::BinaryOps getBinaryOp() const;
761
 
762
  /// Whether the intrinsic is signed or unsigned.
763
  bool isSigned() const;
764
 
765
  /// Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
766
  unsigned getNoWrapKind() const;
767
};
768
 
769
/// Represents an op.with.overflow intrinsic.
770
class WithOverflowInst : public BinaryOpIntrinsic {
771
public:
772
  static bool classof(const IntrinsicInst *I) {
773
    switch (I->getIntrinsicID()) {
774
    case Intrinsic::uadd_with_overflow:
775
    case Intrinsic::sadd_with_overflow:
776
    case Intrinsic::usub_with_overflow:
777
    case Intrinsic::ssub_with_overflow:
778
    case Intrinsic::umul_with_overflow:
779
    case Intrinsic::smul_with_overflow:
780
      return true;
781
    default:
782
      return false;
783
    }
784
  }
785
  static bool classof(const Value *V) {
786
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
787
  }
788
};
789
 
790
/// Represents a saturating add/sub intrinsic.
791
class SaturatingInst : public BinaryOpIntrinsic {
792
public:
793
  static bool classof(const IntrinsicInst *I) {
794
    switch (I->getIntrinsicID()) {
795
    case Intrinsic::uadd_sat:
796
    case Intrinsic::sadd_sat:
797
    case Intrinsic::usub_sat:
798
    case Intrinsic::ssub_sat:
799
      return true;
800
    default:
801
      return false;
802
    }
803
  }
804
  static bool classof(const Value *V) {
805
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
806
  }
807
};
808
 
809
/// Common base class for all memory intrinsics. Simply provides
810
/// common methods.
811
/// Written as CRTP to avoid a common base class amongst the
812
/// three atomicity hierarchies.
813
template <typename Derived> class MemIntrinsicBase : public IntrinsicInst {
814
private:
815
  enum { ARG_DEST = 0, ARG_LENGTH = 2 };
816
 
817
public:
818
  Value *getRawDest() const {
819
    return const_cast<Value *>(getArgOperand(ARG_DEST));
820
  }
821
  const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
822
  Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
823
 
824
  Value *getLength() const {
825
    return const_cast<Value *>(getArgOperand(ARG_LENGTH));
826
  }
827
  const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
828
  Use &getLengthUse() { return getArgOperandUse(ARG_LENGTH); }
829
 
830
  /// This is just like getRawDest, but it strips off any cast
831
  /// instructions (including addrspacecast) that feed it, giving the
832
  /// original input.  The returned value is guaranteed to be a pointer.
833
  Value *getDest() const { return getRawDest()->stripPointerCasts(); }
834
 
835
  unsigned getDestAddressSpace() const {
836
    return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
837
  }
838
 
839
  /// FIXME: Remove this function once transition to Align is over.
840
  /// Use getDestAlign() instead.
841
  LLVM_DEPRECATED("Use getDestAlign() instead", "getDestAlign")
842
  unsigned getDestAlignment() const {
843
    if (auto MA = getParamAlign(ARG_DEST))
844
      return MA->value();
845
    return 0;
846
  }
847
  MaybeAlign getDestAlign() const { return getParamAlign(ARG_DEST); }
848
 
849
  /// Set the specified arguments of the instruction.
850
  void setDest(Value *Ptr) {
851
    assert(getRawDest()->getType() == Ptr->getType() &&
852
           "setDest called with pointer of wrong type!");
853
    setArgOperand(ARG_DEST, Ptr);
854
  }
855
 
856
  void setDestAlignment(MaybeAlign Alignment) {
857
    removeParamAttr(ARG_DEST, Attribute::Alignment);
858
    if (Alignment)
859
      addParamAttr(ARG_DEST,
860
                   Attribute::getWithAlignment(getContext(), *Alignment));
861
  }
862
  void setDestAlignment(Align Alignment) {
863
    removeParamAttr(ARG_DEST, Attribute::Alignment);
864
    addParamAttr(ARG_DEST,
865
                 Attribute::getWithAlignment(getContext(), Alignment));
866
  }
867
 
868
  void setLength(Value *L) {
869
    assert(getLength()->getType() == L->getType() &&
870
           "setLength called with value of wrong type!");
871
    setArgOperand(ARG_LENGTH, L);
872
  }
873
};
874
 
875
/// Common base class for all memory transfer intrinsics. Simply provides
876
/// common methods.
877
template <class BaseCL> class MemTransferBase : public BaseCL {
878
private:
879
  enum { ARG_SOURCE = 1 };
880
 
881
public:
882
  /// Return the arguments to the instruction.
883
  Value *getRawSource() const {
884
    return const_cast<Value *>(BaseCL::getArgOperand(ARG_SOURCE));
885
  }
886
  const Use &getRawSourceUse() const {
887
    return BaseCL::getArgOperandUse(ARG_SOURCE);
888
  }
889
  Use &getRawSourceUse() { return BaseCL::getArgOperandUse(ARG_SOURCE); }
890
 
891
  /// This is just like getRawSource, but it strips off any cast
892
  /// instructions that feed it, giving the original input.  The returned
893
  /// value is guaranteed to be a pointer.
894
  Value *getSource() const { return getRawSource()->stripPointerCasts(); }
895
 
896
  unsigned getSourceAddressSpace() const {
897
    return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
898
  }
899
 
900
  /// FIXME: Remove this function once transition to Align is over.
901
  /// Use getSourceAlign() instead.
902
  LLVM_DEPRECATED("Use getSourceAlign() instead", "getSourceAlign")
903
  unsigned getSourceAlignment() const {
904
    if (auto MA = BaseCL::getParamAlign(ARG_SOURCE))
905
      return MA->value();
906
    return 0;
907
  }
908
 
909
  MaybeAlign getSourceAlign() const {
910
    return BaseCL::getParamAlign(ARG_SOURCE);
911
  }
912
 
913
  void setSource(Value *Ptr) {
914
    assert(getRawSource()->getType() == Ptr->getType() &&
915
           "setSource called with pointer of wrong type!");
916
    BaseCL::setArgOperand(ARG_SOURCE, Ptr);
917
  }
918
 
919
  void setSourceAlignment(MaybeAlign Alignment) {
920
    BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
921
    if (Alignment)
922
      BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
923
                                           BaseCL::getContext(), *Alignment));
924
  }
925
 
926
  void setSourceAlignment(Align Alignment) {
927
    BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
928
    BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
929
                                         BaseCL::getContext(), Alignment));
930
  }
931
};
932
 
933
/// Common base class for all memset intrinsics. Simply provides
934
/// common methods.
935
template <class BaseCL> class MemSetBase : public BaseCL {
936
private:
937
  enum { ARG_VALUE = 1 };
938
 
939
public:
940
  Value *getValue() const {
941
    return const_cast<Value *>(BaseCL::getArgOperand(ARG_VALUE));
942
  }
943
  const Use &getValueUse() const { return BaseCL::getArgOperandUse(ARG_VALUE); }
944
  Use &getValueUse() { return BaseCL::getArgOperandUse(ARG_VALUE); }
945
 
946
  void setValue(Value *Val) {
947
    assert(getValue()->getType() == Val->getType() &&
948
           "setValue called with value of wrong type!");
949
    BaseCL::setArgOperand(ARG_VALUE, Val);
950
  }
951
};
952
 
953
// The common base class for the atomic memset/memmove/memcpy intrinsics
954
// i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
955
class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> {
956
private:
957
  enum { ARG_ELEMENTSIZE = 3 };
958
 
959
public:
960
  Value *getRawElementSizeInBytes() const {
961
    return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
962
  }
963
 
964
  ConstantInt *getElementSizeInBytesCst() const {
965
    return cast<ConstantInt>(getRawElementSizeInBytes());
966
  }
967
 
968
  uint32_t getElementSizeInBytes() const {
969
    return getElementSizeInBytesCst()->getZExtValue();
970
  }
971
 
972
  void setElementSizeInBytes(Constant *V) {
973
    assert(V->getType() == Type::getInt8Ty(getContext()) &&
974
           "setElementSizeInBytes called with value of wrong type!");
975
    setArgOperand(ARG_ELEMENTSIZE, V);
976
  }
977
 
978
  static bool classof(const IntrinsicInst *I) {
979
    switch (I->getIntrinsicID()) {
980
    case Intrinsic::memcpy_element_unordered_atomic:
981
    case Intrinsic::memmove_element_unordered_atomic:
982
    case Intrinsic::memset_element_unordered_atomic:
983
      return true;
984
    default:
985
      return false;
986
    }
987
  }
988
  static bool classof(const Value *V) {
989
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
990
  }
991
};
992
 
993
/// This class represents atomic memset intrinsic
994
// i.e. llvm.element.unordered.atomic.memset
995
class AtomicMemSetInst : public MemSetBase<AtomicMemIntrinsic> {
996
public:
997
  static bool classof(const IntrinsicInst *I) {
998
    return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
999
  }
1000
  static bool classof(const Value *V) {
1001
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1002
  }
1003
};
1004
 
1005
// This class wraps the atomic memcpy/memmove intrinsics
1006
// i.e. llvm.element.unordered.atomic.memcpy/memmove
1007
class AtomicMemTransferInst : public MemTransferBase<AtomicMemIntrinsic> {
1008
public:
1009
  static bool classof(const IntrinsicInst *I) {
1010
    switch (I->getIntrinsicID()) {
1011
    case Intrinsic::memcpy_element_unordered_atomic:
1012
    case Intrinsic::memmove_element_unordered_atomic:
1013
      return true;
1014
    default:
1015
      return false;
1016
    }
1017
  }
1018
  static bool classof(const Value *V) {
1019
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1020
  }
1021
};
1022
 
1023
/// This class represents the atomic memcpy intrinsic
1024
/// i.e. llvm.element.unordered.atomic.memcpy
1025
class AtomicMemCpyInst : public AtomicMemTransferInst {
1026
public:
1027
  static bool classof(const IntrinsicInst *I) {
1028
    return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
1029
  }
1030
  static bool classof(const Value *V) {
1031
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1032
  }
1033
};
1034
 
1035
/// This class represents the atomic memmove intrinsic
1036
/// i.e. llvm.element.unordered.atomic.memmove
1037
class AtomicMemMoveInst : public AtomicMemTransferInst {
1038
public:
1039
  static bool classof(const IntrinsicInst *I) {
1040
    return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
1041
  }
1042
  static bool classof(const Value *V) {
1043
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1044
  }
1045
};
1046
 
1047
/// This is the common base class for memset/memcpy/memmove.
1048
class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
1049
private:
1050
  enum { ARG_VOLATILE = 3 };
1051
 
1052
public:
1053
  ConstantInt *getVolatileCst() const {
1054
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
1055
  }
1056
 
1057
  bool isVolatile() const { return !getVolatileCst()->isZero(); }
1058
 
1059
  void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
1060
 
1061
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1062
  static bool classof(const IntrinsicInst *I) {
1063
    switch (I->getIntrinsicID()) {
1064
    case Intrinsic::memcpy:
1065
    case Intrinsic::memmove:
1066
    case Intrinsic::memset:
1067
    case Intrinsic::memset_inline:
1068
    case Intrinsic::memcpy_inline:
1069
      return true;
1070
    default:
1071
      return false;
1072
    }
1073
  }
1074
  static bool classof(const Value *V) {
1075
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1076
  }
1077
};
1078
 
1079
/// This class wraps the llvm.memset and llvm.memset.inline intrinsics.
1080
class MemSetInst : public MemSetBase<MemIntrinsic> {
1081
public:
1082
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1083
  static bool classof(const IntrinsicInst *I) {
1084
    switch (I->getIntrinsicID()) {
1085
    case Intrinsic::memset:
1086
    case Intrinsic::memset_inline:
1087
      return true;
1088
    default:
1089
      return false;
1090
    }
1091
  }
1092
  static bool classof(const Value *V) {
1093
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1094
  }
1095
};
1096
 
1097
/// This class wraps the llvm.memset.inline intrinsic.
1098
class MemSetInlineInst : public MemSetInst {
1099
public:
1100
  ConstantInt *getLength() const {
1101
    return cast<ConstantInt>(MemSetInst::getLength());
1102
  }
1103
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1104
  static bool classof(const IntrinsicInst *I) {
1105
    return I->getIntrinsicID() == Intrinsic::memset_inline;
1106
  }
1107
  static bool classof(const Value *V) {
1108
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1109
  }
1110
};
1111
 
1112
/// This class wraps the llvm.memcpy/memmove intrinsics.
1113
class MemTransferInst : public MemTransferBase<MemIntrinsic> {
1114
public:
1115
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1116
  static bool classof(const IntrinsicInst *I) {
1117
    switch (I->getIntrinsicID()) {
1118
    case Intrinsic::memcpy:
1119
    case Intrinsic::memmove:
1120
    case Intrinsic::memcpy_inline:
1121
      return true;
1122
    default:
1123
      return false;
1124
    }
1125
  }
1126
  static bool classof(const Value *V) {
1127
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1128
  }
1129
};
1130
 
1131
/// This class wraps the llvm.memcpy intrinsic.
1132
class MemCpyInst : public MemTransferInst {
1133
public:
1134
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1135
  static bool classof(const IntrinsicInst *I) {
1136
    return I->getIntrinsicID() == Intrinsic::memcpy ||
1137
           I->getIntrinsicID() == Intrinsic::memcpy_inline;
1138
  }
1139
  static bool classof(const Value *V) {
1140
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1141
  }
1142
};
1143
 
1144
/// This class wraps the llvm.memmove intrinsic.
1145
class MemMoveInst : public MemTransferInst {
1146
public:
1147
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1148
  static bool classof(const IntrinsicInst *I) {
1149
    return I->getIntrinsicID() == Intrinsic::memmove;
1150
  }
1151
  static bool classof(const Value *V) {
1152
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1153
  }
1154
};
1155
 
1156
/// This class wraps the llvm.memcpy.inline intrinsic.
1157
class MemCpyInlineInst : public MemCpyInst {
1158
public:
1159
  ConstantInt *getLength() const {
1160
    return cast<ConstantInt>(MemCpyInst::getLength());
1161
  }
1162
  // Methods for support type inquiry through isa, cast, and dyn_cast:
1163
  static bool classof(const IntrinsicInst *I) {
1164
    return I->getIntrinsicID() == Intrinsic::memcpy_inline;
1165
  }
1166
  static bool classof(const Value *V) {
1167
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1168
  }
1169
};
1170
 
1171
// The common base class for any memset/memmove/memcpy intrinsics;
1172
// whether they be atomic or non-atomic.
1173
// i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
1174
//  and llvm.memset/memcpy/memmove
1175
class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
1176
public:
1177
  bool isVolatile() const {
1178
    // Only the non-atomic intrinsics can be volatile
1179
    if (auto *MI = dyn_cast<MemIntrinsic>(this))
1180
      return MI->isVolatile();
1181
    return false;
1182
  }
1183
 
1184
  static bool classof(const IntrinsicInst *I) {
1185
    switch (I->getIntrinsicID()) {
1186
    case Intrinsic::memcpy:
1187
    case Intrinsic::memcpy_inline:
1188
    case Intrinsic::memmove:
1189
    case Intrinsic::memset:
1190
    case Intrinsic::memset_inline:
1191
    case Intrinsic::memcpy_element_unordered_atomic:
1192
    case Intrinsic::memmove_element_unordered_atomic:
1193
    case Intrinsic::memset_element_unordered_atomic:
1194
      return true;
1195
    default:
1196
      return false;
1197
    }
1198
  }
1199
  static bool classof(const Value *V) {
1200
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1201
  }
1202
};
1203
 
1204
/// This class represents any memset intrinsic
1205
// i.e. llvm.element.unordered.atomic.memset
1206
// and  llvm.memset
1207
class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> {
1208
public:
1209
  static bool classof(const IntrinsicInst *I) {
1210
    switch (I->getIntrinsicID()) {
1211
    case Intrinsic::memset:
1212
    case Intrinsic::memset_inline:
1213
    case Intrinsic::memset_element_unordered_atomic:
1214
      return true;
1215
    default:
1216
      return false;
1217
    }
1218
  }
1219
  static bool classof(const Value *V) {
1220
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1221
  }
1222
};
1223
 
1224
// This class wraps any memcpy/memmove intrinsics
1225
// i.e. llvm.element.unordered.atomic.memcpy/memmove
1226
// and  llvm.memcpy/memmove
1227
class AnyMemTransferInst : public MemTransferBase<AnyMemIntrinsic> {
1228
public:
1229
  static bool classof(const IntrinsicInst *I) {
1230
    switch (I->getIntrinsicID()) {
1231
    case Intrinsic::memcpy:
1232
    case Intrinsic::memcpy_inline:
1233
    case Intrinsic::memmove:
1234
    case Intrinsic::memcpy_element_unordered_atomic:
1235
    case Intrinsic::memmove_element_unordered_atomic:
1236
      return true;
1237
    default:
1238
      return false;
1239
    }
1240
  }
1241
  static bool classof(const Value *V) {
1242
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1243
  }
1244
};
1245
 
1246
/// This class represents any memcpy intrinsic
1247
/// i.e. llvm.element.unordered.atomic.memcpy
1248
///  and llvm.memcpy
1249
class AnyMemCpyInst : public AnyMemTransferInst {
1250
public:
1251
  static bool classof(const IntrinsicInst *I) {
1252
    switch (I->getIntrinsicID()) {
1253
    case Intrinsic::memcpy:
1254
    case Intrinsic::memcpy_inline:
1255
    case Intrinsic::memcpy_element_unordered_atomic:
1256
      return true;
1257
    default:
1258
      return false;
1259
    }
1260
  }
1261
  static bool classof(const Value *V) {
1262
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1263
  }
1264
};
1265
 
1266
/// This class represents any memmove intrinsic
1267
/// i.e. llvm.element.unordered.atomic.memmove
1268
///  and llvm.memmove
1269
class AnyMemMoveInst : public AnyMemTransferInst {
1270
public:
1271
  static bool classof(const IntrinsicInst *I) {
1272
    switch (I->getIntrinsicID()) {
1273
    case Intrinsic::memmove:
1274
    case Intrinsic::memmove_element_unordered_atomic:
1275
      return true;
1276
    default:
1277
      return false;
1278
    }
1279
  }
1280
  static bool classof(const Value *V) {
1281
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1282
  }
1283
};
1284
 
1285
/// This represents the llvm.va_start intrinsic.
1286
class VAStartInst : public IntrinsicInst {
1287
public:
1288
  static bool classof(const IntrinsicInst *I) {
1289
    return I->getIntrinsicID() == Intrinsic::vastart;
1290
  }
1291
  static bool classof(const Value *V) {
1292
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1293
  }
1294
 
1295
  Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
1296
};
1297
 
1298
/// This represents the llvm.va_end intrinsic.
1299
class VAEndInst : public IntrinsicInst {
1300
public:
1301
  static bool classof(const IntrinsicInst *I) {
1302
    return I->getIntrinsicID() == Intrinsic::vaend;
1303
  }
1304
  static bool classof(const Value *V) {
1305
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1306
  }
1307
 
1308
  Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
1309
};
1310
 
1311
/// This represents the llvm.va_copy intrinsic.
1312
class VACopyInst : public IntrinsicInst {
1313
public:
1314
  static bool classof(const IntrinsicInst *I) {
1315
    return I->getIntrinsicID() == Intrinsic::vacopy;
1316
  }
1317
  static bool classof(const Value *V) {
1318
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1319
  }
1320
 
1321
  Value *getDest() const { return const_cast<Value *>(getArgOperand(0)); }
1322
  Value *getSrc() const { return const_cast<Value *>(getArgOperand(1)); }
1323
};
1324
 
1325
/// A base class for all instrprof intrinsics.
1326
class InstrProfInstBase : public IntrinsicInst {
1327
public:
1328
  // The name of the instrumented function.
1329
  GlobalVariable *getName() const {
1330
    return cast<GlobalVariable>(
1331
        const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
1332
  }
1333
  // The hash of the CFG for the instrumented function.
1334
  ConstantInt *getHash() const {
1335
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1336
  }
1337
  // The number of counters for the instrumented function.
1338
  ConstantInt *getNumCounters() const;
1339
  // The index of the counter that this instruction acts on.
1340
  ConstantInt *getIndex() const;
1341
};
1342
 
1343
/// This represents the llvm.instrprof.cover intrinsic.
1344
class InstrProfCoverInst : public InstrProfInstBase {
1345
public:
1346
  static bool classof(const IntrinsicInst *I) {
1347
    return I->getIntrinsicID() == Intrinsic::instrprof_cover;
1348
  }
1349
  static bool classof(const Value *V) {
1350
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1351
  }
1352
};
1353
 
1354
/// This represents the llvm.instrprof.increment intrinsic.
1355
class InstrProfIncrementInst : public InstrProfInstBase {
1356
public:
1357
  static bool classof(const IntrinsicInst *I) {
1358
    return I->getIntrinsicID() == Intrinsic::instrprof_increment ||
1359
           I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1360
  }
1361
  static bool classof(const Value *V) {
1362
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1363
  }
1364
  Value *getStep() const;
1365
};
1366
 
1367
/// This represents the llvm.instrprof.increment.step intrinsic.
1368
class InstrProfIncrementInstStep : public InstrProfIncrementInst {
1369
public:
1370
  static bool classof(const IntrinsicInst *I) {
1371
    return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1372
  }
1373
  static bool classof(const Value *V) {
1374
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1375
  }
1376
};
1377
 
1378
/// This represents the llvm.instrprof.value.profile intrinsic.
1379
class InstrProfValueProfileInst : public InstrProfInstBase {
1380
public:
1381
  static bool classof(const IntrinsicInst *I) {
1382
    return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
1383
  }
1384
  static bool classof(const Value *V) {
1385
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1386
  }
1387
 
1388
  Value *getTargetValue() const {
1389
    return cast<Value>(const_cast<Value *>(getArgOperand(2)));
1390
  }
1391
 
1392
  ConstantInt *getValueKind() const {
1393
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1394
  }
1395
 
1396
  // Returns the value site index.
1397
  ConstantInt *getIndex() const {
1398
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
1399
  }
1400
};
1401
 
1402
class PseudoProbeInst : public IntrinsicInst {
1403
public:
1404
  static bool classof(const IntrinsicInst *I) {
1405
    return I->getIntrinsicID() == Intrinsic::pseudoprobe;
1406
  }
1407
 
1408
  static bool classof(const Value *V) {
1409
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1410
  }
1411
 
1412
  ConstantInt *getFuncGuid() const {
1413
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(0)));
1414
  }
1415
 
1416
  ConstantInt *getIndex() const {
1417
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1418
  }
1419
 
1420
  ConstantInt *getAttributes() const {
1421
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
1422
  }
1423
 
1424
  ConstantInt *getFactor() const {
1425
    return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1426
  }
1427
};
1428
 
1429
class NoAliasScopeDeclInst : public IntrinsicInst {
1430
public:
1431
  static bool classof(const IntrinsicInst *I) {
1432
    return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl;
1433
  }
1434
 
1435
  static bool classof(const Value *V) {
1436
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1437
  }
1438
 
1439
  MDNode *getScopeList() const {
1440
    auto *MV =
1441
        cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
1442
    return cast<MDNode>(MV->getMetadata());
1443
  }
1444
 
1445
  void setScopeList(MDNode *ScopeList) {
1446
    setOperand(Intrinsic::NoAliasScopeDeclScopeArg,
1447
               MetadataAsValue::get(getContext(), ScopeList));
1448
  }
1449
};
1450
 
1451
/// Common base class for representing values projected from a statepoint.
1452
/// Currently, the only projections available are gc.result and gc.relocate.
1453
class GCProjectionInst : public IntrinsicInst {
1454
public:
1455
  static bool classof(const IntrinsicInst *I) {
1456
    return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate ||
1457
      I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1458
  }
1459
 
1460
  static bool classof(const Value *V) {
1461
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1462
  }
1463
 
1464
  /// Return true if this relocate is tied to the invoke statepoint.
1465
  /// This includes relocates which are on the unwinding path.
1466
  bool isTiedToInvoke() const {
1467
    const Value *Token = getArgOperand(0);
1468
 
1469
    return isa<LandingPadInst>(Token) || isa<InvokeInst>(Token);
1470
  }
1471
 
1472
  /// The statepoint with which this gc.relocate is associated.
1473
  const Value *getStatepoint() const;
1474
};
1475
 
1476
/// Represents calls to the gc.relocate intrinsic.
1477
class GCRelocateInst : public GCProjectionInst {
1478
public:
1479
  static bool classof(const IntrinsicInst *I) {
1480
    return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
1481
  }
1482
 
1483
  static bool classof(const Value *V) {
1484
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1485
  }
1486
 
1487
  /// The index into the associate statepoint's argument list
1488
  /// which contains the base pointer of the pointer whose
1489
  /// relocation this gc.relocate describes.
1490
  unsigned getBasePtrIndex() const {
1491
    return cast<ConstantInt>(getArgOperand(1))->getZExtValue();
1492
  }
1493
 
1494
  /// The index into the associate statepoint's argument list which
1495
  /// contains the pointer whose relocation this gc.relocate describes.
1496
  unsigned getDerivedPtrIndex() const {
1497
    return cast<ConstantInt>(getArgOperand(2))->getZExtValue();
1498
  }
1499
 
1500
  Value *getBasePtr() const;
1501
  Value *getDerivedPtr() const;
1502
};
1503
 
1504
/// Represents calls to the gc.result intrinsic.
1505
class GCResultInst : public GCProjectionInst {
1506
public:
1507
  static bool classof(const IntrinsicInst *I) {
1508
    return I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1509
  }
1510
 
1511
  static bool classof(const Value *V) {
1512
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1513
  }
1514
};
1515
 
1516
/// This represents intrinsics that guard a condition
1517
class CondGuardInst : public IntrinsicInst {
1518
public:
1519
  static bool classof(const IntrinsicInst *I) {
1520
    return I->getIntrinsicID() == Intrinsic::assume ||
1521
           I->getIntrinsicID() == Intrinsic::experimental_guard;
1522
  }
1523
  static bool classof(const Value *V) {
1524
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1525
  }
1526
};
1527
 
1528
/// This represents the llvm.assume intrinsic.
1529
class AssumeInst : public CondGuardInst {
1530
public:
1531
  static bool classof(const IntrinsicInst *I) {
1532
    return I->getIntrinsicID() == Intrinsic::assume;
1533
  }
1534
  static bool classof(const Value *V) {
1535
    return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1536
  }
1537
};
1538
 
1539
} // end namespace llvm
1540
 
1541
#endif // LLVM_IR_INTRINSICINST_H