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