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 Instruction *I) { 368 return I->getType()->isFPOrFPVectorTy() || 369 I->getOpcode() == Instruction::FCmp; 370 } 371 372 static bool classof(const ConstantExpr *CE) { 373 return CE->getType()->isFPOrFPVectorTy() || 374 CE->getOpcode() == Instruction::FCmp; 375 } 376 377 static bool classof(const Value *V) { 378 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 379 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 380 } 381 }; 382 383 /// A helper template for defining operators for individual opcodes. 384 template<typename SuperClass, unsigned Opc> 385 class ConcreteOperator : public SuperClass { 386 public: 387 static bool classof(const Instruction *I) { 388 return I->getOpcode() == Opc; 389 } 390 static bool classof(const ConstantExpr *CE) { 391 return CE->getOpcode() == Opc; 392 } 393 static bool classof(const Value *V) { 394 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 395 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 396 } 397 }; 398 399 class AddOperator 400 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Add> { 401 }; 402 class SubOperator 403 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Sub> { 404 }; 405 class MulOperator 406 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Mul> { 407 }; 408 class ShlOperator 409 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Shl> { 410 }; 411 412 class SDivOperator 413 : public ConcreteOperator<PossiblyExactOperator, Instruction::SDiv> { 414 }; 415 class UDivOperator 416 : public ConcreteOperator<PossiblyExactOperator, Instruction::UDiv> { 417 }; 418 class AShrOperator 419 : public ConcreteOperator<PossiblyExactOperator, Instruction::AShr> { 420 }; 421 class LShrOperator 422 : public ConcreteOperator<PossiblyExactOperator, Instruction::LShr> { 423 }; 424 425 class ZExtOperator : public ConcreteOperator<Operator, Instruction::ZExt> {}; 426 427 class GEPOperator 428 : public ConcreteOperator<Operator, Instruction::GetElementPtr> { 429 friend class GetElementPtrInst; 430 friend class ConstantExpr; 431 432 enum { 433 IsInBounds = (1 << 0), 434 // InRangeIndex: bits 1-6 435 }; 436 437 void setIsInBounds(bool B) { 438 SubclassOptionalData = 439 (SubclassOptionalData & ~IsInBounds) | (B * IsInBounds); 440 } 441 442 public: 443 /// Test whether this is an inbounds GEP, as defined by LangRef.html. 444 bool isInBounds() const { 445 return SubclassOptionalData & IsInBounds; 446 } 447 448 /// Returns the offset of the index with an inrange attachment, or None if 449 /// none. 450 Optional<unsigned> getInRangeIndex() const { 451 if (SubclassOptionalData >> 1 == 0) return None; 452 return (SubclassOptionalData >> 1) - 1; 453 } 454 455 inline op_iterator idx_begin() { return op_begin()+1; } 456 inline const_op_iterator idx_begin() const { return op_begin()+1; } 457 inline op_iterator idx_end() { return op_end(); } 458 inline const_op_iterator idx_end() const { return op_end(); } 459 460 Value *getPointerOperand() { 461 return getOperand(0); 462 } 463 const Value *getPointerOperand() const { 464 return getOperand(0); 465 } 466 static unsigned getPointerOperandIndex() { 467 return 0U; // get index for modifying correct operand 468 } 469 470 /// Method to return the pointer operand as a PointerType. 471 Type *getPointerOperandType() const { 472 return getPointerOperand()->getType(); 473 } 474 475 Type *getSourceElementType() const; 476 Type *getResultElementType() const; 477 478 /// Method to return the address space of the pointer operand. 479 unsigned getPointerAddressSpace() const { 480 return getPointerOperandType()->getPointerAddressSpace(); 481 } 482 483 unsigned getNumIndices() const { // Note: always non-negative 484 return getNumOperands() - 1; 485 } 486 487 bool hasIndices() const { 488 return getNumOperands() > 1; 489 } 490 491 /// Return true if all of the indices of this GEP are zeros. 492 /// If so, the result pointer and the first operand have the same 493 /// value, just potentially different types. 494 bool hasAllZeroIndices() const { 495 for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) { 496 if (ConstantInt *C = dyn_cast<ConstantInt>(I)) 497 if (C->isZero()) 498 continue; 499 return false; 500 } 501 return true; 502 } 503 504 /// Return true if all of the indices of this GEP are constant integers. 505 /// If so, the result pointer and the first operand have 506 /// a constant offset between them. 507 bool hasAllConstantIndices() const { 508 for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) { 509 if (!isa<ConstantInt>(I)) 510 return false; 511 } 512 return true; 513 } 514 515 unsigned countNonConstantIndices() const { 516 return count_if(make_range(idx_begin(), idx_end()), [](const Use& use) { 517 return !isa<ConstantInt>(*use); 518 }); 519 } 520 521 /// Accumulate the constant address offset of this GEP if possible. 522 /// 523 /// This routine accepts an APInt into which it will accumulate the constant 524 /// offset of this GEP if the GEP is in fact constant. If the GEP is not 525 /// all-constant, it returns false and the value of the offset APInt is 526 /// undefined (it is *not* preserved!). The APInt passed into this routine 527 /// must be at exactly as wide as the IntPtr type for the address space of the 528 /// base GEP pointer. 529 bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const; 530 }; 531 532 class PtrToIntOperator 533 : public ConcreteOperator<Operator, Instruction::PtrToInt> { 534 friend class PtrToInt; 535 friend class ConstantExpr; 536 537 public: 538 Value *getPointerOperand() { 539 return getOperand(0); 540 } 541 const Value *getPointerOperand() const { 542 return getOperand(0); 543 } 544 545 static unsigned getPointerOperandIndex() { 546 return 0U; // get index for modifying correct operand 547 } 548 549 /// Method to return the pointer operand as a PointerType. 550 Type *getPointerOperandType() const { 551 return getPointerOperand()->getType(); 552 } 553 554 /// Method to return the address space of the pointer operand. 555 unsigned getPointerAddressSpace() const { 556 return cast<PointerType>(getPointerOperandType())->getAddressSpace(); 557 } 558 }; 559 560 class BitCastOperator 561 : public ConcreteOperator<Operator, Instruction::BitCast> { 562 friend class BitCastInst; 563 friend class ConstantExpr; 564 565 public: 566 Type *getSrcTy() const { 567 return getOperand(0)->getType(); 568 } 569 570 Type *getDestTy() const { 571 return getType(); 572 } 573 }; 574 575 } // end namespace llvm 576 577 #endif // LLVM_IR_OPERATOR_H 578