]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/IR/Operator.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / IR / Operator.h
1 //===-- llvm/Operator.h - Operator utility subclass -------------*- 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 various classes for working with Instructions and
10 // ConstantExprs.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_IR_OPERATOR_H
15 #define LLVM_IR_OPERATOR_H
16
17 #include "llvm/ADT/None.h"
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/IR/Constants.h"
20 #include "llvm/IR/Instruction.h"
21 #include "llvm/IR/Type.h"
22 #include "llvm/IR/Value.h"
23 #include "llvm/Support/Casting.h"
24 #include <cstddef>
25
26 namespace llvm {
27
28 /// This is a utility class that provides an abstraction for the common
29 /// functionality between Instructions and ConstantExprs.
30 class Operator : public User {
31 public:
32   // The Operator class is intended to be used as a utility, and is never itself
33   // instantiated.
34   Operator() = delete;
35   ~Operator() = delete;
36
37   void *operator new(size_t s) = delete;
38
39   /// Return the opcode for this Instruction or ConstantExpr.
40   unsigned getOpcode() const {
41     if (const Instruction *I = dyn_cast<Instruction>(this))
42       return I->getOpcode();
43     return cast<ConstantExpr>(this)->getOpcode();
44   }
45
46   /// If V is an Instruction or ConstantExpr, return its opcode.
47   /// Otherwise return UserOp1.
48   static unsigned getOpcode(const Value *V) {
49     if (const Instruction *I = dyn_cast<Instruction>(V))
50       return I->getOpcode();
51     if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
52       return CE->getOpcode();
53     return Instruction::UserOp1;
54   }
55
56   static bool classof(const Instruction *) { return true; }
57   static bool classof(const ConstantExpr *) { return true; }
58   static bool classof(const Value *V) {
59     return isa<Instruction>(V) || isa<ConstantExpr>(V);
60   }
61 };
62
63 /// Utility class for integer operators which may exhibit overflow - Add, Sub,
64 /// Mul, and Shl. It does not include SDiv, despite that operator having the
65 /// potential for overflow.
66 class OverflowingBinaryOperator : public Operator {
67 public:
68   enum {
69     NoUnsignedWrap = (1 << 0),
70     NoSignedWrap   = (1 << 1)
71   };
72
73 private:
74   friend class Instruction;
75   friend class ConstantExpr;
76
77   void setHasNoUnsignedWrap(bool B) {
78     SubclassOptionalData =
79       (SubclassOptionalData & ~NoUnsignedWrap) | (B * NoUnsignedWrap);
80   }
81   void setHasNoSignedWrap(bool B) {
82     SubclassOptionalData =
83       (SubclassOptionalData & ~NoSignedWrap) | (B * NoSignedWrap);
84   }
85
86 public:
87   /// Test whether this operation is known to never
88   /// undergo unsigned overflow, aka the nuw property.
89   bool hasNoUnsignedWrap() const {
90     return SubclassOptionalData & NoUnsignedWrap;
91   }
92
93   /// Test whether this operation is known to never
94   /// undergo signed overflow, aka the nsw property.
95   bool hasNoSignedWrap() const {
96     return (SubclassOptionalData & NoSignedWrap) != 0;
97   }
98
99   static bool classof(const Instruction *I) {
100     return I->getOpcode() == Instruction::Add ||
101            I->getOpcode() == Instruction::Sub ||
102            I->getOpcode() == Instruction::Mul ||
103            I->getOpcode() == Instruction::Shl;
104   }
105   static bool classof(const ConstantExpr *CE) {
106     return CE->getOpcode() == Instruction::Add ||
107            CE->getOpcode() == Instruction::Sub ||
108            CE->getOpcode() == Instruction::Mul ||
109            CE->getOpcode() == Instruction::Shl;
110   }
111   static bool classof(const Value *V) {
112     return (isa<Instruction>(V) && classof(cast<Instruction>(V))) ||
113            (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V)));
114   }
115 };
116
117 /// A udiv or sdiv instruction, which can be marked as "exact",
118 /// indicating that no bits are destroyed.
119 class PossiblyExactOperator : public Operator {
120 public:
121   enum {
122     IsExact = (1 << 0)
123   };
124
125 private:
126   friend class Instruction;
127   friend class ConstantExpr;
128
129   void setIsExact(bool B) {
130     SubclassOptionalData = (SubclassOptionalData & ~IsExact) | (B * IsExact);
131   }
132
133 public:
134   /// Test whether this division is known to be exact, with zero remainder.
135   bool isExact() const {
136     return SubclassOptionalData & IsExact;
137   }
138
139   static bool isPossiblyExactOpcode(unsigned OpC) {
140     return OpC == Instruction::SDiv ||
141            OpC == Instruction::UDiv ||
142            OpC == Instruction::AShr ||
143            OpC == Instruction::LShr;
144   }
145
146   static bool classof(const ConstantExpr *CE) {
147     return isPossiblyExactOpcode(CE->getOpcode());
148   }
149   static bool classof(const Instruction *I) {
150     return isPossiblyExactOpcode(I->getOpcode());
151   }
152   static bool classof(const Value *V) {
153     return (isa<Instruction>(V) && classof(cast<Instruction>(V))) ||
154            (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V)));
155   }
156 };
157
158 /// Convenience struct for specifying and reasoning about fast-math flags.
159 class FastMathFlags {
160 private:
161   friend class FPMathOperator;
162
163   unsigned Flags = 0;
164
165   FastMathFlags(unsigned F) {
166     // If all 7 bits are set, turn this into -1. If the number of bits grows,
167     // this must be updated. This is intended to provide some forward binary
168     // compatibility insurance for the meaning of 'fast' in case bits are added.
169     if (F == 0x7F) Flags = ~0U;
170     else Flags = F;
171   }
172
173 public:
174   // This is how the bits are used in Value::SubclassOptionalData so they
175   // should fit there too.
176   // WARNING: We're out of space. SubclassOptionalData only has 7 bits. New
177   // functionality will require a change in how this information is stored.
178   enum {
179     AllowReassoc    = (1 << 0),
180     NoNaNs          = (1 << 1),
181     NoInfs          = (1 << 2),
182     NoSignedZeros   = (1 << 3),
183     AllowReciprocal = (1 << 4),
184     AllowContract   = (1 << 5),
185     ApproxFunc      = (1 << 6)
186   };
187
188   FastMathFlags() = default;
189
190   static FastMathFlags getFast() {
191     FastMathFlags FMF;
192     FMF.setFast();
193     return FMF;
194   }
195
196   bool any() const { return Flags != 0; }
197   bool none() const { return Flags == 0; }
198   bool all() const { return Flags == ~0U; }
199
200   void clear() { Flags = 0; }
201   void set()   { Flags = ~0U; }
202
203   /// Flag queries
204   bool allowReassoc() const    { return 0 != (Flags & AllowReassoc); }
205   bool noNaNs() const          { return 0 != (Flags & NoNaNs); }
206   bool noInfs() const          { return 0 != (Flags & NoInfs); }
207   bool noSignedZeros() const   { return 0 != (Flags & NoSignedZeros); }
208   bool allowReciprocal() const { return 0 != (Flags & AllowReciprocal); }
209   bool allowContract() const   { return 0 != (Flags & AllowContract); }
210   bool approxFunc() const      { return 0 != (Flags & ApproxFunc); }
211   /// 'Fast' means all bits are set.
212   bool isFast() const          { return all(); }
213
214   /// Flag setters
215   void setAllowReassoc(bool B = true) {
216     Flags = (Flags & ~AllowReassoc) | B * AllowReassoc;
217   }
218   void setNoNaNs(bool B = true) {
219     Flags = (Flags & ~NoNaNs) | B * NoNaNs;
220   }
221   void setNoInfs(bool B = true) {
222     Flags = (Flags & ~NoInfs) | B * NoInfs;
223   }
224   void setNoSignedZeros(bool B = true) {
225     Flags = (Flags & ~NoSignedZeros) | B * NoSignedZeros;
226   }
227   void setAllowReciprocal(bool B = true) {
228     Flags = (Flags & ~AllowReciprocal) | B * AllowReciprocal;
229   }
230   void setAllowContract(bool B = true) {
231     Flags = (Flags & ~AllowContract) | B * AllowContract;
232   }
233   void setApproxFunc(bool B = true) {
234     Flags = (Flags & ~ApproxFunc) | B * ApproxFunc;
235   }
236   void setFast(bool B = true) { B ? set() : clear(); }
237
238   void operator&=(const FastMathFlags &OtherFlags) {
239     Flags &= OtherFlags.Flags;
240   }
241 };
242
243 /// Utility class for floating point operations which can have
244 /// information about relaxed accuracy requirements attached to them.
245 class FPMathOperator : public Operator {
246 private:
247   friend class Instruction;
248
249   /// 'Fast' means all bits are set.
250   void setFast(bool B) {
251     setHasAllowReassoc(B);
252     setHasNoNaNs(B);
253     setHasNoInfs(B);
254     setHasNoSignedZeros(B);
255     setHasAllowReciprocal(B);
256     setHasAllowContract(B);
257     setHasApproxFunc(B);
258   }
259
260   void setHasAllowReassoc(bool B) {
261     SubclassOptionalData =
262     (SubclassOptionalData & ~FastMathFlags::AllowReassoc) |
263     (B * FastMathFlags::AllowReassoc);
264   }
265
266   void setHasNoNaNs(bool B) {
267     SubclassOptionalData =
268       (SubclassOptionalData & ~FastMathFlags::NoNaNs) |
269       (B * FastMathFlags::NoNaNs);
270   }
271
272   void setHasNoInfs(bool B) {
273     SubclassOptionalData =
274       (SubclassOptionalData & ~FastMathFlags::NoInfs) |
275       (B * FastMathFlags::NoInfs);
276   }
277
278   void setHasNoSignedZeros(bool B) {
279     SubclassOptionalData =
280       (SubclassOptionalData & ~FastMathFlags::NoSignedZeros) |
281       (B * FastMathFlags::NoSignedZeros);
282   }
283
284   void setHasAllowReciprocal(bool B) {
285     SubclassOptionalData =
286       (SubclassOptionalData & ~FastMathFlags::AllowReciprocal) |
287       (B * FastMathFlags::AllowReciprocal);
288   }
289
290   void setHasAllowContract(bool B) {
291     SubclassOptionalData =
292         (SubclassOptionalData & ~FastMathFlags::AllowContract) |
293         (B * FastMathFlags::AllowContract);
294   }
295
296   void setHasApproxFunc(bool B) {
297     SubclassOptionalData =
298         (SubclassOptionalData & ~FastMathFlags::ApproxFunc) |
299         (B * FastMathFlags::ApproxFunc);
300   }
301
302   /// Convenience function for setting multiple fast-math flags.
303   /// FMF is a mask of the bits to set.
304   void setFastMathFlags(FastMathFlags FMF) {
305     SubclassOptionalData |= FMF.Flags;
306   }
307
308   /// Convenience function for copying all fast-math flags.
309   /// All values in FMF are transferred to this operator.
310   void copyFastMathFlags(FastMathFlags FMF) {
311     SubclassOptionalData = FMF.Flags;
312   }
313
314 public:
315   /// Test if this operation allows all non-strict floating-point transforms.
316   bool isFast() const {
317     return ((SubclassOptionalData & FastMathFlags::AllowReassoc) != 0 &&
318             (SubclassOptionalData & FastMathFlags::NoNaNs) != 0 &&
319             (SubclassOptionalData & FastMathFlags::NoInfs) != 0 &&
320             (SubclassOptionalData & FastMathFlags::NoSignedZeros) != 0 &&
321             (SubclassOptionalData & FastMathFlags::AllowReciprocal) != 0 &&
322             (SubclassOptionalData & FastMathFlags::AllowContract) != 0 &&
323             (SubclassOptionalData & FastMathFlags::ApproxFunc) != 0);
324   }
325
326   /// Test if this operation may be simplified with reassociative transforms.
327   bool hasAllowReassoc() const {
328     return (SubclassOptionalData & FastMathFlags::AllowReassoc) != 0;
329   }
330
331   /// Test if this operation's arguments and results are assumed not-NaN.
332   bool hasNoNaNs() const {
333     return (SubclassOptionalData & FastMathFlags::NoNaNs) != 0;
334   }
335
336   /// Test if this operation's arguments and results are assumed not-infinite.
337   bool hasNoInfs() const {
338     return (SubclassOptionalData & FastMathFlags::NoInfs) != 0;
339   }
340
341   /// Test if this operation can ignore the sign of zero.
342   bool hasNoSignedZeros() const {
343     return (SubclassOptionalData & FastMathFlags::NoSignedZeros) != 0;
344   }
345
346   /// Test if this operation can use reciprocal multiply instead of division.
347   bool hasAllowReciprocal() const {
348     return (SubclassOptionalData & FastMathFlags::AllowReciprocal) != 0;
349   }
350
351   /// Test if this operation can be floating-point contracted (FMA).
352   bool hasAllowContract() const {
353     return (SubclassOptionalData & FastMathFlags::AllowContract) != 0;
354   }
355
356   /// Test if this operation allows approximations of math library functions or
357   /// intrinsics.
358   bool hasApproxFunc() const {
359     return (SubclassOptionalData & FastMathFlags::ApproxFunc) != 0;
360   }
361
362   /// Convenience function for getting all the fast-math flags
363   FastMathFlags getFastMathFlags() const {
364     return FastMathFlags(SubclassOptionalData);
365   }
366
367   /// Get the maximum error permitted by this operation in ULPs. An accuracy of
368   /// 0.0 means that the operation should be performed with the default
369   /// precision.
370   float getFPAccuracy() const;
371
372   static bool classof(const Value *V) {
373     unsigned Opcode;
374     if (auto *I = dyn_cast<Instruction>(V))
375       Opcode = I->getOpcode();
376     else if (auto *CE = dyn_cast<ConstantExpr>(V))
377       Opcode = CE->getOpcode();
378     else
379       return false;
380
381     switch (Opcode) {
382     case Instruction::FCmp:
383       return true;
384     // non math FP Operators (no FMF)
385     case Instruction::ExtractElement:
386     case Instruction::ShuffleVector:
387     case Instruction::InsertElement:
388     case Instruction::PHI:
389       return false;
390     default:
391       return V->getType()->isFPOrFPVectorTy();
392     }
393   }
394 };
395
396 /// A helper template for defining operators for individual opcodes.
397 template<typename SuperClass, unsigned Opc>
398 class ConcreteOperator : public SuperClass {
399 public:
400   static bool classof(const Instruction *I) {
401     return I->getOpcode() == Opc;
402   }
403   static bool classof(const ConstantExpr *CE) {
404     return CE->getOpcode() == Opc;
405   }
406   static bool classof(const Value *V) {
407     return (isa<Instruction>(V) && classof(cast<Instruction>(V))) ||
408            (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V)));
409   }
410 };
411
412 class AddOperator
413   : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Add> {
414 };
415 class SubOperator
416   : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Sub> {
417 };
418 class MulOperator
419   : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Mul> {
420 };
421 class ShlOperator
422   : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Shl> {
423 };
424
425 class SDivOperator
426   : public ConcreteOperator<PossiblyExactOperator, Instruction::SDiv> {
427 };
428 class UDivOperator
429   : public ConcreteOperator<PossiblyExactOperator, Instruction::UDiv> {
430 };
431 class AShrOperator
432   : public ConcreteOperator<PossiblyExactOperator, Instruction::AShr> {
433 };
434 class LShrOperator
435   : public ConcreteOperator<PossiblyExactOperator, Instruction::LShr> {
436 };
437
438 class ZExtOperator : public ConcreteOperator<Operator, Instruction::ZExt> {};
439
440 class GEPOperator
441   : public ConcreteOperator<Operator, Instruction::GetElementPtr> {
442   friend class GetElementPtrInst;
443   friend class ConstantExpr;
444
445   enum {
446     IsInBounds = (1 << 0),
447     // InRangeIndex: bits 1-6
448   };
449
450   void setIsInBounds(bool B) {
451     SubclassOptionalData =
452       (SubclassOptionalData & ~IsInBounds) | (B * IsInBounds);
453   }
454
455 public:
456   /// Test whether this is an inbounds GEP, as defined by LangRef.html.
457   bool isInBounds() const {
458     return SubclassOptionalData & IsInBounds;
459   }
460
461   /// Returns the offset of the index with an inrange attachment, or None if
462   /// none.
463   Optional<unsigned> getInRangeIndex() const {
464     if (SubclassOptionalData >> 1 == 0) return None;
465     return (SubclassOptionalData >> 1) - 1;
466   }
467
468   inline op_iterator       idx_begin()       { return op_begin()+1; }
469   inline const_op_iterator idx_begin() const { return op_begin()+1; }
470   inline op_iterator       idx_end()         { return op_end(); }
471   inline const_op_iterator idx_end()   const { return op_end(); }
472
473   Value *getPointerOperand() {
474     return getOperand(0);
475   }
476   const Value *getPointerOperand() const {
477     return getOperand(0);
478   }
479   static unsigned getPointerOperandIndex() {
480     return 0U;                      // get index for modifying correct operand
481   }
482
483   /// Method to return the pointer operand as a PointerType.
484   Type *getPointerOperandType() const {
485     return getPointerOperand()->getType();
486   }
487
488   Type *getSourceElementType() const;
489   Type *getResultElementType() const;
490
491   /// Method to return the address space of the pointer operand.
492   unsigned getPointerAddressSpace() const {
493     return getPointerOperandType()->getPointerAddressSpace();
494   }
495
496   unsigned getNumIndices() const {  // Note: always non-negative
497     return getNumOperands() - 1;
498   }
499
500   bool hasIndices() const {
501     return getNumOperands() > 1;
502   }
503
504   /// Return true if all of the indices of this GEP are zeros.
505   /// If so, the result pointer and the first operand have the same
506   /// value, just potentially different types.
507   bool hasAllZeroIndices() const {
508     for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) {
509       if (ConstantInt *C = dyn_cast<ConstantInt>(I))
510         if (C->isZero())
511           continue;
512       return false;
513     }
514     return true;
515   }
516
517   /// Return true if all of the indices of this GEP are constant integers.
518   /// If so, the result pointer and the first operand have
519   /// a constant offset between them.
520   bool hasAllConstantIndices() const {
521     for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) {
522       if (!isa<ConstantInt>(I))
523         return false;
524     }
525     return true;
526   }
527
528   unsigned countNonConstantIndices() const {
529     return count_if(make_range(idx_begin(), idx_end()), [](const Use& use) {
530         return !isa<ConstantInt>(*use);
531       });
532   }
533
534   /// Accumulate the constant address offset of this GEP if possible.
535   ///
536   /// This routine accepts an APInt into which it will accumulate the constant
537   /// offset of this GEP if the GEP is in fact constant. If the GEP is not
538   /// all-constant, it returns false and the value of the offset APInt is
539   /// undefined (it is *not* preserved!). The APInt passed into this routine
540   /// must be at exactly as wide as the IntPtr type for the address space of the
541   /// base GEP pointer.
542   bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const;
543 };
544
545 class PtrToIntOperator
546     : public ConcreteOperator<Operator, Instruction::PtrToInt> {
547   friend class PtrToInt;
548   friend class ConstantExpr;
549
550 public:
551   Value *getPointerOperand() {
552     return getOperand(0);
553   }
554   const Value *getPointerOperand() const {
555     return getOperand(0);
556   }
557
558   static unsigned getPointerOperandIndex() {
559     return 0U;                      // get index for modifying correct operand
560   }
561
562   /// Method to return the pointer operand as a PointerType.
563   Type *getPointerOperandType() const {
564     return getPointerOperand()->getType();
565   }
566
567   /// Method to return the address space of the pointer operand.
568   unsigned getPointerAddressSpace() const {
569     return cast<PointerType>(getPointerOperandType())->getAddressSpace();
570   }
571 };
572
573 class BitCastOperator
574     : public ConcreteOperator<Operator, Instruction::BitCast> {
575   friend class BitCastInst;
576   friend class ConstantExpr;
577
578 public:
579   Type *getSrcTy() const {
580     return getOperand(0)->getType();
581   }
582
583   Type *getDestTy() const {
584     return getType();
585   }
586 };
587
588 } // end namespace llvm
589
590 #endif // LLVM_IR_OPERATOR_H