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/IR/Constants.h" 19 #include "llvm/IR/DataLayout.h" 20 #include "llvm/IR/DerivedTypes.h" 21 #include "llvm/IR/GetElementPtrTypeIterator.h" 22 #include "llvm/IR/Instruction.h" 23 #include "llvm/IR/Type.h" 24 25 namespace llvm { 26 27 class GetElementPtrInst; 28 class BinaryOperator; 29 class ConstantExpr; 30 31 /// Operator - This is a utility class that provides an abstraction for the 32 /// common functionality between Instructions and ConstantExprs. 33 /// 34 class Operator : public User { 35 private: 36 // The Operator class is intended to be used as a utility, and is never itself 37 // instantiated. 38 void *operator new(size_t, unsigned) LLVM_DELETED_FUNCTION; 39 void *operator new(size_t s) LLVM_DELETED_FUNCTION; 40 Operator() LLVM_DELETED_FUNCTION; 41 42 protected: 43 // NOTE: Cannot use LLVM_DELETED_FUNCTION because it's not legal to delete 44 // an overridden method that's not deleted in the base class. Cannot leave 45 // this unimplemented because that leads to an ODR-violation. 46 ~Operator(); 47 48 public: 49 /// getOpcode - Return the opcode for this Instruction or ConstantExpr. 50 /// getOpcode()51 unsigned getOpcode() const { 52 if (const Instruction *I = dyn_cast<Instruction>(this)) 53 return I->getOpcode(); 54 return cast<ConstantExpr>(this)->getOpcode(); 55 } 56 57 /// getOpcode - If V is an Instruction or ConstantExpr, return its 58 /// opcode. Otherwise return UserOp1. 59 /// getOpcode(const Value * V)60 static unsigned getOpcode(const Value *V) { 61 if (const Instruction *I = dyn_cast<Instruction>(V)) 62 return I->getOpcode(); 63 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) 64 return CE->getOpcode(); 65 return Instruction::UserOp1; 66 } 67 classof(const Instruction *)68 static inline bool classof(const Instruction *) { return true; } classof(const ConstantExpr *)69 static inline bool classof(const ConstantExpr *) { return true; } classof(const Value * V)70 static inline bool classof(const Value *V) { 71 return isa<Instruction>(V) || isa<ConstantExpr>(V); 72 } 73 }; 74 75 /// OverflowingBinaryOperator - Utility class for integer arithmetic operators 76 /// which may exhibit overflow - Add, Sub, and Mul. It does not include SDiv, 77 /// despite that operator having the potential for overflow. 78 /// 79 class OverflowingBinaryOperator : public Operator { 80 public: 81 enum { 82 NoUnsignedWrap = (1 << 0), 83 NoSignedWrap = (1 << 1) 84 }; 85 86 private: 87 friend class BinaryOperator; 88 friend class ConstantExpr; setHasNoUnsignedWrap(bool B)89 void setHasNoUnsignedWrap(bool B) { 90 SubclassOptionalData = 91 (SubclassOptionalData & ~NoUnsignedWrap) | (B * NoUnsignedWrap); 92 } setHasNoSignedWrap(bool B)93 void setHasNoSignedWrap(bool B) { 94 SubclassOptionalData = 95 (SubclassOptionalData & ~NoSignedWrap) | (B * NoSignedWrap); 96 } 97 98 public: 99 /// hasNoUnsignedWrap - Test whether this operation is known to never 100 /// undergo unsigned overflow, aka the nuw property. hasNoUnsignedWrap()101 bool hasNoUnsignedWrap() const { 102 return SubclassOptionalData & NoUnsignedWrap; 103 } 104 105 /// hasNoSignedWrap - Test whether this operation is known to never 106 /// undergo signed overflow, aka the nsw property. hasNoSignedWrap()107 bool hasNoSignedWrap() const { 108 return (SubclassOptionalData & NoSignedWrap) != 0; 109 } 110 classof(const Instruction * I)111 static inline bool classof(const Instruction *I) { 112 return I->getOpcode() == Instruction::Add || 113 I->getOpcode() == Instruction::Sub || 114 I->getOpcode() == Instruction::Mul || 115 I->getOpcode() == Instruction::Shl; 116 } classof(const ConstantExpr * CE)117 static inline bool classof(const ConstantExpr *CE) { 118 return CE->getOpcode() == Instruction::Add || 119 CE->getOpcode() == Instruction::Sub || 120 CE->getOpcode() == Instruction::Mul || 121 CE->getOpcode() == Instruction::Shl; 122 } classof(const Value * V)123 static inline bool classof(const Value *V) { 124 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 125 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 126 } 127 }; 128 129 /// PossiblyExactOperator - A udiv or sdiv instruction, which can be marked as 130 /// "exact", indicating that no bits are destroyed. 131 class PossiblyExactOperator : public Operator { 132 public: 133 enum { 134 IsExact = (1 << 0) 135 }; 136 137 private: 138 friend class BinaryOperator; 139 friend class ConstantExpr; setIsExact(bool B)140 void setIsExact(bool B) { 141 SubclassOptionalData = (SubclassOptionalData & ~IsExact) | (B * IsExact); 142 } 143 144 public: 145 /// isExact - Test whether this division is known to be exact, with 146 /// zero remainder. isExact()147 bool isExact() const { 148 return SubclassOptionalData & IsExact; 149 } 150 isPossiblyExactOpcode(unsigned OpC)151 static bool isPossiblyExactOpcode(unsigned OpC) { 152 return OpC == Instruction::SDiv || 153 OpC == Instruction::UDiv || 154 OpC == Instruction::AShr || 155 OpC == Instruction::LShr; 156 } classof(const ConstantExpr * CE)157 static inline bool classof(const ConstantExpr *CE) { 158 return isPossiblyExactOpcode(CE->getOpcode()); 159 } classof(const Instruction * I)160 static inline bool classof(const Instruction *I) { 161 return isPossiblyExactOpcode(I->getOpcode()); 162 } classof(const Value * V)163 static inline bool classof(const Value *V) { 164 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 165 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 166 } 167 }; 168 169 /// Convenience struct for specifying and reasoning about fast-math flags. 170 class FastMathFlags { 171 private: 172 friend class FPMathOperator; 173 unsigned Flags; FastMathFlags(unsigned F)174 FastMathFlags(unsigned F) : Flags(F) { } 175 176 public: 177 enum { 178 UnsafeAlgebra = (1 << 0), 179 NoNaNs = (1 << 1), 180 NoInfs = (1 << 2), 181 NoSignedZeros = (1 << 3), 182 AllowReciprocal = (1 << 4) 183 }; 184 FastMathFlags()185 FastMathFlags() : Flags(0) 186 { } 187 188 /// Whether any flag is set any()189 bool any() { return Flags != 0; } 190 191 /// Set all the flags to false clear()192 void clear() { Flags = 0; } 193 194 /// Flag queries noNaNs()195 bool noNaNs() { return 0 != (Flags & NoNaNs); } noInfs()196 bool noInfs() { return 0 != (Flags & NoInfs); } noSignedZeros()197 bool noSignedZeros() { return 0 != (Flags & NoSignedZeros); } allowReciprocal()198 bool allowReciprocal() { return 0 != (Flags & AllowReciprocal); } unsafeAlgebra()199 bool unsafeAlgebra() { return 0 != (Flags & UnsafeAlgebra); } 200 201 /// Flag setters setNoNaNs()202 void setNoNaNs() { Flags |= NoNaNs; } setNoInfs()203 void setNoInfs() { Flags |= NoInfs; } setNoSignedZeros()204 void setNoSignedZeros() { Flags |= NoSignedZeros; } setAllowReciprocal()205 void setAllowReciprocal() { Flags |= AllowReciprocal; } setUnsafeAlgebra()206 void setUnsafeAlgebra() { 207 Flags |= UnsafeAlgebra; 208 setNoNaNs(); 209 setNoInfs(); 210 setNoSignedZeros(); 211 setAllowReciprocal(); 212 } 213 214 void operator&=(const FastMathFlags &OtherFlags) { 215 Flags &= OtherFlags.Flags; 216 } 217 }; 218 219 220 /// FPMathOperator - Utility class for floating point operations which can have 221 /// information about relaxed accuracy requirements attached to them. 222 class FPMathOperator : public Operator { 223 private: 224 friend class Instruction; 225 setHasUnsafeAlgebra(bool B)226 void setHasUnsafeAlgebra(bool B) { 227 SubclassOptionalData = 228 (SubclassOptionalData & ~FastMathFlags::UnsafeAlgebra) | 229 (B * FastMathFlags::UnsafeAlgebra); 230 231 // Unsafe algebra implies all the others 232 if (B) { 233 setHasNoNaNs(true); 234 setHasNoInfs(true); 235 setHasNoSignedZeros(true); 236 setHasAllowReciprocal(true); 237 } 238 } setHasNoNaNs(bool B)239 void setHasNoNaNs(bool B) { 240 SubclassOptionalData = 241 (SubclassOptionalData & ~FastMathFlags::NoNaNs) | 242 (B * FastMathFlags::NoNaNs); 243 } setHasNoInfs(bool B)244 void setHasNoInfs(bool B) { 245 SubclassOptionalData = 246 (SubclassOptionalData & ~FastMathFlags::NoInfs) | 247 (B * FastMathFlags::NoInfs); 248 } setHasNoSignedZeros(bool B)249 void setHasNoSignedZeros(bool B) { 250 SubclassOptionalData = 251 (SubclassOptionalData & ~FastMathFlags::NoSignedZeros) | 252 (B * FastMathFlags::NoSignedZeros); 253 } setHasAllowReciprocal(bool B)254 void setHasAllowReciprocal(bool B) { 255 SubclassOptionalData = 256 (SubclassOptionalData & ~FastMathFlags::AllowReciprocal) | 257 (B * FastMathFlags::AllowReciprocal); 258 } 259 260 /// Convenience function for setting all the fast-math flags setFastMathFlags(FastMathFlags FMF)261 void setFastMathFlags(FastMathFlags FMF) { 262 SubclassOptionalData |= FMF.Flags; 263 } 264 265 public: 266 /// Test whether this operation is permitted to be 267 /// algebraically transformed, aka the 'A' fast-math property. hasUnsafeAlgebra()268 bool hasUnsafeAlgebra() const { 269 return (SubclassOptionalData & FastMathFlags::UnsafeAlgebra) != 0; 270 } 271 272 /// Test whether this operation's arguments and results are to be 273 /// treated as non-NaN, aka the 'N' fast-math property. hasNoNaNs()274 bool hasNoNaNs() const { 275 return (SubclassOptionalData & FastMathFlags::NoNaNs) != 0; 276 } 277 278 /// Test whether this operation's arguments and results are to be 279 /// treated as NoN-Inf, aka the 'I' fast-math property. hasNoInfs()280 bool hasNoInfs() const { 281 return (SubclassOptionalData & FastMathFlags::NoInfs) != 0; 282 } 283 284 /// Test whether this operation can treat the sign of zero 285 /// as insignificant, aka the 'S' fast-math property. hasNoSignedZeros()286 bool hasNoSignedZeros() const { 287 return (SubclassOptionalData & FastMathFlags::NoSignedZeros) != 0; 288 } 289 290 /// Test whether this operation is permitted to use 291 /// reciprocal instead of division, aka the 'R' fast-math property. hasAllowReciprocal()292 bool hasAllowReciprocal() const { 293 return (SubclassOptionalData & FastMathFlags::AllowReciprocal) != 0; 294 } 295 296 /// Convenience function for getting all the fast-math flags getFastMathFlags()297 FastMathFlags getFastMathFlags() const { 298 return FastMathFlags(SubclassOptionalData); 299 } 300 301 /// \brief Get the maximum error permitted by this operation in ULPs. An 302 /// accuracy of 0.0 means that the operation should be performed with the 303 /// default precision. 304 float getFPAccuracy() const; 305 classof(const Instruction * I)306 static inline bool classof(const Instruction *I) { 307 return I->getType()->isFPOrFPVectorTy(); 308 } classof(const Value * V)309 static inline bool classof(const Value *V) { 310 return isa<Instruction>(V) && classof(cast<Instruction>(V)); 311 } 312 }; 313 314 315 /// ConcreteOperator - A helper template for defining operators for individual 316 /// opcodes. 317 template<typename SuperClass, unsigned Opc> 318 class ConcreteOperator : public SuperClass { 319 public: classof(const Instruction * I)320 static inline bool classof(const Instruction *I) { 321 return I->getOpcode() == Opc; 322 } classof(const ConstantExpr * CE)323 static inline bool classof(const ConstantExpr *CE) { 324 return CE->getOpcode() == Opc; 325 } classof(const Value * V)326 static inline bool classof(const Value *V) { 327 return (isa<Instruction>(V) && classof(cast<Instruction>(V))) || 328 (isa<ConstantExpr>(V) && classof(cast<ConstantExpr>(V))); 329 } 330 }; 331 332 class AddOperator 333 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Add> { 334 }; 335 class SubOperator 336 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Sub> { 337 }; 338 class MulOperator 339 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Mul> { 340 }; 341 class ShlOperator 342 : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Shl> { 343 }; 344 345 346 class SDivOperator 347 : public ConcreteOperator<PossiblyExactOperator, Instruction::SDiv> { 348 }; 349 class UDivOperator 350 : public ConcreteOperator<PossiblyExactOperator, Instruction::UDiv> { 351 }; 352 class AShrOperator 353 : public ConcreteOperator<PossiblyExactOperator, Instruction::AShr> { 354 }; 355 class LShrOperator 356 : public ConcreteOperator<PossiblyExactOperator, Instruction::LShr> { 357 }; 358 359 360 361 class GEPOperator 362 : public ConcreteOperator<Operator, Instruction::GetElementPtr> { 363 enum { 364 IsInBounds = (1 << 0) 365 }; 366 367 friend class GetElementPtrInst; 368 friend class ConstantExpr; setIsInBounds(bool B)369 void setIsInBounds(bool B) { 370 SubclassOptionalData = 371 (SubclassOptionalData & ~IsInBounds) | (B * IsInBounds); 372 } 373 374 public: 375 /// isInBounds - Test whether this is an inbounds GEP, as defined 376 /// by LangRef.html. isInBounds()377 bool isInBounds() const { 378 return SubclassOptionalData & IsInBounds; 379 } 380 idx_begin()381 inline op_iterator idx_begin() { return op_begin()+1; } idx_begin()382 inline const_op_iterator idx_begin() const { return op_begin()+1; } idx_end()383 inline op_iterator idx_end() { return op_end(); } idx_end()384 inline const_op_iterator idx_end() const { return op_end(); } 385 getPointerOperand()386 Value *getPointerOperand() { 387 return getOperand(0); 388 } getPointerOperand()389 const Value *getPointerOperand() const { 390 return getOperand(0); 391 } getPointerOperandIndex()392 static unsigned getPointerOperandIndex() { 393 return 0U; // get index for modifying correct operand 394 } 395 396 /// getPointerOperandType - Method to return the pointer operand as a 397 /// PointerType. getPointerOperandType()398 Type *getPointerOperandType() const { 399 return getPointerOperand()->getType(); 400 } 401 402 /// getPointerAddressSpace - Method to return the address space of the 403 /// pointer operand. getPointerAddressSpace()404 unsigned getPointerAddressSpace() const { 405 return cast<PointerType>(getPointerOperandType())->getAddressSpace(); 406 } 407 getNumIndices()408 unsigned getNumIndices() const { // Note: always non-negative 409 return getNumOperands() - 1; 410 } 411 hasIndices()412 bool hasIndices() const { 413 return getNumOperands() > 1; 414 } 415 416 /// hasAllZeroIndices - Return true if all of the indices of this GEP are 417 /// zeros. If so, the result pointer and the first operand have the same 418 /// value, just potentially different types. hasAllZeroIndices()419 bool hasAllZeroIndices() const { 420 for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) { 421 if (ConstantInt *C = dyn_cast<ConstantInt>(I)) 422 if (C->isZero()) 423 continue; 424 return false; 425 } 426 return true; 427 } 428 429 /// hasAllConstantIndices - Return true if all of the indices of this GEP are 430 /// constant integers. If so, the result pointer and the first operand have 431 /// a constant offset between them. hasAllConstantIndices()432 bool hasAllConstantIndices() const { 433 for (const_op_iterator I = idx_begin(), E = idx_end(); I != E; ++I) { 434 if (!isa<ConstantInt>(I)) 435 return false; 436 } 437 return true; 438 } 439 440 /// \brief Accumulate the constant address offset of this GEP if possible. 441 /// 442 /// This routine accepts an APInt into which it will accumulate the constant 443 /// offset of this GEP if the GEP is in fact constant. If the GEP is not 444 /// all-constant, it returns false and the value of the offset APInt is 445 /// undefined (it is *not* preserved!). The APInt passed into this routine 446 /// must be at exactly as wide as the IntPtr type for the address space of the 447 /// base GEP pointer. accumulateConstantOffset(const DataLayout & DL,APInt & Offset)448 bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const { 449 assert(Offset.getBitWidth() == 450 DL.getPointerSizeInBits(getPointerAddressSpace()) && 451 "The offset must have exactly as many bits as our pointer."); 452 453 for (gep_type_iterator GTI = gep_type_begin(this), GTE = gep_type_end(this); 454 GTI != GTE; ++GTI) { 455 ConstantInt *OpC = dyn_cast<ConstantInt>(GTI.getOperand()); 456 if (!OpC) 457 return false; 458 if (OpC->isZero()) 459 continue; 460 461 // Handle a struct index, which adds its field offset to the pointer. 462 if (StructType *STy = dyn_cast<StructType>(*GTI)) { 463 unsigned ElementIdx = OpC->getZExtValue(); 464 const StructLayout *SL = DL.getStructLayout(STy); 465 Offset += APInt(Offset.getBitWidth(), 466 SL->getElementOffset(ElementIdx)); 467 continue; 468 } 469 470 // For array or vector indices, scale the index by the size of the type. 471 APInt Index = OpC->getValue().sextOrTrunc(Offset.getBitWidth()); 472 Offset += Index * APInt(Offset.getBitWidth(), 473 DL.getTypeAllocSize(GTI.getIndexedType())); 474 } 475 return true; 476 } 477 478 }; 479 480 class PtrToIntOperator 481 : public ConcreteOperator<Operator, Instruction::PtrToInt> { 482 friend class PtrToInt; 483 friend class ConstantExpr; 484 485 public: getPointerOperand()486 Value *getPointerOperand() { 487 return getOperand(0); 488 } getPointerOperand()489 const Value *getPointerOperand() const { 490 return getOperand(0); 491 } getPointerOperandIndex()492 static unsigned getPointerOperandIndex() { 493 return 0U; // get index for modifying correct operand 494 } 495 496 /// getPointerOperandType - Method to return the pointer operand as a 497 /// PointerType. getPointerOperandType()498 Type *getPointerOperandType() const { 499 return getPointerOperand()->getType(); 500 } 501 502 /// getPointerAddressSpace - Method to return the address space of the 503 /// pointer operand. getPointerAddressSpace()504 unsigned getPointerAddressSpace() const { 505 return cast<PointerType>(getPointerOperandType())->getAddressSpace(); 506 } 507 }; 508 509 510 } // End llvm namespace 511 512 #endif 513