1 //===- AttributorAttributes.cpp - Attributes for Attributor deduction -----===// 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 // See the Attributor.h file comment and the class descriptions in that file for 10 // more information. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Transforms/IPO/Attributor.h" 15 16 #include "llvm/ADT/APInt.h" 17 #include "llvm/ADT/SCCIterator.h" 18 #include "llvm/ADT/SmallPtrSet.h" 19 #include "llvm/ADT/Statistic.h" 20 #include "llvm/Analysis/AliasAnalysis.h" 21 #include "llvm/Analysis/AssumeBundleQueries.h" 22 #include "llvm/Analysis/AssumptionCache.h" 23 #include "llvm/Analysis/CaptureTracking.h" 24 #include "llvm/Analysis/InstructionSimplify.h" 25 #include "llvm/Analysis/LazyValueInfo.h" 26 #include "llvm/Analysis/MemoryBuiltins.h" 27 #include "llvm/Analysis/OptimizationRemarkEmitter.h" 28 #include "llvm/Analysis/ScalarEvolution.h" 29 #include "llvm/Analysis/TargetTransformInfo.h" 30 #include "llvm/Analysis/ValueTracking.h" 31 #include "llvm/IR/Constants.h" 32 #include "llvm/IR/IRBuilder.h" 33 #include "llvm/IR/Instruction.h" 34 #include "llvm/IR/Instructions.h" 35 #include "llvm/IR/IntrinsicInst.h" 36 #include "llvm/IR/NoFolder.h" 37 #include "llvm/Support/Alignment.h" 38 #include "llvm/Support/Casting.h" 39 #include "llvm/Support/CommandLine.h" 40 #include "llvm/Support/ErrorHandling.h" 41 #include "llvm/Support/FileSystem.h" 42 #include "llvm/Support/raw_ostream.h" 43 #include "llvm/Transforms/IPO/ArgumentPromotion.h" 44 #include "llvm/Transforms/Utils/Local.h" 45 #include <cassert> 46 47 using namespace llvm; 48 49 #define DEBUG_TYPE "attributor" 50 51 static cl::opt<bool> ManifestInternal( 52 "attributor-manifest-internal", cl::Hidden, 53 cl::desc("Manifest Attributor internal string attributes."), 54 cl::init(false)); 55 56 static cl::opt<int> MaxHeapToStackSize("max-heap-to-stack-size", cl::init(128), 57 cl::Hidden); 58 59 template <> 60 unsigned llvm::PotentialConstantIntValuesState::MaxPotentialValues = 0; 61 62 static cl::opt<unsigned, true> MaxPotentialValues( 63 "attributor-max-potential-values", cl::Hidden, 64 cl::desc("Maximum number of potential values to be " 65 "tracked for each position."), 66 cl::location(llvm::PotentialConstantIntValuesState::MaxPotentialValues), 67 cl::init(7)); 68 69 STATISTIC(NumAAs, "Number of abstract attributes created"); 70 71 // Some helper macros to deal with statistics tracking. 72 // 73 // Usage: 74 // For simple IR attribute tracking overload trackStatistics in the abstract 75 // attribute and choose the right STATS_DECLTRACK_********* macro, 76 // e.g.,: 77 // void trackStatistics() const override { 78 // STATS_DECLTRACK_ARG_ATTR(returned) 79 // } 80 // If there is a single "increment" side one can use the macro 81 // STATS_DECLTRACK with a custom message. If there are multiple increment 82 // sides, STATS_DECL and STATS_TRACK can also be used separately. 83 // 84 #define BUILD_STAT_MSG_IR_ATTR(TYPE, NAME) \ 85 ("Number of " #TYPE " marked '" #NAME "'") 86 #define BUILD_STAT_NAME(NAME, TYPE) NumIR##TYPE##_##NAME 87 #define STATS_DECL_(NAME, MSG) STATISTIC(NAME, MSG); 88 #define STATS_DECL(NAME, TYPE, MSG) \ 89 STATS_DECL_(BUILD_STAT_NAME(NAME, TYPE), MSG); 90 #define STATS_TRACK(NAME, TYPE) ++(BUILD_STAT_NAME(NAME, TYPE)); 91 #define STATS_DECLTRACK(NAME, TYPE, MSG) \ 92 { \ 93 STATS_DECL(NAME, TYPE, MSG) \ 94 STATS_TRACK(NAME, TYPE) \ 95 } 96 #define STATS_DECLTRACK_ARG_ATTR(NAME) \ 97 STATS_DECLTRACK(NAME, Arguments, BUILD_STAT_MSG_IR_ATTR(arguments, NAME)) 98 #define STATS_DECLTRACK_CSARG_ATTR(NAME) \ 99 STATS_DECLTRACK(NAME, CSArguments, \ 100 BUILD_STAT_MSG_IR_ATTR(call site arguments, NAME)) 101 #define STATS_DECLTRACK_FN_ATTR(NAME) \ 102 STATS_DECLTRACK(NAME, Function, BUILD_STAT_MSG_IR_ATTR(functions, NAME)) 103 #define STATS_DECLTRACK_CS_ATTR(NAME) \ 104 STATS_DECLTRACK(NAME, CS, BUILD_STAT_MSG_IR_ATTR(call site, NAME)) 105 #define STATS_DECLTRACK_FNRET_ATTR(NAME) \ 106 STATS_DECLTRACK(NAME, FunctionReturn, \ 107 BUILD_STAT_MSG_IR_ATTR(function returns, NAME)) 108 #define STATS_DECLTRACK_CSRET_ATTR(NAME) \ 109 STATS_DECLTRACK(NAME, CSReturn, \ 110 BUILD_STAT_MSG_IR_ATTR(call site returns, NAME)) 111 #define STATS_DECLTRACK_FLOATING_ATTR(NAME) \ 112 STATS_DECLTRACK(NAME, Floating, \ 113 ("Number of floating values known to be '" #NAME "'")) 114 115 // Specialization of the operator<< for abstract attributes subclasses. This 116 // disambiguates situations where multiple operators are applicable. 117 namespace llvm { 118 #define PIPE_OPERATOR(CLASS) \ 119 raw_ostream &operator<<(raw_ostream &OS, const CLASS &AA) { \ 120 return OS << static_cast<const AbstractAttribute &>(AA); \ 121 } 122 123 PIPE_OPERATOR(AAIsDead) 124 PIPE_OPERATOR(AANoUnwind) 125 PIPE_OPERATOR(AANoSync) 126 PIPE_OPERATOR(AANoRecurse) 127 PIPE_OPERATOR(AAWillReturn) 128 PIPE_OPERATOR(AANoReturn) 129 PIPE_OPERATOR(AAReturnedValues) 130 PIPE_OPERATOR(AANonNull) 131 PIPE_OPERATOR(AANoAlias) 132 PIPE_OPERATOR(AADereferenceable) 133 PIPE_OPERATOR(AAAlign) 134 PIPE_OPERATOR(AANoCapture) 135 PIPE_OPERATOR(AAValueSimplify) 136 PIPE_OPERATOR(AANoFree) 137 PIPE_OPERATOR(AAHeapToStack) 138 PIPE_OPERATOR(AAReachability) 139 PIPE_OPERATOR(AAMemoryBehavior) 140 PIPE_OPERATOR(AAMemoryLocation) 141 PIPE_OPERATOR(AAValueConstantRange) 142 PIPE_OPERATOR(AAPrivatizablePtr) 143 PIPE_OPERATOR(AAUndefinedBehavior) 144 PIPE_OPERATOR(AAPotentialValues) 145 PIPE_OPERATOR(AANoUndef) 146 PIPE_OPERATOR(AACallEdges) 147 PIPE_OPERATOR(AAFunctionReachability) 148 PIPE_OPERATOR(AAPointerInfo) 149 150 #undef PIPE_OPERATOR 151 152 template <> 153 ChangeStatus clampStateAndIndicateChange<DerefState>(DerefState &S, 154 const DerefState &R) { 155 ChangeStatus CS0 = 156 clampStateAndIndicateChange(S.DerefBytesState, R.DerefBytesState); 157 ChangeStatus CS1 = clampStateAndIndicateChange(S.GlobalState, R.GlobalState); 158 return CS0 | CS1; 159 } 160 161 } // namespace llvm 162 163 /// Get pointer operand of memory accessing instruction. If \p I is 164 /// not a memory accessing instruction, return nullptr. If \p AllowVolatile, 165 /// is set to false and the instruction is volatile, return nullptr. 166 static const Value *getPointerOperand(const Instruction *I, 167 bool AllowVolatile) { 168 if (!AllowVolatile && I->isVolatile()) 169 return nullptr; 170 171 if (auto *LI = dyn_cast<LoadInst>(I)) { 172 return LI->getPointerOperand(); 173 } 174 175 if (auto *SI = dyn_cast<StoreInst>(I)) { 176 return SI->getPointerOperand(); 177 } 178 179 if (auto *CXI = dyn_cast<AtomicCmpXchgInst>(I)) { 180 return CXI->getPointerOperand(); 181 } 182 183 if (auto *RMWI = dyn_cast<AtomicRMWInst>(I)) { 184 return RMWI->getPointerOperand(); 185 } 186 187 return nullptr; 188 } 189 190 /// Helper function to create a pointer of type \p ResTy, based on \p Ptr, and 191 /// advanced by \p Offset bytes. To aid later analysis the method tries to build 192 /// getelement pointer instructions that traverse the natural type of \p Ptr if 193 /// possible. If that fails, the remaining offset is adjusted byte-wise, hence 194 /// through a cast to i8*. 195 /// 196 /// TODO: This could probably live somewhere more prominantly if it doesn't 197 /// already exist. 198 static Value *constructPointer(Type *ResTy, Type *PtrElemTy, Value *Ptr, 199 int64_t Offset, IRBuilder<NoFolder> &IRB, 200 const DataLayout &DL) { 201 assert(Offset >= 0 && "Negative offset not supported yet!"); 202 LLVM_DEBUG(dbgs() << "Construct pointer: " << *Ptr << " + " << Offset 203 << "-bytes as " << *ResTy << "\n"); 204 205 if (Offset) { 206 SmallVector<Value *, 4> Indices; 207 std::string GEPName = Ptr->getName().str() + ".0"; 208 209 // Add 0 index to look through the pointer. 210 assert((uint64_t)Offset < DL.getTypeAllocSize(PtrElemTy) && 211 "Offset out of bounds"); 212 Indices.push_back(Constant::getNullValue(IRB.getInt32Ty())); 213 214 Type *Ty = PtrElemTy; 215 do { 216 auto *STy = dyn_cast<StructType>(Ty); 217 if (!STy) 218 // Non-aggregate type, we cast and make byte-wise progress now. 219 break; 220 221 const StructLayout *SL = DL.getStructLayout(STy); 222 if (int64_t(SL->getSizeInBytes()) < Offset) 223 break; 224 225 uint64_t Idx = SL->getElementContainingOffset(Offset); 226 assert(Idx < STy->getNumElements() && "Offset calculation error!"); 227 uint64_t Rem = Offset - SL->getElementOffset(Idx); 228 Ty = STy->getElementType(Idx); 229 230 LLVM_DEBUG(errs() << "Ty: " << *Ty << " Offset: " << Offset 231 << " Idx: " << Idx << " Rem: " << Rem << "\n"); 232 233 GEPName += "." + std::to_string(Idx); 234 Indices.push_back(ConstantInt::get(IRB.getInt32Ty(), Idx)); 235 Offset = Rem; 236 } while (Offset); 237 238 // Create a GEP for the indices collected above. 239 Ptr = IRB.CreateGEP(PtrElemTy, Ptr, Indices, GEPName); 240 241 // If an offset is left we use byte-wise adjustment. 242 if (Offset) { 243 Ptr = IRB.CreateBitCast(Ptr, IRB.getInt8PtrTy()); 244 Ptr = IRB.CreateGEP(IRB.getInt8Ty(), Ptr, IRB.getInt32(Offset), 245 GEPName + ".b" + Twine(Offset)); 246 } 247 } 248 249 // Ensure the result has the requested type. 250 Ptr = IRB.CreateBitOrPointerCast(Ptr, ResTy, Ptr->getName() + ".cast"); 251 252 LLVM_DEBUG(dbgs() << "Constructed pointer: " << *Ptr << "\n"); 253 return Ptr; 254 } 255 256 /// Recursively visit all values that might become \p IRP at some point. This 257 /// will be done by looking through cast instructions, selects, phis, and calls 258 /// with the "returned" attribute. Once we cannot look through the value any 259 /// further, the callback \p VisitValueCB is invoked and passed the current 260 /// value, the \p State, and a flag to indicate if we stripped anything. 261 /// Stripped means that we unpacked the value associated with \p IRP at least 262 /// once. Note that the value used for the callback may still be the value 263 /// associated with \p IRP (due to PHIs). To limit how much effort is invested, 264 /// we will never visit more values than specified by \p MaxValues. 265 template <typename StateTy> 266 static bool genericValueTraversal( 267 Attributor &A, IRPosition IRP, const AbstractAttribute &QueryingAA, 268 StateTy &State, 269 function_ref<bool(Value &, const Instruction *, StateTy &, bool)> 270 VisitValueCB, 271 const Instruction *CtxI, bool UseValueSimplify = true, int MaxValues = 16, 272 function_ref<Value *(Value *)> StripCB = nullptr) { 273 274 const AAIsDead *LivenessAA = nullptr; 275 if (IRP.getAnchorScope()) 276 LivenessAA = &A.getAAFor<AAIsDead>( 277 QueryingAA, 278 IRPosition::function(*IRP.getAnchorScope(), IRP.getCallBaseContext()), 279 DepClassTy::NONE); 280 bool AnyDead = false; 281 282 Value *InitialV = &IRP.getAssociatedValue(); 283 using Item = std::pair<Value *, const Instruction *>; 284 SmallSet<Item, 16> Visited; 285 SmallVector<Item, 16> Worklist; 286 Worklist.push_back({InitialV, CtxI}); 287 288 int Iteration = 0; 289 do { 290 Item I = Worklist.pop_back_val(); 291 Value *V = I.first; 292 CtxI = I.second; 293 if (StripCB) 294 V = StripCB(V); 295 296 // Check if we should process the current value. To prevent endless 297 // recursion keep a record of the values we followed! 298 if (!Visited.insert(I).second) 299 continue; 300 301 // Make sure we limit the compile time for complex expressions. 302 if (Iteration++ >= MaxValues) 303 return false; 304 305 // Explicitly look through calls with a "returned" attribute if we do 306 // not have a pointer as stripPointerCasts only works on them. 307 Value *NewV = nullptr; 308 if (V->getType()->isPointerTy()) { 309 NewV = V->stripPointerCasts(); 310 } else { 311 auto *CB = dyn_cast<CallBase>(V); 312 if (CB && CB->getCalledFunction()) { 313 for (Argument &Arg : CB->getCalledFunction()->args()) 314 if (Arg.hasReturnedAttr()) { 315 NewV = CB->getArgOperand(Arg.getArgNo()); 316 break; 317 } 318 } 319 } 320 if (NewV && NewV != V) { 321 Worklist.push_back({NewV, CtxI}); 322 continue; 323 } 324 325 // Look through select instructions, visit assumed potential values. 326 if (auto *SI = dyn_cast<SelectInst>(V)) { 327 bool UsedAssumedInformation = false; 328 Optional<Constant *> C = A.getAssumedConstant( 329 *SI->getCondition(), QueryingAA, UsedAssumedInformation); 330 bool NoValueYet = !C.hasValue(); 331 if (NoValueYet || isa_and_nonnull<UndefValue>(*C)) 332 continue; 333 if (auto *CI = dyn_cast_or_null<ConstantInt>(*C)) { 334 if (CI->isZero()) 335 Worklist.push_back({SI->getFalseValue(), CtxI}); 336 else 337 Worklist.push_back({SI->getTrueValue(), CtxI}); 338 continue; 339 } 340 // We could not simplify the condition, assume both values.( 341 Worklist.push_back({SI->getTrueValue(), CtxI}); 342 Worklist.push_back({SI->getFalseValue(), CtxI}); 343 continue; 344 } 345 346 // Look through phi nodes, visit all live operands. 347 if (auto *PHI = dyn_cast<PHINode>(V)) { 348 assert(LivenessAA && 349 "Expected liveness in the presence of instructions!"); 350 for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) { 351 BasicBlock *IncomingBB = PHI->getIncomingBlock(u); 352 bool UsedAssumedInformation = false; 353 if (A.isAssumedDead(*IncomingBB->getTerminator(), &QueryingAA, 354 LivenessAA, UsedAssumedInformation, 355 /* CheckBBLivenessOnly */ true)) { 356 AnyDead = true; 357 continue; 358 } 359 Worklist.push_back( 360 {PHI->getIncomingValue(u), IncomingBB->getTerminator()}); 361 } 362 continue; 363 } 364 365 if (UseValueSimplify && !isa<Constant>(V)) { 366 bool UsedAssumedInformation = false; 367 Optional<Value *> SimpleV = 368 A.getAssumedSimplified(*V, QueryingAA, UsedAssumedInformation); 369 if (!SimpleV.hasValue()) 370 continue; 371 if (!SimpleV.getValue()) 372 return false; 373 Value *NewV = SimpleV.getValue(); 374 if (NewV != V) { 375 Worklist.push_back({NewV, CtxI}); 376 continue; 377 } 378 } 379 380 // Once a leaf is reached we inform the user through the callback. 381 if (!VisitValueCB(*V, CtxI, State, Iteration > 1)) 382 return false; 383 } while (!Worklist.empty()); 384 385 // If we actually used liveness information so we have to record a dependence. 386 if (AnyDead) 387 A.recordDependence(*LivenessAA, QueryingAA, DepClassTy::OPTIONAL); 388 389 // All values have been visited. 390 return true; 391 } 392 393 bool AA::getAssumedUnderlyingObjects(Attributor &A, const Value &Ptr, 394 SmallVectorImpl<Value *> &Objects, 395 const AbstractAttribute &QueryingAA, 396 const Instruction *CtxI) { 397 auto StripCB = [&](Value *V) { return getUnderlyingObject(V); }; 398 SmallPtrSet<Value *, 8> SeenObjects; 399 auto VisitValueCB = [&SeenObjects](Value &Val, const Instruction *, 400 SmallVectorImpl<Value *> &Objects, 401 bool) -> bool { 402 if (SeenObjects.insert(&Val).second) 403 Objects.push_back(&Val); 404 return true; 405 }; 406 if (!genericValueTraversal<decltype(Objects)>( 407 A, IRPosition::value(Ptr), QueryingAA, Objects, VisitValueCB, CtxI, 408 true, 32, StripCB)) 409 return false; 410 return true; 411 } 412 413 const Value *stripAndAccumulateMinimalOffsets( 414 Attributor &A, const AbstractAttribute &QueryingAA, const Value *Val, 415 const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, 416 bool UseAssumed = false) { 417 418 auto AttributorAnalysis = [&](Value &V, APInt &ROffset) -> bool { 419 const IRPosition &Pos = IRPosition::value(V); 420 // Only track dependence if we are going to use the assumed info. 421 const AAValueConstantRange &ValueConstantRangeAA = 422 A.getAAFor<AAValueConstantRange>(QueryingAA, Pos, 423 UseAssumed ? DepClassTy::OPTIONAL 424 : DepClassTy::NONE); 425 ConstantRange Range = UseAssumed ? ValueConstantRangeAA.getAssumed() 426 : ValueConstantRangeAA.getKnown(); 427 // We can only use the lower part of the range because the upper part can 428 // be higher than what the value can really be. 429 ROffset = Range.getSignedMin(); 430 return true; 431 }; 432 433 return Val->stripAndAccumulateConstantOffsets(DL, Offset, AllowNonInbounds, 434 AttributorAnalysis); 435 } 436 437 static const Value *getMinimalBaseOfAccsesPointerOperand( 438 Attributor &A, const AbstractAttribute &QueryingAA, const Instruction *I, 439 int64_t &BytesOffset, const DataLayout &DL, bool AllowNonInbounds = false) { 440 const Value *Ptr = getPointerOperand(I, /* AllowVolatile */ false); 441 if (!Ptr) 442 return nullptr; 443 APInt OffsetAPInt(DL.getIndexTypeSizeInBits(Ptr->getType()), 0); 444 const Value *Base = stripAndAccumulateMinimalOffsets( 445 A, QueryingAA, Ptr, DL, OffsetAPInt, AllowNonInbounds); 446 447 BytesOffset = OffsetAPInt.getSExtValue(); 448 return Base; 449 } 450 451 static const Value * 452 getBasePointerOfAccessPointerOperand(const Instruction *I, int64_t &BytesOffset, 453 const DataLayout &DL, 454 bool AllowNonInbounds = false) { 455 const Value *Ptr = getPointerOperand(I, /* AllowVolatile */ false); 456 if (!Ptr) 457 return nullptr; 458 459 return GetPointerBaseWithConstantOffset(Ptr, BytesOffset, DL, 460 AllowNonInbounds); 461 } 462 463 /// Clamp the information known for all returned values of a function 464 /// (identified by \p QueryingAA) into \p S. 465 template <typename AAType, typename StateType = typename AAType::StateType> 466 static void clampReturnedValueStates( 467 Attributor &A, const AAType &QueryingAA, StateType &S, 468 const IRPosition::CallBaseContext *CBContext = nullptr) { 469 LLVM_DEBUG(dbgs() << "[Attributor] Clamp return value states for " 470 << QueryingAA << " into " << S << "\n"); 471 472 assert((QueryingAA.getIRPosition().getPositionKind() == 473 IRPosition::IRP_RETURNED || 474 QueryingAA.getIRPosition().getPositionKind() == 475 IRPosition::IRP_CALL_SITE_RETURNED) && 476 "Can only clamp returned value states for a function returned or call " 477 "site returned position!"); 478 479 // Use an optional state as there might not be any return values and we want 480 // to join (IntegerState::operator&) the state of all there are. 481 Optional<StateType> T; 482 483 // Callback for each possibly returned value. 484 auto CheckReturnValue = [&](Value &RV) -> bool { 485 const IRPosition &RVPos = IRPosition::value(RV, CBContext); 486 const AAType &AA = 487 A.getAAFor<AAType>(QueryingAA, RVPos, DepClassTy::REQUIRED); 488 LLVM_DEBUG(dbgs() << "[Attributor] RV: " << RV << " AA: " << AA.getAsStr() 489 << " @ " << RVPos << "\n"); 490 const StateType &AAS = AA.getState(); 491 if (T.hasValue()) 492 *T &= AAS; 493 else 494 T = AAS; 495 LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " RV State: " << T 496 << "\n"); 497 return T->isValidState(); 498 }; 499 500 if (!A.checkForAllReturnedValues(CheckReturnValue, QueryingAA)) 501 S.indicatePessimisticFixpoint(); 502 else if (T.hasValue()) 503 S ^= *T; 504 } 505 506 /// Helper class for generic deduction: return value -> returned position. 507 template <typename AAType, typename BaseType, 508 typename StateType = typename BaseType::StateType, 509 bool PropagateCallBaseContext = false> 510 struct AAReturnedFromReturnedValues : public BaseType { 511 AAReturnedFromReturnedValues(const IRPosition &IRP, Attributor &A) 512 : BaseType(IRP, A) {} 513 514 /// See AbstractAttribute::updateImpl(...). 515 ChangeStatus updateImpl(Attributor &A) override { 516 StateType S(StateType::getBestState(this->getState())); 517 clampReturnedValueStates<AAType, StateType>( 518 A, *this, S, 519 PropagateCallBaseContext ? this->getCallBaseContext() : nullptr); 520 // TODO: If we know we visited all returned values, thus no are assumed 521 // dead, we can take the known information from the state T. 522 return clampStateAndIndicateChange<StateType>(this->getState(), S); 523 } 524 }; 525 526 /// Clamp the information known at all call sites for a given argument 527 /// (identified by \p QueryingAA) into \p S. 528 template <typename AAType, typename StateType = typename AAType::StateType> 529 static void clampCallSiteArgumentStates(Attributor &A, const AAType &QueryingAA, 530 StateType &S) { 531 LLVM_DEBUG(dbgs() << "[Attributor] Clamp call site argument states for " 532 << QueryingAA << " into " << S << "\n"); 533 534 assert(QueryingAA.getIRPosition().getPositionKind() == 535 IRPosition::IRP_ARGUMENT && 536 "Can only clamp call site argument states for an argument position!"); 537 538 // Use an optional state as there might not be any return values and we want 539 // to join (IntegerState::operator&) the state of all there are. 540 Optional<StateType> T; 541 542 // The argument number which is also the call site argument number. 543 unsigned ArgNo = QueryingAA.getIRPosition().getCallSiteArgNo(); 544 545 auto CallSiteCheck = [&](AbstractCallSite ACS) { 546 const IRPosition &ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo); 547 // Check if a coresponding argument was found or if it is on not associated 548 // (which can happen for callback calls). 549 if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID) 550 return false; 551 552 const AAType &AA = 553 A.getAAFor<AAType>(QueryingAA, ACSArgPos, DepClassTy::REQUIRED); 554 LLVM_DEBUG(dbgs() << "[Attributor] ACS: " << *ACS.getInstruction() 555 << " AA: " << AA.getAsStr() << " @" << ACSArgPos << "\n"); 556 const StateType &AAS = AA.getState(); 557 if (T.hasValue()) 558 *T &= AAS; 559 else 560 T = AAS; 561 LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " CSA State: " << T 562 << "\n"); 563 return T->isValidState(); 564 }; 565 566 bool AllCallSitesKnown; 567 if (!A.checkForAllCallSites(CallSiteCheck, QueryingAA, true, 568 AllCallSitesKnown)) 569 S.indicatePessimisticFixpoint(); 570 else if (T.hasValue()) 571 S ^= *T; 572 } 573 574 /// This function is the bridge between argument position and the call base 575 /// context. 576 template <typename AAType, typename BaseType, 577 typename StateType = typename AAType::StateType> 578 bool getArgumentStateFromCallBaseContext(Attributor &A, 579 BaseType &QueryingAttribute, 580 IRPosition &Pos, StateType &State) { 581 assert((Pos.getPositionKind() == IRPosition::IRP_ARGUMENT) && 582 "Expected an 'argument' position !"); 583 const CallBase *CBContext = Pos.getCallBaseContext(); 584 if (!CBContext) 585 return false; 586 587 int ArgNo = Pos.getCallSiteArgNo(); 588 assert(ArgNo >= 0 && "Invalid Arg No!"); 589 590 const auto &AA = A.getAAFor<AAType>( 591 QueryingAttribute, IRPosition::callsite_argument(*CBContext, ArgNo), 592 DepClassTy::REQUIRED); 593 const StateType &CBArgumentState = 594 static_cast<const StateType &>(AA.getState()); 595 596 LLVM_DEBUG(dbgs() << "[Attributor] Briding Call site context to argument" 597 << "Position:" << Pos << "CB Arg state:" << CBArgumentState 598 << "\n"); 599 600 // NOTE: If we want to do call site grouping it should happen here. 601 State ^= CBArgumentState; 602 return true; 603 } 604 605 /// Helper class for generic deduction: call site argument -> argument position. 606 template <typename AAType, typename BaseType, 607 typename StateType = typename AAType::StateType, 608 bool BridgeCallBaseContext = false> 609 struct AAArgumentFromCallSiteArguments : public BaseType { 610 AAArgumentFromCallSiteArguments(const IRPosition &IRP, Attributor &A) 611 : BaseType(IRP, A) {} 612 613 /// See AbstractAttribute::updateImpl(...). 614 ChangeStatus updateImpl(Attributor &A) override { 615 StateType S = StateType::getBestState(this->getState()); 616 617 if (BridgeCallBaseContext) { 618 bool Success = 619 getArgumentStateFromCallBaseContext<AAType, BaseType, StateType>( 620 A, *this, this->getIRPosition(), S); 621 if (Success) 622 return clampStateAndIndicateChange<StateType>(this->getState(), S); 623 } 624 clampCallSiteArgumentStates<AAType, StateType>(A, *this, S); 625 626 // TODO: If we know we visited all incoming values, thus no are assumed 627 // dead, we can take the known information from the state T. 628 return clampStateAndIndicateChange<StateType>(this->getState(), S); 629 } 630 }; 631 632 /// Helper class for generic replication: function returned -> cs returned. 633 template <typename AAType, typename BaseType, 634 typename StateType = typename BaseType::StateType, 635 bool IntroduceCallBaseContext = false> 636 struct AACallSiteReturnedFromReturned : public BaseType { 637 AACallSiteReturnedFromReturned(const IRPosition &IRP, Attributor &A) 638 : BaseType(IRP, A) {} 639 640 /// See AbstractAttribute::updateImpl(...). 641 ChangeStatus updateImpl(Attributor &A) override { 642 assert(this->getIRPosition().getPositionKind() == 643 IRPosition::IRP_CALL_SITE_RETURNED && 644 "Can only wrap function returned positions for call site returned " 645 "positions!"); 646 auto &S = this->getState(); 647 648 const Function *AssociatedFunction = 649 this->getIRPosition().getAssociatedFunction(); 650 if (!AssociatedFunction) 651 return S.indicatePessimisticFixpoint(); 652 653 CallBase &CBContext = static_cast<CallBase &>(this->getAnchorValue()); 654 if (IntroduceCallBaseContext) 655 LLVM_DEBUG(dbgs() << "[Attributor] Introducing call base context:" 656 << CBContext << "\n"); 657 658 IRPosition FnPos = IRPosition::returned( 659 *AssociatedFunction, IntroduceCallBaseContext ? &CBContext : nullptr); 660 const AAType &AA = A.getAAFor<AAType>(*this, FnPos, DepClassTy::REQUIRED); 661 return clampStateAndIndicateChange(S, AA.getState()); 662 } 663 }; 664 665 /// Helper function to accumulate uses. 666 template <class AAType, typename StateType = typename AAType::StateType> 667 static void followUsesInContext(AAType &AA, Attributor &A, 668 MustBeExecutedContextExplorer &Explorer, 669 const Instruction *CtxI, 670 SetVector<const Use *> &Uses, 671 StateType &State) { 672 auto EIt = Explorer.begin(CtxI), EEnd = Explorer.end(CtxI); 673 for (unsigned u = 0; u < Uses.size(); ++u) { 674 const Use *U = Uses[u]; 675 if (const Instruction *UserI = dyn_cast<Instruction>(U->getUser())) { 676 bool Found = Explorer.findInContextOf(UserI, EIt, EEnd); 677 if (Found && AA.followUseInMBEC(A, U, UserI, State)) 678 for (const Use &Us : UserI->uses()) 679 Uses.insert(&Us); 680 } 681 } 682 } 683 684 /// Use the must-be-executed-context around \p I to add information into \p S. 685 /// The AAType class is required to have `followUseInMBEC` method with the 686 /// following signature and behaviour: 687 /// 688 /// bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I) 689 /// U - Underlying use. 690 /// I - The user of the \p U. 691 /// Returns true if the value should be tracked transitively. 692 /// 693 template <class AAType, typename StateType = typename AAType::StateType> 694 static void followUsesInMBEC(AAType &AA, Attributor &A, StateType &S, 695 Instruction &CtxI) { 696 697 // Container for (transitive) uses of the associated value. 698 SetVector<const Use *> Uses; 699 for (const Use &U : AA.getIRPosition().getAssociatedValue().uses()) 700 Uses.insert(&U); 701 702 MustBeExecutedContextExplorer &Explorer = 703 A.getInfoCache().getMustBeExecutedContextExplorer(); 704 705 followUsesInContext<AAType>(AA, A, Explorer, &CtxI, Uses, S); 706 707 if (S.isAtFixpoint()) 708 return; 709 710 SmallVector<const BranchInst *, 4> BrInsts; 711 auto Pred = [&](const Instruction *I) { 712 if (const BranchInst *Br = dyn_cast<BranchInst>(I)) 713 if (Br->isConditional()) 714 BrInsts.push_back(Br); 715 return true; 716 }; 717 718 // Here, accumulate conditional branch instructions in the context. We 719 // explore the child paths and collect the known states. The disjunction of 720 // those states can be merged to its own state. Let ParentState_i be a state 721 // to indicate the known information for an i-th branch instruction in the 722 // context. ChildStates are created for its successors respectively. 723 // 724 // ParentS_1 = ChildS_{1, 1} /\ ChildS_{1, 2} /\ ... /\ ChildS_{1, n_1} 725 // ParentS_2 = ChildS_{2, 1} /\ ChildS_{2, 2} /\ ... /\ ChildS_{2, n_2} 726 // ... 727 // ParentS_m = ChildS_{m, 1} /\ ChildS_{m, 2} /\ ... /\ ChildS_{m, n_m} 728 // 729 // Known State |= ParentS_1 \/ ParentS_2 \/... \/ ParentS_m 730 // 731 // FIXME: Currently, recursive branches are not handled. For example, we 732 // can't deduce that ptr must be dereferenced in below function. 733 // 734 // void f(int a, int c, int *ptr) { 735 // if(a) 736 // if (b) { 737 // *ptr = 0; 738 // } else { 739 // *ptr = 1; 740 // } 741 // else { 742 // if (b) { 743 // *ptr = 0; 744 // } else { 745 // *ptr = 1; 746 // } 747 // } 748 // } 749 750 Explorer.checkForAllContext(&CtxI, Pred); 751 for (const BranchInst *Br : BrInsts) { 752 StateType ParentState; 753 754 // The known state of the parent state is a conjunction of children's 755 // known states so it is initialized with a best state. 756 ParentState.indicateOptimisticFixpoint(); 757 758 for (const BasicBlock *BB : Br->successors()) { 759 StateType ChildState; 760 761 size_t BeforeSize = Uses.size(); 762 followUsesInContext(AA, A, Explorer, &BB->front(), Uses, ChildState); 763 764 // Erase uses which only appear in the child. 765 for (auto It = Uses.begin() + BeforeSize; It != Uses.end();) 766 It = Uses.erase(It); 767 768 ParentState &= ChildState; 769 } 770 771 // Use only known state. 772 S += ParentState; 773 } 774 } 775 776 /// ------------------------ PointerInfo --------------------------------------- 777 778 namespace llvm { 779 namespace AA { 780 namespace PointerInfo { 781 782 /// An access kind description as used by AAPointerInfo. 783 struct OffsetAndSize; 784 785 struct State; 786 787 } // namespace PointerInfo 788 } // namespace AA 789 790 /// Helper for AA::PointerInfo::Acccess DenseMap/Set usage. 791 template <> 792 struct DenseMapInfo<AAPointerInfo::Access> : DenseMapInfo<Instruction *> { 793 using Access = AAPointerInfo::Access; 794 static inline Access getEmptyKey(); 795 static inline Access getTombstoneKey(); 796 static unsigned getHashValue(const Access &A); 797 static bool isEqual(const Access &LHS, const Access &RHS); 798 }; 799 800 /// Helper that allows OffsetAndSize as a key in a DenseMap. 801 template <> 802 struct DenseMapInfo<AA::PointerInfo ::OffsetAndSize> 803 : DenseMapInfo<std::pair<int64_t, int64_t>> {}; 804 805 /// Helper for AA::PointerInfo::Acccess DenseMap/Set usage ignoring everythign 806 /// but the instruction 807 struct AccessAsInstructionInfo : DenseMapInfo<Instruction *> { 808 using Base = DenseMapInfo<Instruction *>; 809 using Access = AAPointerInfo::Access; 810 static inline Access getEmptyKey(); 811 static inline Access getTombstoneKey(); 812 static unsigned getHashValue(const Access &A); 813 static bool isEqual(const Access &LHS, const Access &RHS); 814 }; 815 816 } // namespace llvm 817 818 /// Helper to represent an access offset and size, with logic to deal with 819 /// uncertainty and check for overlapping accesses. 820 struct AA::PointerInfo::OffsetAndSize : public std::pair<int64_t, int64_t> { 821 using BaseTy = std::pair<int64_t, int64_t>; 822 OffsetAndSize(int64_t Offset, int64_t Size) : BaseTy(Offset, Size) {} 823 OffsetAndSize(const BaseTy &P) : BaseTy(P) {} 824 int64_t getOffset() const { return first; } 825 int64_t getSize() const { return second; } 826 static OffsetAndSize getUnknown() { return OffsetAndSize(Unknown, Unknown); } 827 828 /// Return true if this offset and size pair might describe an address that 829 /// overlaps with \p OAS. 830 bool mayOverlap(const OffsetAndSize &OAS) const { 831 // Any unknown value and we are giving up -> overlap. 832 if (OAS.getOffset() == OffsetAndSize::Unknown || 833 OAS.getSize() == OffsetAndSize::Unknown || 834 getOffset() == OffsetAndSize::Unknown || 835 getSize() == OffsetAndSize::Unknown) 836 return true; 837 838 // Check if one offset point is in the other interval [offset, offset+size]. 839 return OAS.getOffset() + OAS.getSize() > getOffset() && 840 OAS.getOffset() < getOffset() + getSize(); 841 } 842 843 /// Constant used to represent unknown offset or sizes. 844 static constexpr int64_t Unknown = 1 << 31; 845 }; 846 847 /// Implementation of the DenseMapInfo. 848 /// 849 ///{ 850 inline llvm::AccessAsInstructionInfo::Access 851 llvm::AccessAsInstructionInfo::getEmptyKey() { 852 return Access(Base::getEmptyKey(), nullptr, AAPointerInfo::AK_READ, nullptr); 853 } 854 inline llvm::AccessAsInstructionInfo::Access 855 llvm::AccessAsInstructionInfo::getTombstoneKey() { 856 return Access(Base::getTombstoneKey(), nullptr, AAPointerInfo::AK_READ, 857 nullptr); 858 } 859 unsigned llvm::AccessAsInstructionInfo::getHashValue( 860 const llvm::AccessAsInstructionInfo::Access &A) { 861 return Base::getHashValue(A.getRemoteInst()); 862 } 863 bool llvm::AccessAsInstructionInfo::isEqual( 864 const llvm::AccessAsInstructionInfo::Access &LHS, 865 const llvm::AccessAsInstructionInfo::Access &RHS) { 866 return LHS.getRemoteInst() == RHS.getRemoteInst(); 867 } 868 inline llvm::DenseMapInfo<AAPointerInfo::Access>::Access 869 llvm::DenseMapInfo<AAPointerInfo::Access>::getEmptyKey() { 870 return AAPointerInfo::Access(nullptr, nullptr, AAPointerInfo::AK_READ, 871 nullptr); 872 } 873 inline llvm::DenseMapInfo<AAPointerInfo::Access>::Access 874 llvm::DenseMapInfo<AAPointerInfo::Access>::getTombstoneKey() { 875 return AAPointerInfo::Access(nullptr, nullptr, AAPointerInfo::AK_WRITE, 876 nullptr); 877 } 878 879 unsigned llvm::DenseMapInfo<AAPointerInfo::Access>::getHashValue( 880 const llvm::DenseMapInfo<AAPointerInfo::Access>::Access &A) { 881 return detail::combineHashValue( 882 DenseMapInfo<Instruction *>::getHashValue(A.getRemoteInst()), 883 (A.isWrittenValueYetUndetermined() 884 ? ~0 885 : DenseMapInfo<Value *>::getHashValue(A.getWrittenValue()))) + 886 A.getKind(); 887 } 888 889 bool llvm::DenseMapInfo<AAPointerInfo::Access>::isEqual( 890 const llvm::DenseMapInfo<AAPointerInfo::Access>::Access &LHS, 891 const llvm::DenseMapInfo<AAPointerInfo::Access>::Access &RHS) { 892 return LHS == RHS; 893 } 894 ///} 895 896 /// A type to track pointer/struct usage and accesses for AAPointerInfo. 897 struct AA::PointerInfo::State : public AbstractState { 898 899 /// Return the best possible representable state. 900 static State getBestState(const State &SIS) { return State(); } 901 902 /// Return the worst possible representable state. 903 static State getWorstState(const State &SIS) { 904 State R; 905 R.indicatePessimisticFixpoint(); 906 return R; 907 } 908 909 State() {} 910 State(const State &SIS) : AccessBins(SIS.AccessBins) {} 911 State(State &&SIS) : AccessBins(std::move(SIS.AccessBins)) {} 912 913 const State &getAssumed() const { return *this; } 914 915 /// See AbstractState::isValidState(). 916 bool isValidState() const override { return BS.isValidState(); } 917 918 /// See AbstractState::isAtFixpoint(). 919 bool isAtFixpoint() const override { return BS.isAtFixpoint(); } 920 921 /// See AbstractState::indicateOptimisticFixpoint(). 922 ChangeStatus indicateOptimisticFixpoint() override { 923 BS.indicateOptimisticFixpoint(); 924 return ChangeStatus::UNCHANGED; 925 } 926 927 /// See AbstractState::indicatePessimisticFixpoint(). 928 ChangeStatus indicatePessimisticFixpoint() override { 929 BS.indicatePessimisticFixpoint(); 930 return ChangeStatus::CHANGED; 931 } 932 933 State &operator=(const State &R) { 934 if (this == &R) 935 return *this; 936 BS = R.BS; 937 AccessBins = R.AccessBins; 938 return *this; 939 } 940 941 State &operator=(State &&R) { 942 if (this == &R) 943 return *this; 944 std::swap(BS, R.BS); 945 std::swap(AccessBins, R.AccessBins); 946 return *this; 947 } 948 949 bool operator==(const State &R) const { 950 if (BS != R.BS) 951 return false; 952 if (AccessBins.size() != R.AccessBins.size()) 953 return false; 954 auto It = begin(), RIt = R.begin(), E = end(); 955 while (It != E) { 956 if (It->getFirst() != RIt->getFirst()) 957 return false; 958 auto &Accs = It->getSecond(); 959 auto &RAccs = RIt->getSecond(); 960 if (Accs.size() != RAccs.size()) 961 return false; 962 auto AccIt = Accs.begin(), RAccIt = RAccs.begin(), AccE = Accs.end(); 963 while (AccIt != AccE) { 964 if (*AccIt != *RAccIt) 965 return false; 966 ++AccIt; 967 ++RAccIt; 968 } 969 ++It; 970 ++RIt; 971 } 972 return true; 973 } 974 bool operator!=(const State &R) const { return !(*this == R); } 975 976 /// We store accesses in a set with the instruction as key. 977 using Accesses = DenseSet<AAPointerInfo::Access, AccessAsInstructionInfo>; 978 979 /// We store all accesses in bins denoted by their offset and size. 980 using AccessBinsTy = DenseMap<OffsetAndSize, Accesses>; 981 982 AccessBinsTy::const_iterator begin() const { return AccessBins.begin(); } 983 AccessBinsTy::const_iterator end() const { return AccessBins.end(); } 984 985 protected: 986 /// The bins with all the accesses for the associated pointer. 987 DenseMap<OffsetAndSize, Accesses> AccessBins; 988 989 /// Add a new access to the state at offset \p Offset and with size \p Size. 990 /// The access is associated with \p I, writes \p Content (if anything), and 991 /// is of kind \p Kind. 992 /// \Returns CHANGED, if the state changed, UNCHANGED otherwise. 993 ChangeStatus addAccess(int64_t Offset, int64_t Size, Instruction &I, 994 Optional<Value *> Content, 995 AAPointerInfo::AccessKind Kind, Type *Ty, 996 Instruction *RemoteI = nullptr, 997 Accesses *BinPtr = nullptr) { 998 OffsetAndSize Key{Offset, Size}; 999 Accesses &Bin = BinPtr ? *BinPtr : AccessBins[Key]; 1000 AAPointerInfo::Access Acc(&I, RemoteI ? RemoteI : &I, Content, Kind, Ty); 1001 // Check if we have an access for this instruction in this bin, if not, 1002 // simply add it. 1003 auto It = Bin.find(Acc); 1004 if (It == Bin.end()) { 1005 Bin.insert(Acc); 1006 return ChangeStatus::CHANGED; 1007 } 1008 // If the existing access is the same as then new one, nothing changed. 1009 AAPointerInfo::Access Before = *It; 1010 // The new one will be combined with the existing one. 1011 *It &= Acc; 1012 return *It == Before ? ChangeStatus::UNCHANGED : ChangeStatus::CHANGED; 1013 } 1014 1015 /// See AAPointerInfo::forallInterferingAccesses. 1016 bool forallInterferingAccesses( 1017 Instruction &I, 1018 function_ref<bool(const AAPointerInfo::Access &, bool)> CB) const { 1019 if (!isValidState()) 1020 return false; 1021 // First find the offset and size of I. 1022 OffsetAndSize OAS(-1, -1); 1023 for (auto &It : AccessBins) { 1024 for (auto &Access : It.getSecond()) { 1025 if (Access.getRemoteInst() == &I) { 1026 OAS = It.getFirst(); 1027 break; 1028 } 1029 } 1030 if (OAS.getSize() != -1) 1031 break; 1032 } 1033 if (OAS.getSize() == -1) 1034 return true; 1035 1036 // Now that we have an offset and size, find all overlapping ones and use 1037 // the callback on the accesses. 1038 for (auto &It : AccessBins) { 1039 OffsetAndSize ItOAS = It.getFirst(); 1040 if (!OAS.mayOverlap(ItOAS)) 1041 continue; 1042 for (auto &Access : It.getSecond()) 1043 if (!CB(Access, OAS == ItOAS)) 1044 return false; 1045 } 1046 return true; 1047 } 1048 1049 private: 1050 /// State to track fixpoint and validity. 1051 BooleanState BS; 1052 }; 1053 1054 struct AAPointerInfoImpl 1055 : public StateWrapper<AA::PointerInfo::State, AAPointerInfo> { 1056 using BaseTy = StateWrapper<AA::PointerInfo::State, AAPointerInfo>; 1057 AAPointerInfoImpl(const IRPosition &IRP, Attributor &A) : BaseTy(IRP) {} 1058 1059 /// See AbstractAttribute::initialize(...). 1060 void initialize(Attributor &A) override { AAPointerInfo::initialize(A); } 1061 1062 /// See AbstractAttribute::getAsStr(). 1063 const std::string getAsStr() const override { 1064 return std::string("PointerInfo ") + 1065 (isValidState() ? (std::string("#") + 1066 std::to_string(AccessBins.size()) + " bins") 1067 : "<invalid>"); 1068 } 1069 1070 /// See AbstractAttribute::manifest(...). 1071 ChangeStatus manifest(Attributor &A) override { 1072 return AAPointerInfo::manifest(A); 1073 } 1074 1075 bool forallInterferingAccesses( 1076 LoadInst &LI, function_ref<bool(const AAPointerInfo::Access &, bool)> CB) 1077 const override { 1078 return State::forallInterferingAccesses(LI, CB); 1079 } 1080 bool forallInterferingAccesses( 1081 StoreInst &SI, function_ref<bool(const AAPointerInfo::Access &, bool)> CB) 1082 const override { 1083 return State::forallInterferingAccesses(SI, CB); 1084 } 1085 1086 ChangeStatus translateAndAddCalleeState(Attributor &A, 1087 const AAPointerInfo &CalleeAA, 1088 int64_t CallArgOffset, CallBase &CB) { 1089 using namespace AA::PointerInfo; 1090 if (!CalleeAA.getState().isValidState() || !isValidState()) 1091 return indicatePessimisticFixpoint(); 1092 1093 const auto &CalleeImplAA = static_cast<const AAPointerInfoImpl &>(CalleeAA); 1094 bool IsByval = CalleeImplAA.getAssociatedArgument()->hasByValAttr(); 1095 1096 // Combine the accesses bin by bin. 1097 ChangeStatus Changed = ChangeStatus::UNCHANGED; 1098 for (auto &It : CalleeImplAA.getState()) { 1099 OffsetAndSize OAS = OffsetAndSize::getUnknown(); 1100 if (CallArgOffset != OffsetAndSize::Unknown) 1101 OAS = OffsetAndSize(It.first.getOffset() + CallArgOffset, 1102 It.first.getSize()); 1103 Accesses &Bin = AccessBins[OAS]; 1104 for (const AAPointerInfo::Access &RAcc : It.second) { 1105 if (IsByval && !RAcc.isRead()) 1106 continue; 1107 bool UsedAssumedInformation = false; 1108 Optional<Value *> Content = A.translateArgumentToCallSiteContent( 1109 RAcc.getContent(), CB, *this, UsedAssumedInformation); 1110 AccessKind AK = 1111 AccessKind(RAcc.getKind() & (IsByval ? AccessKind::AK_READ 1112 : AccessKind::AK_READ_WRITE)); 1113 Changed = 1114 Changed | addAccess(OAS.getOffset(), OAS.getSize(), CB, Content, AK, 1115 RAcc.getType(), RAcc.getRemoteInst(), &Bin); 1116 } 1117 } 1118 return Changed; 1119 } 1120 1121 /// Statistic tracking for all AAPointerInfo implementations. 1122 /// See AbstractAttribute::trackStatistics(). 1123 void trackPointerInfoStatistics(const IRPosition &IRP) const {} 1124 }; 1125 1126 struct AAPointerInfoFloating : public AAPointerInfoImpl { 1127 using AccessKind = AAPointerInfo::AccessKind; 1128 AAPointerInfoFloating(const IRPosition &IRP, Attributor &A) 1129 : AAPointerInfoImpl(IRP, A) {} 1130 1131 /// See AbstractAttribute::initialize(...). 1132 void initialize(Attributor &A) override { AAPointerInfoImpl::initialize(A); } 1133 1134 /// Deal with an access and signal if it was handled successfully. 1135 bool handleAccess(Attributor &A, Instruction &I, Value &Ptr, 1136 Optional<Value *> Content, AccessKind Kind, int64_t Offset, 1137 ChangeStatus &Changed, Type *Ty, 1138 int64_t Size = AA::PointerInfo::OffsetAndSize::Unknown) { 1139 using namespace AA::PointerInfo; 1140 // No need to find a size if one is given or the offset is unknown. 1141 if (Offset != OffsetAndSize::Unknown && Size == OffsetAndSize::Unknown && 1142 Ty) { 1143 const DataLayout &DL = A.getDataLayout(); 1144 TypeSize AccessSize = DL.getTypeStoreSize(Ty); 1145 if (!AccessSize.isScalable()) 1146 Size = AccessSize.getFixedSize(); 1147 } 1148 Changed = Changed | addAccess(Offset, Size, I, Content, Kind, Ty); 1149 return true; 1150 }; 1151 1152 /// Helper struct, will support ranges eventually. 1153 struct OffsetInfo { 1154 int64_t Offset = AA::PointerInfo::OffsetAndSize::Unknown; 1155 1156 bool operator==(const OffsetInfo &OI) const { return Offset == OI.Offset; } 1157 }; 1158 1159 /// See AbstractAttribute::updateImpl(...). 1160 ChangeStatus updateImpl(Attributor &A) override { 1161 using namespace AA::PointerInfo; 1162 State S = getState(); 1163 ChangeStatus Changed = ChangeStatus::UNCHANGED; 1164 Value &AssociatedValue = getAssociatedValue(); 1165 1166 const DataLayout &DL = A.getDataLayout(); 1167 DenseMap<Value *, OffsetInfo> OffsetInfoMap; 1168 OffsetInfoMap[&AssociatedValue] = OffsetInfo{0}; 1169 1170 auto HandlePassthroughUser = [&](Value *Usr, OffsetInfo &PtrOI, 1171 bool &Follow) { 1172 OffsetInfo &UsrOI = OffsetInfoMap[Usr]; 1173 UsrOI = PtrOI; 1174 Follow = true; 1175 return true; 1176 }; 1177 1178 auto UsePred = [&](const Use &U, bool &Follow) -> bool { 1179 Value *CurPtr = U.get(); 1180 User *Usr = U.getUser(); 1181 LLVM_DEBUG(dbgs() << "[AAPointerInfo] Analyze " << *CurPtr << " in " 1182 << *Usr << "\n"); 1183 1184 OffsetInfo &PtrOI = OffsetInfoMap[CurPtr]; 1185 1186 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Usr)) { 1187 if (CE->isCast()) 1188 return HandlePassthroughUser(Usr, PtrOI, Follow); 1189 if (CE->isCompare()) 1190 return true; 1191 if (!CE->isGEPWithNoNotionalOverIndexing()) { 1192 LLVM_DEBUG(dbgs() << "[AAPointerInfo] Unhandled constant user " << *CE 1193 << "\n"); 1194 return false; 1195 } 1196 } 1197 if (auto *GEP = dyn_cast<GEPOperator>(Usr)) { 1198 OffsetInfo &UsrOI = OffsetInfoMap[Usr]; 1199 UsrOI = PtrOI; 1200 1201 // TODO: Use range information. 1202 if (PtrOI.Offset == OffsetAndSize::Unknown || 1203 !GEP->hasAllConstantIndices()) { 1204 UsrOI.Offset = OffsetAndSize::Unknown; 1205 Follow = true; 1206 return true; 1207 } 1208 1209 SmallVector<Value *, 8> Indices; 1210 for (Use &Idx : llvm::make_range(GEP->idx_begin(), GEP->idx_end())) { 1211 if (auto *CIdx = dyn_cast<ConstantInt>(Idx)) { 1212 Indices.push_back(CIdx); 1213 continue; 1214 } 1215 1216 LLVM_DEBUG(dbgs() << "[AAPointerInfo] Non constant GEP index " << *GEP 1217 << " : " << *Idx << "\n"); 1218 return false; 1219 } 1220 UsrOI.Offset = PtrOI.Offset + 1221 DL.getIndexedOffsetInType( 1222 CurPtr->getType()->getPointerElementType(), Indices); 1223 Follow = true; 1224 return true; 1225 } 1226 if (isa<CastInst>(Usr) || isa<SelectInst>(Usr)) 1227 return HandlePassthroughUser(Usr, PtrOI, Follow); 1228 1229 // For PHIs we need to take care of the recurrence explicitly as the value 1230 // might change while we iterate through a loop. For now, we give up if 1231 // the PHI is not invariant. 1232 if (isa<PHINode>(Usr)) { 1233 // Check if the PHI is invariant (so far). 1234 OffsetInfo &UsrOI = OffsetInfoMap[Usr]; 1235 if (UsrOI == PtrOI) 1236 return true; 1237 1238 // Check if the PHI operand has already an unknown offset as we can't 1239 // improve on that anymore. 1240 if (PtrOI.Offset == OffsetAndSize::Unknown) { 1241 UsrOI = PtrOI; 1242 Follow = true; 1243 return true; 1244 } 1245 1246 // Check if the PHI operand is not dependent on the PHI itself. 1247 APInt Offset(DL.getIndexTypeSizeInBits(AssociatedValue.getType()), 0); 1248 if (&AssociatedValue == CurPtr->stripAndAccumulateConstantOffsets( 1249 DL, Offset, /* AllowNonInbounds */ true)) { 1250 if (Offset != PtrOI.Offset) { 1251 LLVM_DEBUG(dbgs() 1252 << "[AAPointerInfo] PHI operand pointer offset mismatch " 1253 << *CurPtr << " in " << *Usr << "\n"); 1254 return false; 1255 } 1256 return HandlePassthroughUser(Usr, PtrOI, Follow); 1257 } 1258 1259 // TODO: Approximate in case we know the direction of the recurrence. 1260 LLVM_DEBUG(dbgs() << "[AAPointerInfo] PHI operand is too complex " 1261 << *CurPtr << " in " << *Usr << "\n"); 1262 UsrOI = PtrOI; 1263 UsrOI.Offset = OffsetAndSize::Unknown; 1264 Follow = true; 1265 return true; 1266 } 1267 1268 if (auto *LoadI = dyn_cast<LoadInst>(Usr)) 1269 return handleAccess(A, *LoadI, *CurPtr, /* Content */ nullptr, 1270 AccessKind::AK_READ, PtrOI.Offset, Changed, 1271 LoadI->getType()); 1272 if (auto *StoreI = dyn_cast<StoreInst>(Usr)) { 1273 if (StoreI->getValueOperand() == CurPtr) { 1274 LLVM_DEBUG(dbgs() << "[AAPointerInfo] Escaping use in store " 1275 << *StoreI << "\n"); 1276 return false; 1277 } 1278 bool UsedAssumedInformation = false; 1279 Optional<Value *> Content = A.getAssumedSimplified( 1280 *StoreI->getValueOperand(), *this, UsedAssumedInformation); 1281 return handleAccess(A, *StoreI, *CurPtr, Content, AccessKind::AK_WRITE, 1282 PtrOI.Offset, Changed, 1283 StoreI->getValueOperand()->getType()); 1284 } 1285 if (auto *CB = dyn_cast<CallBase>(Usr)) { 1286 if (CB->isLifetimeStartOrEnd()) 1287 return true; 1288 if (CB->isArgOperand(&U)) { 1289 unsigned ArgNo = CB->getArgOperandNo(&U); 1290 const auto &CSArgPI = A.getAAFor<AAPointerInfo>( 1291 *this, IRPosition::callsite_argument(*CB, ArgNo), 1292 DepClassTy::REQUIRED); 1293 Changed = translateAndAddCalleeState(A, CSArgPI, PtrOI.Offset, *CB) | 1294 Changed; 1295 return true; 1296 } 1297 LLVM_DEBUG(dbgs() << "[AAPointerInfo] Call user not handled " << *CB 1298 << "\n"); 1299 // TODO: Allow some call uses 1300 return false; 1301 } 1302 1303 LLVM_DEBUG(dbgs() << "[AAPointerInfo] User not handled " << *Usr << "\n"); 1304 return false; 1305 }; 1306 if (!A.checkForAllUses(UsePred, *this, AssociatedValue, 1307 /* CheckBBLivenessOnly */ true)) 1308 return indicatePessimisticFixpoint(); 1309 1310 LLVM_DEBUG({ 1311 dbgs() << "Accesses by bin after update:\n"; 1312 for (auto &It : AccessBins) { 1313 dbgs() << "[" << It.first.getOffset() << "-" 1314 << It.first.getOffset() + It.first.getSize() 1315 << "] : " << It.getSecond().size() << "\n"; 1316 for (auto &Acc : It.getSecond()) { 1317 dbgs() << " - " << Acc.getKind() << " - " << *Acc.getLocalInst() 1318 << "\n"; 1319 if (Acc.getLocalInst() != Acc.getRemoteInst()) 1320 dbgs() << " --> " 1321 << *Acc.getRemoteInst() << "\n"; 1322 if (!Acc.isWrittenValueYetUndetermined()) 1323 dbgs() << " - " << Acc.getWrittenValue() << "\n"; 1324 } 1325 } 1326 }); 1327 1328 return Changed; 1329 } 1330 1331 /// See AbstractAttribute::trackStatistics() 1332 void trackStatistics() const override { 1333 AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition()); 1334 } 1335 }; 1336 1337 struct AAPointerInfoReturned final : AAPointerInfoImpl { 1338 AAPointerInfoReturned(const IRPosition &IRP, Attributor &A) 1339 : AAPointerInfoImpl(IRP, A) {} 1340 1341 /// See AbstractAttribute::updateImpl(...). 1342 ChangeStatus updateImpl(Attributor &A) override { 1343 return indicatePessimisticFixpoint(); 1344 } 1345 1346 /// See AbstractAttribute::trackStatistics() 1347 void trackStatistics() const override { 1348 AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition()); 1349 } 1350 }; 1351 1352 struct AAPointerInfoArgument final : AAPointerInfoFloating { 1353 AAPointerInfoArgument(const IRPosition &IRP, Attributor &A) 1354 : AAPointerInfoFloating(IRP, A) {} 1355 1356 /// See AbstractAttribute::initialize(...). 1357 void initialize(Attributor &A) override { 1358 AAPointerInfoFloating::initialize(A); 1359 if (getAnchorScope()->isDeclaration()) 1360 indicatePessimisticFixpoint(); 1361 } 1362 1363 /// See AbstractAttribute::trackStatistics() 1364 void trackStatistics() const override { 1365 AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition()); 1366 } 1367 }; 1368 1369 struct AAPointerInfoCallSiteArgument final : AAPointerInfoFloating { 1370 AAPointerInfoCallSiteArgument(const IRPosition &IRP, Attributor &A) 1371 : AAPointerInfoFloating(IRP, A) {} 1372 1373 /// See AbstractAttribute::updateImpl(...). 1374 ChangeStatus updateImpl(Attributor &A) override { 1375 using namespace AA::PointerInfo; 1376 // We handle memory intrinsics explicitly, at least the first (= 1377 // destination) and second (=source) arguments as we know how they are 1378 // accessed. 1379 if (auto *MI = dyn_cast_or_null<MemIntrinsic>(getCtxI())) { 1380 ConstantInt *Length = dyn_cast<ConstantInt>(MI->getLength()); 1381 int64_t LengthVal = OffsetAndSize::Unknown; 1382 if (Length) 1383 LengthVal = Length->getSExtValue(); 1384 Value &Ptr = getAssociatedValue(); 1385 unsigned ArgNo = getIRPosition().getCallSiteArgNo(); 1386 ChangeStatus Changed; 1387 if (ArgNo == 0) { 1388 handleAccess(A, *MI, Ptr, nullptr, AccessKind::AK_WRITE, 0, Changed, 1389 nullptr, LengthVal); 1390 } else if (ArgNo == 1) { 1391 handleAccess(A, *MI, Ptr, nullptr, AccessKind::AK_READ, 0, Changed, 1392 nullptr, LengthVal); 1393 } else { 1394 LLVM_DEBUG(dbgs() << "[AAPointerInfo] Unhandled memory intrinsic " 1395 << *MI << "\n"); 1396 return indicatePessimisticFixpoint(); 1397 } 1398 return Changed; 1399 } 1400 1401 // TODO: Once we have call site specific value information we can provide 1402 // call site specific liveness information and then it makes 1403 // sense to specialize attributes for call sites arguments instead of 1404 // redirecting requests to the callee argument. 1405 Argument *Arg = getAssociatedArgument(); 1406 if (!Arg) 1407 return indicatePessimisticFixpoint(); 1408 const IRPosition &ArgPos = IRPosition::argument(*Arg); 1409 auto &ArgAA = 1410 A.getAAFor<AAPointerInfo>(*this, ArgPos, DepClassTy::REQUIRED); 1411 return translateAndAddCalleeState(A, ArgAA, 0, *cast<CallBase>(getCtxI())); 1412 } 1413 1414 /// See AbstractAttribute::trackStatistics() 1415 void trackStatistics() const override { 1416 AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition()); 1417 } 1418 }; 1419 1420 struct AAPointerInfoCallSiteReturned final : AAPointerInfoFloating { 1421 AAPointerInfoCallSiteReturned(const IRPosition &IRP, Attributor &A) 1422 : AAPointerInfoFloating(IRP, A) {} 1423 1424 /// See AbstractAttribute::trackStatistics() 1425 void trackStatistics() const override { 1426 AAPointerInfoImpl::trackPointerInfoStatistics(getIRPosition()); 1427 } 1428 }; 1429 1430 /// -----------------------NoUnwind Function Attribute-------------------------- 1431 1432 struct AANoUnwindImpl : AANoUnwind { 1433 AANoUnwindImpl(const IRPosition &IRP, Attributor &A) : AANoUnwind(IRP, A) {} 1434 1435 const std::string getAsStr() const override { 1436 return getAssumed() ? "nounwind" : "may-unwind"; 1437 } 1438 1439 /// See AbstractAttribute::updateImpl(...). 1440 ChangeStatus updateImpl(Attributor &A) override { 1441 auto Opcodes = { 1442 (unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr, 1443 (unsigned)Instruction::Call, (unsigned)Instruction::CleanupRet, 1444 (unsigned)Instruction::CatchSwitch, (unsigned)Instruction::Resume}; 1445 1446 auto CheckForNoUnwind = [&](Instruction &I) { 1447 if (!I.mayThrow()) 1448 return true; 1449 1450 if (const auto *CB = dyn_cast<CallBase>(&I)) { 1451 const auto &NoUnwindAA = A.getAAFor<AANoUnwind>( 1452 *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED); 1453 return NoUnwindAA.isAssumedNoUnwind(); 1454 } 1455 return false; 1456 }; 1457 1458 bool UsedAssumedInformation = false; 1459 if (!A.checkForAllInstructions(CheckForNoUnwind, *this, Opcodes, 1460 UsedAssumedInformation)) 1461 return indicatePessimisticFixpoint(); 1462 1463 return ChangeStatus::UNCHANGED; 1464 } 1465 }; 1466 1467 struct AANoUnwindFunction final : public AANoUnwindImpl { 1468 AANoUnwindFunction(const IRPosition &IRP, Attributor &A) 1469 : AANoUnwindImpl(IRP, A) {} 1470 1471 /// See AbstractAttribute::trackStatistics() 1472 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nounwind) } 1473 }; 1474 1475 /// NoUnwind attribute deduction for a call sites. 1476 struct AANoUnwindCallSite final : AANoUnwindImpl { 1477 AANoUnwindCallSite(const IRPosition &IRP, Attributor &A) 1478 : AANoUnwindImpl(IRP, A) {} 1479 1480 /// See AbstractAttribute::initialize(...). 1481 void initialize(Attributor &A) override { 1482 AANoUnwindImpl::initialize(A); 1483 Function *F = getAssociatedFunction(); 1484 if (!F || F->isDeclaration()) 1485 indicatePessimisticFixpoint(); 1486 } 1487 1488 /// See AbstractAttribute::updateImpl(...). 1489 ChangeStatus updateImpl(Attributor &A) override { 1490 // TODO: Once we have call site specific value information we can provide 1491 // call site specific liveness information and then it makes 1492 // sense to specialize attributes for call sites arguments instead of 1493 // redirecting requests to the callee argument. 1494 Function *F = getAssociatedFunction(); 1495 const IRPosition &FnPos = IRPosition::function(*F); 1496 auto &FnAA = A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::REQUIRED); 1497 return clampStateAndIndicateChange(getState(), FnAA.getState()); 1498 } 1499 1500 /// See AbstractAttribute::trackStatistics() 1501 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nounwind); } 1502 }; 1503 1504 /// --------------------- Function Return Values ------------------------------- 1505 1506 /// "Attribute" that collects all potential returned values and the return 1507 /// instructions that they arise from. 1508 /// 1509 /// If there is a unique returned value R, the manifest method will: 1510 /// - mark R with the "returned" attribute, if R is an argument. 1511 class AAReturnedValuesImpl : public AAReturnedValues, public AbstractState { 1512 1513 /// Mapping of values potentially returned by the associated function to the 1514 /// return instructions that might return them. 1515 MapVector<Value *, SmallSetVector<ReturnInst *, 4>> ReturnedValues; 1516 1517 /// State flags 1518 /// 1519 ///{ 1520 bool IsFixed = false; 1521 bool IsValidState = true; 1522 ///} 1523 1524 public: 1525 AAReturnedValuesImpl(const IRPosition &IRP, Attributor &A) 1526 : AAReturnedValues(IRP, A) {} 1527 1528 /// See AbstractAttribute::initialize(...). 1529 void initialize(Attributor &A) override { 1530 // Reset the state. 1531 IsFixed = false; 1532 IsValidState = true; 1533 ReturnedValues.clear(); 1534 1535 Function *F = getAssociatedFunction(); 1536 if (!F || F->isDeclaration()) { 1537 indicatePessimisticFixpoint(); 1538 return; 1539 } 1540 assert(!F->getReturnType()->isVoidTy() && 1541 "Did not expect a void return type!"); 1542 1543 // The map from instruction opcodes to those instructions in the function. 1544 auto &OpcodeInstMap = A.getInfoCache().getOpcodeInstMapForFunction(*F); 1545 1546 // Look through all arguments, if one is marked as returned we are done. 1547 for (Argument &Arg : F->args()) { 1548 if (Arg.hasReturnedAttr()) { 1549 auto &ReturnInstSet = ReturnedValues[&Arg]; 1550 if (auto *Insts = OpcodeInstMap.lookup(Instruction::Ret)) 1551 for (Instruction *RI : *Insts) 1552 ReturnInstSet.insert(cast<ReturnInst>(RI)); 1553 1554 indicateOptimisticFixpoint(); 1555 return; 1556 } 1557 } 1558 1559 if (!A.isFunctionIPOAmendable(*F)) 1560 indicatePessimisticFixpoint(); 1561 } 1562 1563 /// See AbstractAttribute::manifest(...). 1564 ChangeStatus manifest(Attributor &A) override; 1565 1566 /// See AbstractAttribute::getState(...). 1567 AbstractState &getState() override { return *this; } 1568 1569 /// See AbstractAttribute::getState(...). 1570 const AbstractState &getState() const override { return *this; } 1571 1572 /// See AbstractAttribute::updateImpl(Attributor &A). 1573 ChangeStatus updateImpl(Attributor &A) override; 1574 1575 llvm::iterator_range<iterator> returned_values() override { 1576 return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end()); 1577 } 1578 1579 llvm::iterator_range<const_iterator> returned_values() const override { 1580 return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end()); 1581 } 1582 1583 /// Return the number of potential return values, -1 if unknown. 1584 size_t getNumReturnValues() const override { 1585 return isValidState() ? ReturnedValues.size() : -1; 1586 } 1587 1588 /// Return an assumed unique return value if a single candidate is found. If 1589 /// there cannot be one, return a nullptr. If it is not clear yet, return the 1590 /// Optional::NoneType. 1591 Optional<Value *> getAssumedUniqueReturnValue(Attributor &A) const; 1592 1593 /// See AbstractState::checkForAllReturnedValues(...). 1594 bool checkForAllReturnedValuesAndReturnInsts( 1595 function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> Pred) 1596 const override; 1597 1598 /// Pretty print the attribute similar to the IR representation. 1599 const std::string getAsStr() const override; 1600 1601 /// See AbstractState::isAtFixpoint(). 1602 bool isAtFixpoint() const override { return IsFixed; } 1603 1604 /// See AbstractState::isValidState(). 1605 bool isValidState() const override { return IsValidState; } 1606 1607 /// See AbstractState::indicateOptimisticFixpoint(...). 1608 ChangeStatus indicateOptimisticFixpoint() override { 1609 IsFixed = true; 1610 return ChangeStatus::UNCHANGED; 1611 } 1612 1613 ChangeStatus indicatePessimisticFixpoint() override { 1614 IsFixed = true; 1615 IsValidState = false; 1616 return ChangeStatus::CHANGED; 1617 } 1618 }; 1619 1620 ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) { 1621 ChangeStatus Changed = ChangeStatus::UNCHANGED; 1622 1623 // Bookkeeping. 1624 assert(isValidState()); 1625 STATS_DECLTRACK(KnownReturnValues, FunctionReturn, 1626 "Number of function with known return values"); 1627 1628 // Check if we have an assumed unique return value that we could manifest. 1629 Optional<Value *> UniqueRV = getAssumedUniqueReturnValue(A); 1630 1631 if (!UniqueRV.hasValue() || !UniqueRV.getValue()) 1632 return Changed; 1633 1634 // Bookkeeping. 1635 STATS_DECLTRACK(UniqueReturnValue, FunctionReturn, 1636 "Number of function with unique return"); 1637 // If the assumed unique return value is an argument, annotate it. 1638 if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) { 1639 if (UniqueRVArg->getType()->canLosslesslyBitCastTo( 1640 getAssociatedFunction()->getReturnType())) { 1641 getIRPosition() = IRPosition::argument(*UniqueRVArg); 1642 Changed = IRAttribute::manifest(A); 1643 } 1644 } 1645 return Changed; 1646 } 1647 1648 const std::string AAReturnedValuesImpl::getAsStr() const { 1649 return (isAtFixpoint() ? "returns(#" : "may-return(#") + 1650 (isValidState() ? std::to_string(getNumReturnValues()) : "?") + ")"; 1651 } 1652 1653 Optional<Value *> 1654 AAReturnedValuesImpl::getAssumedUniqueReturnValue(Attributor &A) const { 1655 // If checkForAllReturnedValues provides a unique value, ignoring potential 1656 // undef values that can also be present, it is assumed to be the actual 1657 // return value and forwarded to the caller of this method. If there are 1658 // multiple, a nullptr is returned indicating there cannot be a unique 1659 // returned value. 1660 Optional<Value *> UniqueRV; 1661 Type *Ty = getAssociatedFunction()->getReturnType(); 1662 1663 auto Pred = [&](Value &RV) -> bool { 1664 UniqueRV = AA::combineOptionalValuesInAAValueLatice(UniqueRV, &RV, Ty); 1665 return UniqueRV != Optional<Value *>(nullptr); 1666 }; 1667 1668 if (!A.checkForAllReturnedValues(Pred, *this)) 1669 UniqueRV = nullptr; 1670 1671 return UniqueRV; 1672 } 1673 1674 bool AAReturnedValuesImpl::checkForAllReturnedValuesAndReturnInsts( 1675 function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> Pred) 1676 const { 1677 if (!isValidState()) 1678 return false; 1679 1680 // Check all returned values but ignore call sites as long as we have not 1681 // encountered an overdefined one during an update. 1682 for (auto &It : ReturnedValues) { 1683 Value *RV = It.first; 1684 if (!Pred(*RV, It.second)) 1685 return false; 1686 } 1687 1688 return true; 1689 } 1690 1691 ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) { 1692 ChangeStatus Changed = ChangeStatus::UNCHANGED; 1693 1694 auto ReturnValueCB = [&](Value &V, const Instruction *CtxI, ReturnInst &Ret, 1695 bool) -> bool { 1696 bool UsedAssumedInformation = false; 1697 Optional<Value *> SimpleRetVal = 1698 A.getAssumedSimplified(V, *this, UsedAssumedInformation); 1699 if (!SimpleRetVal.hasValue()) 1700 return true; 1701 if (!SimpleRetVal.getValue()) 1702 return false; 1703 Value *RetVal = *SimpleRetVal; 1704 assert(AA::isValidInScope(*RetVal, Ret.getFunction()) && 1705 "Assumed returned value should be valid in function scope!"); 1706 if (ReturnedValues[RetVal].insert(&Ret)) 1707 Changed = ChangeStatus::CHANGED; 1708 return true; 1709 }; 1710 1711 auto ReturnInstCB = [&](Instruction &I) { 1712 ReturnInst &Ret = cast<ReturnInst>(I); 1713 return genericValueTraversal<ReturnInst>( 1714 A, IRPosition::value(*Ret.getReturnValue()), *this, Ret, ReturnValueCB, 1715 &I); 1716 }; 1717 1718 // Discover returned values from all live returned instructions in the 1719 // associated function. 1720 bool UsedAssumedInformation = false; 1721 if (!A.checkForAllInstructions(ReturnInstCB, *this, {Instruction::Ret}, 1722 UsedAssumedInformation)) 1723 return indicatePessimisticFixpoint(); 1724 return Changed; 1725 } 1726 1727 struct AAReturnedValuesFunction final : public AAReturnedValuesImpl { 1728 AAReturnedValuesFunction(const IRPosition &IRP, Attributor &A) 1729 : AAReturnedValuesImpl(IRP, A) {} 1730 1731 /// See AbstractAttribute::trackStatistics() 1732 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(returned) } 1733 }; 1734 1735 /// Returned values information for a call sites. 1736 struct AAReturnedValuesCallSite final : AAReturnedValuesImpl { 1737 AAReturnedValuesCallSite(const IRPosition &IRP, Attributor &A) 1738 : AAReturnedValuesImpl(IRP, A) {} 1739 1740 /// See AbstractAttribute::initialize(...). 1741 void initialize(Attributor &A) override { 1742 // TODO: Once we have call site specific value information we can provide 1743 // call site specific liveness information and then it makes 1744 // sense to specialize attributes for call sites instead of 1745 // redirecting requests to the callee. 1746 llvm_unreachable("Abstract attributes for returned values are not " 1747 "supported for call sites yet!"); 1748 } 1749 1750 /// See AbstractAttribute::updateImpl(...). 1751 ChangeStatus updateImpl(Attributor &A) override { 1752 return indicatePessimisticFixpoint(); 1753 } 1754 1755 /// See AbstractAttribute::trackStatistics() 1756 void trackStatistics() const override {} 1757 }; 1758 1759 /// ------------------------ NoSync Function Attribute ------------------------- 1760 1761 struct AANoSyncImpl : AANoSync { 1762 AANoSyncImpl(const IRPosition &IRP, Attributor &A) : AANoSync(IRP, A) {} 1763 1764 const std::string getAsStr() const override { 1765 return getAssumed() ? "nosync" : "may-sync"; 1766 } 1767 1768 /// See AbstractAttribute::updateImpl(...). 1769 ChangeStatus updateImpl(Attributor &A) override; 1770 1771 /// Helper function used to determine whether an instruction is non-relaxed 1772 /// atomic. In other words, if an atomic instruction does not have unordered 1773 /// or monotonic ordering 1774 static bool isNonRelaxedAtomic(Instruction *I); 1775 1776 /// Helper function specific for intrinsics which are potentially volatile 1777 static bool isNoSyncIntrinsic(Instruction *I); 1778 }; 1779 1780 bool AANoSyncImpl::isNonRelaxedAtomic(Instruction *I) { 1781 if (!I->isAtomic()) 1782 return false; 1783 1784 if (auto *FI = dyn_cast<FenceInst>(I)) 1785 // All legal orderings for fence are stronger than monotonic. 1786 return FI->getSyncScopeID() != SyncScope::SingleThread; 1787 else if (auto *AI = dyn_cast<AtomicCmpXchgInst>(I)) { 1788 // Unordered is not a legal ordering for cmpxchg. 1789 return (AI->getSuccessOrdering() != AtomicOrdering::Monotonic || 1790 AI->getFailureOrdering() != AtomicOrdering::Monotonic); 1791 } 1792 1793 AtomicOrdering Ordering; 1794 switch (I->getOpcode()) { 1795 case Instruction::AtomicRMW: 1796 Ordering = cast<AtomicRMWInst>(I)->getOrdering(); 1797 break; 1798 case Instruction::Store: 1799 Ordering = cast<StoreInst>(I)->getOrdering(); 1800 break; 1801 case Instruction::Load: 1802 Ordering = cast<LoadInst>(I)->getOrdering(); 1803 break; 1804 default: 1805 llvm_unreachable( 1806 "New atomic operations need to be known in the attributor."); 1807 } 1808 1809 return (Ordering != AtomicOrdering::Unordered && 1810 Ordering != AtomicOrdering::Monotonic); 1811 } 1812 1813 /// Return true if this intrinsic is nosync. This is only used for intrinsics 1814 /// which would be nosync except that they have a volatile flag. All other 1815 /// intrinsics are simply annotated with the nosync attribute in Intrinsics.td. 1816 bool AANoSyncImpl::isNoSyncIntrinsic(Instruction *I) { 1817 if (auto *MI = dyn_cast<MemIntrinsic>(I)) 1818 return !MI->isVolatile(); 1819 return false; 1820 } 1821 1822 ChangeStatus AANoSyncImpl::updateImpl(Attributor &A) { 1823 1824 auto CheckRWInstForNoSync = [&](Instruction &I) { 1825 /// We are looking for volatile instructions or Non-Relaxed atomics. 1826 1827 if (const auto *CB = dyn_cast<CallBase>(&I)) { 1828 if (CB->hasFnAttr(Attribute::NoSync)) 1829 return true; 1830 1831 if (isNoSyncIntrinsic(&I)) 1832 return true; 1833 1834 const auto &NoSyncAA = A.getAAFor<AANoSync>( 1835 *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED); 1836 return NoSyncAA.isAssumedNoSync(); 1837 } 1838 1839 if (!I.isVolatile() && !isNonRelaxedAtomic(&I)) 1840 return true; 1841 1842 return false; 1843 }; 1844 1845 auto CheckForNoSync = [&](Instruction &I) { 1846 // At this point we handled all read/write effects and they are all 1847 // nosync, so they can be skipped. 1848 if (I.mayReadOrWriteMemory()) 1849 return true; 1850 1851 // non-convergent and readnone imply nosync. 1852 return !cast<CallBase>(I).isConvergent(); 1853 }; 1854 1855 bool UsedAssumedInformation = false; 1856 if (!A.checkForAllReadWriteInstructions(CheckRWInstForNoSync, *this, 1857 UsedAssumedInformation) || 1858 !A.checkForAllCallLikeInstructions(CheckForNoSync, *this, 1859 UsedAssumedInformation)) 1860 return indicatePessimisticFixpoint(); 1861 1862 return ChangeStatus::UNCHANGED; 1863 } 1864 1865 struct AANoSyncFunction final : public AANoSyncImpl { 1866 AANoSyncFunction(const IRPosition &IRP, Attributor &A) 1867 : AANoSyncImpl(IRP, A) {} 1868 1869 /// See AbstractAttribute::trackStatistics() 1870 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nosync) } 1871 }; 1872 1873 /// NoSync attribute deduction for a call sites. 1874 struct AANoSyncCallSite final : AANoSyncImpl { 1875 AANoSyncCallSite(const IRPosition &IRP, Attributor &A) 1876 : AANoSyncImpl(IRP, A) {} 1877 1878 /// See AbstractAttribute::initialize(...). 1879 void initialize(Attributor &A) override { 1880 AANoSyncImpl::initialize(A); 1881 Function *F = getAssociatedFunction(); 1882 if (!F || F->isDeclaration()) 1883 indicatePessimisticFixpoint(); 1884 } 1885 1886 /// See AbstractAttribute::updateImpl(...). 1887 ChangeStatus updateImpl(Attributor &A) override { 1888 // TODO: Once we have call site specific value information we can provide 1889 // call site specific liveness information and then it makes 1890 // sense to specialize attributes for call sites arguments instead of 1891 // redirecting requests to the callee argument. 1892 Function *F = getAssociatedFunction(); 1893 const IRPosition &FnPos = IRPosition::function(*F); 1894 auto &FnAA = A.getAAFor<AANoSync>(*this, FnPos, DepClassTy::REQUIRED); 1895 return clampStateAndIndicateChange(getState(), FnAA.getState()); 1896 } 1897 1898 /// See AbstractAttribute::trackStatistics() 1899 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nosync); } 1900 }; 1901 1902 /// ------------------------ No-Free Attributes ---------------------------- 1903 1904 struct AANoFreeImpl : public AANoFree { 1905 AANoFreeImpl(const IRPosition &IRP, Attributor &A) : AANoFree(IRP, A) {} 1906 1907 /// See AbstractAttribute::updateImpl(...). 1908 ChangeStatus updateImpl(Attributor &A) override { 1909 auto CheckForNoFree = [&](Instruction &I) { 1910 const auto &CB = cast<CallBase>(I); 1911 if (CB.hasFnAttr(Attribute::NoFree)) 1912 return true; 1913 1914 const auto &NoFreeAA = A.getAAFor<AANoFree>( 1915 *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED); 1916 return NoFreeAA.isAssumedNoFree(); 1917 }; 1918 1919 bool UsedAssumedInformation = false; 1920 if (!A.checkForAllCallLikeInstructions(CheckForNoFree, *this, 1921 UsedAssumedInformation)) 1922 return indicatePessimisticFixpoint(); 1923 return ChangeStatus::UNCHANGED; 1924 } 1925 1926 /// See AbstractAttribute::getAsStr(). 1927 const std::string getAsStr() const override { 1928 return getAssumed() ? "nofree" : "may-free"; 1929 } 1930 }; 1931 1932 struct AANoFreeFunction final : public AANoFreeImpl { 1933 AANoFreeFunction(const IRPosition &IRP, Attributor &A) 1934 : AANoFreeImpl(IRP, A) {} 1935 1936 /// See AbstractAttribute::trackStatistics() 1937 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nofree) } 1938 }; 1939 1940 /// NoFree attribute deduction for a call sites. 1941 struct AANoFreeCallSite final : AANoFreeImpl { 1942 AANoFreeCallSite(const IRPosition &IRP, Attributor &A) 1943 : AANoFreeImpl(IRP, A) {} 1944 1945 /// See AbstractAttribute::initialize(...). 1946 void initialize(Attributor &A) override { 1947 AANoFreeImpl::initialize(A); 1948 Function *F = getAssociatedFunction(); 1949 if (!F || F->isDeclaration()) 1950 indicatePessimisticFixpoint(); 1951 } 1952 1953 /// See AbstractAttribute::updateImpl(...). 1954 ChangeStatus updateImpl(Attributor &A) override { 1955 // TODO: Once we have call site specific value information we can provide 1956 // call site specific liveness information and then it makes 1957 // sense to specialize attributes for call sites arguments instead of 1958 // redirecting requests to the callee argument. 1959 Function *F = getAssociatedFunction(); 1960 const IRPosition &FnPos = IRPosition::function(*F); 1961 auto &FnAA = A.getAAFor<AANoFree>(*this, FnPos, DepClassTy::REQUIRED); 1962 return clampStateAndIndicateChange(getState(), FnAA.getState()); 1963 } 1964 1965 /// See AbstractAttribute::trackStatistics() 1966 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nofree); } 1967 }; 1968 1969 /// NoFree attribute for floating values. 1970 struct AANoFreeFloating : AANoFreeImpl { 1971 AANoFreeFloating(const IRPosition &IRP, Attributor &A) 1972 : AANoFreeImpl(IRP, A) {} 1973 1974 /// See AbstractAttribute::trackStatistics() 1975 void trackStatistics() const override{STATS_DECLTRACK_FLOATING_ATTR(nofree)} 1976 1977 /// See Abstract Attribute::updateImpl(...). 1978 ChangeStatus updateImpl(Attributor &A) override { 1979 const IRPosition &IRP = getIRPosition(); 1980 1981 const auto &NoFreeAA = A.getAAFor<AANoFree>( 1982 *this, IRPosition::function_scope(IRP), DepClassTy::OPTIONAL); 1983 if (NoFreeAA.isAssumedNoFree()) 1984 return ChangeStatus::UNCHANGED; 1985 1986 Value &AssociatedValue = getIRPosition().getAssociatedValue(); 1987 auto Pred = [&](const Use &U, bool &Follow) -> bool { 1988 Instruction *UserI = cast<Instruction>(U.getUser()); 1989 if (auto *CB = dyn_cast<CallBase>(UserI)) { 1990 if (CB->isBundleOperand(&U)) 1991 return false; 1992 if (!CB->isArgOperand(&U)) 1993 return true; 1994 unsigned ArgNo = CB->getArgOperandNo(&U); 1995 1996 const auto &NoFreeArg = A.getAAFor<AANoFree>( 1997 *this, IRPosition::callsite_argument(*CB, ArgNo), 1998 DepClassTy::REQUIRED); 1999 return NoFreeArg.isAssumedNoFree(); 2000 } 2001 2002 if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI) || 2003 isa<PHINode>(UserI) || isa<SelectInst>(UserI)) { 2004 Follow = true; 2005 return true; 2006 } 2007 if (isa<StoreInst>(UserI) || isa<LoadInst>(UserI) || 2008 isa<ReturnInst>(UserI)) 2009 return true; 2010 2011 // Unknown user. 2012 return false; 2013 }; 2014 if (!A.checkForAllUses(Pred, *this, AssociatedValue)) 2015 return indicatePessimisticFixpoint(); 2016 2017 return ChangeStatus::UNCHANGED; 2018 } 2019 }; 2020 2021 /// NoFree attribute for a call site argument. 2022 struct AANoFreeArgument final : AANoFreeFloating { 2023 AANoFreeArgument(const IRPosition &IRP, Attributor &A) 2024 : AANoFreeFloating(IRP, A) {} 2025 2026 /// See AbstractAttribute::trackStatistics() 2027 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nofree) } 2028 }; 2029 2030 /// NoFree attribute for call site arguments. 2031 struct AANoFreeCallSiteArgument final : AANoFreeFloating { 2032 AANoFreeCallSiteArgument(const IRPosition &IRP, Attributor &A) 2033 : AANoFreeFloating(IRP, A) {} 2034 2035 /// See AbstractAttribute::updateImpl(...). 2036 ChangeStatus updateImpl(Attributor &A) override { 2037 // TODO: Once we have call site specific value information we can provide 2038 // call site specific liveness information and then it makes 2039 // sense to specialize attributes for call sites arguments instead of 2040 // redirecting requests to the callee argument. 2041 Argument *Arg = getAssociatedArgument(); 2042 if (!Arg) 2043 return indicatePessimisticFixpoint(); 2044 const IRPosition &ArgPos = IRPosition::argument(*Arg); 2045 auto &ArgAA = A.getAAFor<AANoFree>(*this, ArgPos, DepClassTy::REQUIRED); 2046 return clampStateAndIndicateChange(getState(), ArgAA.getState()); 2047 } 2048 2049 /// See AbstractAttribute::trackStatistics() 2050 void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nofree)}; 2051 }; 2052 2053 /// NoFree attribute for function return value. 2054 struct AANoFreeReturned final : AANoFreeFloating { 2055 AANoFreeReturned(const IRPosition &IRP, Attributor &A) 2056 : AANoFreeFloating(IRP, A) { 2057 llvm_unreachable("NoFree is not applicable to function returns!"); 2058 } 2059 2060 /// See AbstractAttribute::initialize(...). 2061 void initialize(Attributor &A) override { 2062 llvm_unreachable("NoFree is not applicable to function returns!"); 2063 } 2064 2065 /// See AbstractAttribute::updateImpl(...). 2066 ChangeStatus updateImpl(Attributor &A) override { 2067 llvm_unreachable("NoFree is not applicable to function returns!"); 2068 } 2069 2070 /// See AbstractAttribute::trackStatistics() 2071 void trackStatistics() const override {} 2072 }; 2073 2074 /// NoFree attribute deduction for a call site return value. 2075 struct AANoFreeCallSiteReturned final : AANoFreeFloating { 2076 AANoFreeCallSiteReturned(const IRPosition &IRP, Attributor &A) 2077 : AANoFreeFloating(IRP, A) {} 2078 2079 ChangeStatus manifest(Attributor &A) override { 2080 return ChangeStatus::UNCHANGED; 2081 } 2082 /// See AbstractAttribute::trackStatistics() 2083 void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nofree) } 2084 }; 2085 2086 /// ------------------------ NonNull Argument Attribute ------------------------ 2087 static int64_t getKnownNonNullAndDerefBytesForUse( 2088 Attributor &A, const AbstractAttribute &QueryingAA, Value &AssociatedValue, 2089 const Use *U, const Instruction *I, bool &IsNonNull, bool &TrackUse) { 2090 TrackUse = false; 2091 2092 const Value *UseV = U->get(); 2093 if (!UseV->getType()->isPointerTy()) 2094 return 0; 2095 2096 // We need to follow common pointer manipulation uses to the accesses they 2097 // feed into. We can try to be smart to avoid looking through things we do not 2098 // like for now, e.g., non-inbounds GEPs. 2099 if (isa<CastInst>(I)) { 2100 TrackUse = true; 2101 return 0; 2102 } 2103 2104 if (isa<GetElementPtrInst>(I)) { 2105 TrackUse = true; 2106 return 0; 2107 } 2108 2109 Type *PtrTy = UseV->getType(); 2110 const Function *F = I->getFunction(); 2111 bool NullPointerIsDefined = 2112 F ? llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace()) : true; 2113 const DataLayout &DL = A.getInfoCache().getDL(); 2114 if (const auto *CB = dyn_cast<CallBase>(I)) { 2115 if (CB->isBundleOperand(U)) { 2116 if (RetainedKnowledge RK = getKnowledgeFromUse( 2117 U, {Attribute::NonNull, Attribute::Dereferenceable})) { 2118 IsNonNull |= 2119 (RK.AttrKind == Attribute::NonNull || !NullPointerIsDefined); 2120 return RK.ArgValue; 2121 } 2122 return 0; 2123 } 2124 2125 if (CB->isCallee(U)) { 2126 IsNonNull |= !NullPointerIsDefined; 2127 return 0; 2128 } 2129 2130 unsigned ArgNo = CB->getArgOperandNo(U); 2131 IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo); 2132 // As long as we only use known information there is no need to track 2133 // dependences here. 2134 auto &DerefAA = 2135 A.getAAFor<AADereferenceable>(QueryingAA, IRP, DepClassTy::NONE); 2136 IsNonNull |= DerefAA.isKnownNonNull(); 2137 return DerefAA.getKnownDereferenceableBytes(); 2138 } 2139 2140 int64_t Offset; 2141 const Value *Base = 2142 getMinimalBaseOfAccsesPointerOperand(A, QueryingAA, I, Offset, DL); 2143 if (Base) { 2144 if (Base == &AssociatedValue && 2145 getPointerOperand(I, /* AllowVolatile */ false) == UseV) { 2146 int64_t DerefBytes = 2147 (int64_t)DL.getTypeStoreSize(PtrTy->getPointerElementType()) + Offset; 2148 2149 IsNonNull |= !NullPointerIsDefined; 2150 return std::max(int64_t(0), DerefBytes); 2151 } 2152 } 2153 2154 /// Corner case when an offset is 0. 2155 Base = getBasePointerOfAccessPointerOperand(I, Offset, DL, 2156 /*AllowNonInbounds*/ true); 2157 if (Base) { 2158 if (Offset == 0 && Base == &AssociatedValue && 2159 getPointerOperand(I, /* AllowVolatile */ false) == UseV) { 2160 int64_t DerefBytes = 2161 (int64_t)DL.getTypeStoreSize(PtrTy->getPointerElementType()); 2162 IsNonNull |= !NullPointerIsDefined; 2163 return std::max(int64_t(0), DerefBytes); 2164 } 2165 } 2166 2167 return 0; 2168 } 2169 2170 struct AANonNullImpl : AANonNull { 2171 AANonNullImpl(const IRPosition &IRP, Attributor &A) 2172 : AANonNull(IRP, A), 2173 NullIsDefined(NullPointerIsDefined( 2174 getAnchorScope(), 2175 getAssociatedValue().getType()->getPointerAddressSpace())) {} 2176 2177 /// See AbstractAttribute::initialize(...). 2178 void initialize(Attributor &A) override { 2179 Value &V = getAssociatedValue(); 2180 if (!NullIsDefined && 2181 hasAttr({Attribute::NonNull, Attribute::Dereferenceable}, 2182 /* IgnoreSubsumingPositions */ false, &A)) { 2183 indicateOptimisticFixpoint(); 2184 return; 2185 } 2186 2187 if (isa<ConstantPointerNull>(V)) { 2188 indicatePessimisticFixpoint(); 2189 return; 2190 } 2191 2192 AANonNull::initialize(A); 2193 2194 bool CanBeNull, CanBeFreed; 2195 if (V.getPointerDereferenceableBytes(A.getDataLayout(), CanBeNull, 2196 CanBeFreed)) { 2197 if (!CanBeNull) { 2198 indicateOptimisticFixpoint(); 2199 return; 2200 } 2201 } 2202 2203 if (isa<GlobalValue>(&getAssociatedValue())) { 2204 indicatePessimisticFixpoint(); 2205 return; 2206 } 2207 2208 if (Instruction *CtxI = getCtxI()) 2209 followUsesInMBEC(*this, A, getState(), *CtxI); 2210 } 2211 2212 /// See followUsesInMBEC 2213 bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I, 2214 AANonNull::StateType &State) { 2215 bool IsNonNull = false; 2216 bool TrackUse = false; 2217 getKnownNonNullAndDerefBytesForUse(A, *this, getAssociatedValue(), U, I, 2218 IsNonNull, TrackUse); 2219 State.setKnown(IsNonNull); 2220 return TrackUse; 2221 } 2222 2223 /// See AbstractAttribute::getAsStr(). 2224 const std::string getAsStr() const override { 2225 return getAssumed() ? "nonnull" : "may-null"; 2226 } 2227 2228 /// Flag to determine if the underlying value can be null and still allow 2229 /// valid accesses. 2230 const bool NullIsDefined; 2231 }; 2232 2233 /// NonNull attribute for a floating value. 2234 struct AANonNullFloating : public AANonNullImpl { 2235 AANonNullFloating(const IRPosition &IRP, Attributor &A) 2236 : AANonNullImpl(IRP, A) {} 2237 2238 /// See AbstractAttribute::updateImpl(...). 2239 ChangeStatus updateImpl(Attributor &A) override { 2240 const DataLayout &DL = A.getDataLayout(); 2241 2242 DominatorTree *DT = nullptr; 2243 AssumptionCache *AC = nullptr; 2244 InformationCache &InfoCache = A.getInfoCache(); 2245 if (const Function *Fn = getAnchorScope()) { 2246 DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*Fn); 2247 AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*Fn); 2248 } 2249 2250 auto VisitValueCB = [&](Value &V, const Instruction *CtxI, 2251 AANonNull::StateType &T, bool Stripped) -> bool { 2252 const auto &AA = A.getAAFor<AANonNull>(*this, IRPosition::value(V), 2253 DepClassTy::REQUIRED); 2254 if (!Stripped && this == &AA) { 2255 if (!isKnownNonZero(&V, DL, 0, AC, CtxI, DT)) 2256 T.indicatePessimisticFixpoint(); 2257 } else { 2258 // Use abstract attribute information. 2259 const AANonNull::StateType &NS = AA.getState(); 2260 T ^= NS; 2261 } 2262 return T.isValidState(); 2263 }; 2264 2265 StateType T; 2266 if (!genericValueTraversal<StateType>(A, getIRPosition(), *this, T, 2267 VisitValueCB, getCtxI())) 2268 return indicatePessimisticFixpoint(); 2269 2270 return clampStateAndIndicateChange(getState(), T); 2271 } 2272 2273 /// See AbstractAttribute::trackStatistics() 2274 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) } 2275 }; 2276 2277 /// NonNull attribute for function return value. 2278 struct AANonNullReturned final 2279 : AAReturnedFromReturnedValues<AANonNull, AANonNull> { 2280 AANonNullReturned(const IRPosition &IRP, Attributor &A) 2281 : AAReturnedFromReturnedValues<AANonNull, AANonNull>(IRP, A) {} 2282 2283 /// See AbstractAttribute::getAsStr(). 2284 const std::string getAsStr() const override { 2285 return getAssumed() ? "nonnull" : "may-null"; 2286 } 2287 2288 /// See AbstractAttribute::trackStatistics() 2289 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) } 2290 }; 2291 2292 /// NonNull attribute for function argument. 2293 struct AANonNullArgument final 2294 : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl> { 2295 AANonNullArgument(const IRPosition &IRP, Attributor &A) 2296 : AAArgumentFromCallSiteArguments<AANonNull, AANonNullImpl>(IRP, A) {} 2297 2298 /// See AbstractAttribute::trackStatistics() 2299 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nonnull) } 2300 }; 2301 2302 struct AANonNullCallSiteArgument final : AANonNullFloating { 2303 AANonNullCallSiteArgument(const IRPosition &IRP, Attributor &A) 2304 : AANonNullFloating(IRP, A) {} 2305 2306 /// See AbstractAttribute::trackStatistics() 2307 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(nonnull) } 2308 }; 2309 2310 /// NonNull attribute for a call site return position. 2311 struct AANonNullCallSiteReturned final 2312 : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl> { 2313 AANonNullCallSiteReturned(const IRPosition &IRP, Attributor &A) 2314 : AACallSiteReturnedFromReturned<AANonNull, AANonNullImpl>(IRP, A) {} 2315 2316 /// See AbstractAttribute::trackStatistics() 2317 void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nonnull) } 2318 }; 2319 2320 /// ------------------------ No-Recurse Attributes ---------------------------- 2321 2322 struct AANoRecurseImpl : public AANoRecurse { 2323 AANoRecurseImpl(const IRPosition &IRP, Attributor &A) : AANoRecurse(IRP, A) {} 2324 2325 /// See AbstractAttribute::getAsStr() 2326 const std::string getAsStr() const override { 2327 return getAssumed() ? "norecurse" : "may-recurse"; 2328 } 2329 }; 2330 2331 struct AANoRecurseFunction final : AANoRecurseImpl { 2332 AANoRecurseFunction(const IRPosition &IRP, Attributor &A) 2333 : AANoRecurseImpl(IRP, A) {} 2334 2335 /// See AbstractAttribute::initialize(...). 2336 void initialize(Attributor &A) override { 2337 AANoRecurseImpl::initialize(A); 2338 if (const Function *F = getAnchorScope()) 2339 if (A.getInfoCache().getSccSize(*F) != 1) 2340 indicatePessimisticFixpoint(); 2341 } 2342 2343 /// See AbstractAttribute::updateImpl(...). 2344 ChangeStatus updateImpl(Attributor &A) override { 2345 2346 // If all live call sites are known to be no-recurse, we are as well. 2347 auto CallSitePred = [&](AbstractCallSite ACS) { 2348 const auto &NoRecurseAA = A.getAAFor<AANoRecurse>( 2349 *this, IRPosition::function(*ACS.getInstruction()->getFunction()), 2350 DepClassTy::NONE); 2351 return NoRecurseAA.isKnownNoRecurse(); 2352 }; 2353 bool AllCallSitesKnown; 2354 if (A.checkForAllCallSites(CallSitePred, *this, true, AllCallSitesKnown)) { 2355 // If we know all call sites and all are known no-recurse, we are done. 2356 // If all known call sites, which might not be all that exist, are known 2357 // to be no-recurse, we are not done but we can continue to assume 2358 // no-recurse. If one of the call sites we have not visited will become 2359 // live, another update is triggered. 2360 if (AllCallSitesKnown) 2361 indicateOptimisticFixpoint(); 2362 return ChangeStatus::UNCHANGED; 2363 } 2364 2365 // If the above check does not hold anymore we look at the calls. 2366 auto CheckForNoRecurse = [&](Instruction &I) { 2367 const auto &CB = cast<CallBase>(I); 2368 if (CB.hasFnAttr(Attribute::NoRecurse)) 2369 return true; 2370 2371 const auto &NoRecurseAA = A.getAAFor<AANoRecurse>( 2372 *this, IRPosition::callsite_function(CB), DepClassTy::REQUIRED); 2373 if (!NoRecurseAA.isAssumedNoRecurse()) 2374 return false; 2375 2376 // Recursion to the same function 2377 if (CB.getCalledFunction() == getAnchorScope()) 2378 return false; 2379 2380 return true; 2381 }; 2382 2383 bool UsedAssumedInformation = false; 2384 if (!A.checkForAllCallLikeInstructions(CheckForNoRecurse, *this, 2385 UsedAssumedInformation)) 2386 return indicatePessimisticFixpoint(); 2387 return ChangeStatus::UNCHANGED; 2388 } 2389 2390 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(norecurse) } 2391 }; 2392 2393 /// NoRecurse attribute deduction for a call sites. 2394 struct AANoRecurseCallSite final : AANoRecurseImpl { 2395 AANoRecurseCallSite(const IRPosition &IRP, Attributor &A) 2396 : AANoRecurseImpl(IRP, A) {} 2397 2398 /// See AbstractAttribute::initialize(...). 2399 void initialize(Attributor &A) override { 2400 AANoRecurseImpl::initialize(A); 2401 Function *F = getAssociatedFunction(); 2402 if (!F || F->isDeclaration()) 2403 indicatePessimisticFixpoint(); 2404 } 2405 2406 /// See AbstractAttribute::updateImpl(...). 2407 ChangeStatus updateImpl(Attributor &A) override { 2408 // TODO: Once we have call site specific value information we can provide 2409 // call site specific liveness information and then it makes 2410 // sense to specialize attributes for call sites arguments instead of 2411 // redirecting requests to the callee argument. 2412 Function *F = getAssociatedFunction(); 2413 const IRPosition &FnPos = IRPosition::function(*F); 2414 auto &FnAA = A.getAAFor<AANoRecurse>(*this, FnPos, DepClassTy::REQUIRED); 2415 return clampStateAndIndicateChange(getState(), FnAA.getState()); 2416 } 2417 2418 /// See AbstractAttribute::trackStatistics() 2419 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(norecurse); } 2420 }; 2421 2422 /// -------------------- Undefined-Behavior Attributes ------------------------ 2423 2424 struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior { 2425 AAUndefinedBehaviorImpl(const IRPosition &IRP, Attributor &A) 2426 : AAUndefinedBehavior(IRP, A) {} 2427 2428 /// See AbstractAttribute::updateImpl(...). 2429 // through a pointer (i.e. also branches etc.) 2430 ChangeStatus updateImpl(Attributor &A) override { 2431 const size_t UBPrevSize = KnownUBInsts.size(); 2432 const size_t NoUBPrevSize = AssumedNoUBInsts.size(); 2433 2434 auto InspectMemAccessInstForUB = [&](Instruction &I) { 2435 // Skip instructions that are already saved. 2436 if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I)) 2437 return true; 2438 2439 // If we reach here, we know we have an instruction 2440 // that accesses memory through a pointer operand, 2441 // for which getPointerOperand() should give it to us. 2442 Value *PtrOp = 2443 const_cast<Value *>(getPointerOperand(&I, /* AllowVolatile */ true)); 2444 assert(PtrOp && 2445 "Expected pointer operand of memory accessing instruction"); 2446 2447 // Either we stopped and the appropriate action was taken, 2448 // or we got back a simplified value to continue. 2449 Optional<Value *> SimplifiedPtrOp = stopOnUndefOrAssumed(A, PtrOp, &I); 2450 if (!SimplifiedPtrOp.hasValue() || !SimplifiedPtrOp.getValue()) 2451 return true; 2452 const Value *PtrOpVal = SimplifiedPtrOp.getValue(); 2453 2454 // A memory access through a pointer is considered UB 2455 // only if the pointer has constant null value. 2456 // TODO: Expand it to not only check constant values. 2457 if (!isa<ConstantPointerNull>(PtrOpVal)) { 2458 AssumedNoUBInsts.insert(&I); 2459 return true; 2460 } 2461 const Type *PtrTy = PtrOpVal->getType(); 2462 2463 // Because we only consider instructions inside functions, 2464 // assume that a parent function exists. 2465 const Function *F = I.getFunction(); 2466 2467 // A memory access using constant null pointer is only considered UB 2468 // if null pointer is _not_ defined for the target platform. 2469 if (llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace())) 2470 AssumedNoUBInsts.insert(&I); 2471 else 2472 KnownUBInsts.insert(&I); 2473 return true; 2474 }; 2475 2476 auto InspectBrInstForUB = [&](Instruction &I) { 2477 // A conditional branch instruction is considered UB if it has `undef` 2478 // condition. 2479 2480 // Skip instructions that are already saved. 2481 if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I)) 2482 return true; 2483 2484 // We know we have a branch instruction. 2485 auto *BrInst = cast<BranchInst>(&I); 2486 2487 // Unconditional branches are never considered UB. 2488 if (BrInst->isUnconditional()) 2489 return true; 2490 2491 // Either we stopped and the appropriate action was taken, 2492 // or we got back a simplified value to continue. 2493 Optional<Value *> SimplifiedCond = 2494 stopOnUndefOrAssumed(A, BrInst->getCondition(), BrInst); 2495 if (!SimplifiedCond.hasValue() || !SimplifiedCond.getValue()) 2496 return true; 2497 AssumedNoUBInsts.insert(&I); 2498 return true; 2499 }; 2500 2501 auto InspectCallSiteForUB = [&](Instruction &I) { 2502 // Check whether a callsite always cause UB or not 2503 2504 // Skip instructions that are already saved. 2505 if (AssumedNoUBInsts.count(&I) || KnownUBInsts.count(&I)) 2506 return true; 2507 2508 // Check nonnull and noundef argument attribute violation for each 2509 // callsite. 2510 CallBase &CB = cast<CallBase>(I); 2511 Function *Callee = CB.getCalledFunction(); 2512 if (!Callee) 2513 return true; 2514 for (unsigned idx = 0; idx < CB.getNumArgOperands(); idx++) { 2515 // If current argument is known to be simplified to null pointer and the 2516 // corresponding argument position is known to have nonnull attribute, 2517 // the argument is poison. Furthermore, if the argument is poison and 2518 // the position is known to have noundef attriubte, this callsite is 2519 // considered UB. 2520 if (idx >= Callee->arg_size()) 2521 break; 2522 Value *ArgVal = CB.getArgOperand(idx); 2523 if (!ArgVal) 2524 continue; 2525 // Here, we handle three cases. 2526 // (1) Not having a value means it is dead. (we can replace the value 2527 // with undef) 2528 // (2) Simplified to undef. The argument violate noundef attriubte. 2529 // (3) Simplified to null pointer where known to be nonnull. 2530 // The argument is a poison value and violate noundef attribute. 2531 IRPosition CalleeArgumentIRP = IRPosition::callsite_argument(CB, idx); 2532 auto &NoUndefAA = 2533 A.getAAFor<AANoUndef>(*this, CalleeArgumentIRP, DepClassTy::NONE); 2534 if (!NoUndefAA.isKnownNoUndef()) 2535 continue; 2536 bool UsedAssumedInformation = false; 2537 Optional<Value *> SimplifiedVal = A.getAssumedSimplified( 2538 IRPosition::value(*ArgVal), *this, UsedAssumedInformation); 2539 if (UsedAssumedInformation) 2540 continue; 2541 if (SimplifiedVal.hasValue() && !SimplifiedVal.getValue()) 2542 return true; 2543 if (!SimplifiedVal.hasValue() || 2544 isa<UndefValue>(*SimplifiedVal.getValue())) { 2545 KnownUBInsts.insert(&I); 2546 continue; 2547 } 2548 if (!ArgVal->getType()->isPointerTy() || 2549 !isa<ConstantPointerNull>(*SimplifiedVal.getValue())) 2550 continue; 2551 auto &NonNullAA = 2552 A.getAAFor<AANonNull>(*this, CalleeArgumentIRP, DepClassTy::NONE); 2553 if (NonNullAA.isKnownNonNull()) 2554 KnownUBInsts.insert(&I); 2555 } 2556 return true; 2557 }; 2558 2559 auto InspectReturnInstForUB = 2560 [&](Value &V, const SmallSetVector<ReturnInst *, 4> RetInsts) { 2561 // Check if a return instruction always cause UB or not 2562 // Note: It is guaranteed that the returned position of the anchor 2563 // scope has noundef attribute when this is called. 2564 // We also ensure the return position is not "assumed dead" 2565 // because the returned value was then potentially simplified to 2566 // `undef` in AAReturnedValues without removing the `noundef` 2567 // attribute yet. 2568 2569 // When the returned position has noundef attriubte, UB occur in the 2570 // following cases. 2571 // (1) Returned value is known to be undef. 2572 // (2) The value is known to be a null pointer and the returned 2573 // position has nonnull attribute (because the returned value is 2574 // poison). 2575 bool FoundUB = false; 2576 if (isa<UndefValue>(V)) { 2577 FoundUB = true; 2578 } else { 2579 if (isa<ConstantPointerNull>(V)) { 2580 auto &NonNullAA = A.getAAFor<AANonNull>( 2581 *this, IRPosition::returned(*getAnchorScope()), 2582 DepClassTy::NONE); 2583 if (NonNullAA.isKnownNonNull()) 2584 FoundUB = true; 2585 } 2586 } 2587 2588 if (FoundUB) 2589 for (ReturnInst *RI : RetInsts) 2590 KnownUBInsts.insert(RI); 2591 return true; 2592 }; 2593 2594 bool UsedAssumedInformation = false; 2595 A.checkForAllInstructions(InspectMemAccessInstForUB, *this, 2596 {Instruction::Load, Instruction::Store, 2597 Instruction::AtomicCmpXchg, 2598 Instruction::AtomicRMW}, 2599 UsedAssumedInformation, 2600 /* CheckBBLivenessOnly */ true); 2601 A.checkForAllInstructions(InspectBrInstForUB, *this, {Instruction::Br}, 2602 UsedAssumedInformation, 2603 /* CheckBBLivenessOnly */ true); 2604 A.checkForAllCallLikeInstructions(InspectCallSiteForUB, *this, 2605 UsedAssumedInformation); 2606 2607 // If the returned position of the anchor scope has noundef attriubte, check 2608 // all returned instructions. 2609 if (!getAnchorScope()->getReturnType()->isVoidTy()) { 2610 const IRPosition &ReturnIRP = IRPosition::returned(*getAnchorScope()); 2611 if (!A.isAssumedDead(ReturnIRP, this, nullptr, UsedAssumedInformation)) { 2612 auto &RetPosNoUndefAA = 2613 A.getAAFor<AANoUndef>(*this, ReturnIRP, DepClassTy::NONE); 2614 if (RetPosNoUndefAA.isKnownNoUndef()) 2615 A.checkForAllReturnedValuesAndReturnInsts(InspectReturnInstForUB, 2616 *this); 2617 } 2618 } 2619 2620 if (NoUBPrevSize != AssumedNoUBInsts.size() || 2621 UBPrevSize != KnownUBInsts.size()) 2622 return ChangeStatus::CHANGED; 2623 return ChangeStatus::UNCHANGED; 2624 } 2625 2626 bool isKnownToCauseUB(Instruction *I) const override { 2627 return KnownUBInsts.count(I); 2628 } 2629 2630 bool isAssumedToCauseUB(Instruction *I) const override { 2631 // In simple words, if an instruction is not in the assumed to _not_ 2632 // cause UB, then it is assumed UB (that includes those 2633 // in the KnownUBInsts set). The rest is boilerplate 2634 // is to ensure that it is one of the instructions we test 2635 // for UB. 2636 2637 switch (I->getOpcode()) { 2638 case Instruction::Load: 2639 case Instruction::Store: 2640 case Instruction::AtomicCmpXchg: 2641 case Instruction::AtomicRMW: 2642 return !AssumedNoUBInsts.count(I); 2643 case Instruction::Br: { 2644 auto BrInst = cast<BranchInst>(I); 2645 if (BrInst->isUnconditional()) 2646 return false; 2647 return !AssumedNoUBInsts.count(I); 2648 } break; 2649 default: 2650 return false; 2651 } 2652 return false; 2653 } 2654 2655 ChangeStatus manifest(Attributor &A) override { 2656 if (KnownUBInsts.empty()) 2657 return ChangeStatus::UNCHANGED; 2658 for (Instruction *I : KnownUBInsts) 2659 A.changeToUnreachableAfterManifest(I); 2660 return ChangeStatus::CHANGED; 2661 } 2662 2663 /// See AbstractAttribute::getAsStr() 2664 const std::string getAsStr() const override { 2665 return getAssumed() ? "undefined-behavior" : "no-ub"; 2666 } 2667 2668 /// Note: The correctness of this analysis depends on the fact that the 2669 /// following 2 sets will stop changing after some point. 2670 /// "Change" here means that their size changes. 2671 /// The size of each set is monotonically increasing 2672 /// (we only add items to them) and it is upper bounded by the number of 2673 /// instructions in the processed function (we can never save more 2674 /// elements in either set than this number). Hence, at some point, 2675 /// they will stop increasing. 2676 /// Consequently, at some point, both sets will have stopped 2677 /// changing, effectively making the analysis reach a fixpoint. 2678 2679 /// Note: These 2 sets are disjoint and an instruction can be considered 2680 /// one of 3 things: 2681 /// 1) Known to cause UB (AAUndefinedBehavior could prove it) and put it in 2682 /// the KnownUBInsts set. 2683 /// 2) Assumed to cause UB (in every updateImpl, AAUndefinedBehavior 2684 /// has a reason to assume it). 2685 /// 3) Assumed to not cause UB. very other instruction - AAUndefinedBehavior 2686 /// could not find a reason to assume or prove that it can cause UB, 2687 /// hence it assumes it doesn't. We have a set for these instructions 2688 /// so that we don't reprocess them in every update. 2689 /// Note however that instructions in this set may cause UB. 2690 2691 protected: 2692 /// A set of all live instructions _known_ to cause UB. 2693 SmallPtrSet<Instruction *, 8> KnownUBInsts; 2694 2695 private: 2696 /// A set of all the (live) instructions that are assumed to _not_ cause UB. 2697 SmallPtrSet<Instruction *, 8> AssumedNoUBInsts; 2698 2699 // Should be called on updates in which if we're processing an instruction 2700 // \p I that depends on a value \p V, one of the following has to happen: 2701 // - If the value is assumed, then stop. 2702 // - If the value is known but undef, then consider it UB. 2703 // - Otherwise, do specific processing with the simplified value. 2704 // We return None in the first 2 cases to signify that an appropriate 2705 // action was taken and the caller should stop. 2706 // Otherwise, we return the simplified value that the caller should 2707 // use for specific processing. 2708 Optional<Value *> stopOnUndefOrAssumed(Attributor &A, Value *V, 2709 Instruction *I) { 2710 bool UsedAssumedInformation = false; 2711 Optional<Value *> SimplifiedV = A.getAssumedSimplified( 2712 IRPosition::value(*V), *this, UsedAssumedInformation); 2713 if (!UsedAssumedInformation) { 2714 // Don't depend on assumed values. 2715 if (!SimplifiedV.hasValue()) { 2716 // If it is known (which we tested above) but it doesn't have a value, 2717 // then we can assume `undef` and hence the instruction is UB. 2718 KnownUBInsts.insert(I); 2719 return llvm::None; 2720 } 2721 if (!SimplifiedV.getValue()) 2722 return nullptr; 2723 V = *SimplifiedV; 2724 } 2725 if (isa<UndefValue>(V)) { 2726 KnownUBInsts.insert(I); 2727 return llvm::None; 2728 } 2729 return V; 2730 } 2731 }; 2732 2733 struct AAUndefinedBehaviorFunction final : AAUndefinedBehaviorImpl { 2734 AAUndefinedBehaviorFunction(const IRPosition &IRP, Attributor &A) 2735 : AAUndefinedBehaviorImpl(IRP, A) {} 2736 2737 /// See AbstractAttribute::trackStatistics() 2738 void trackStatistics() const override { 2739 STATS_DECL(UndefinedBehaviorInstruction, Instruction, 2740 "Number of instructions known to have UB"); 2741 BUILD_STAT_NAME(UndefinedBehaviorInstruction, Instruction) += 2742 KnownUBInsts.size(); 2743 } 2744 }; 2745 2746 /// ------------------------ Will-Return Attributes ---------------------------- 2747 2748 // Helper function that checks whether a function has any cycle which we don't 2749 // know if it is bounded or not. 2750 // Loops with maximum trip count are considered bounded, any other cycle not. 2751 static bool mayContainUnboundedCycle(Function &F, Attributor &A) { 2752 ScalarEvolution *SE = 2753 A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>(F); 2754 LoopInfo *LI = A.getInfoCache().getAnalysisResultForFunction<LoopAnalysis>(F); 2755 // If either SCEV or LoopInfo is not available for the function then we assume 2756 // any cycle to be unbounded cycle. 2757 // We use scc_iterator which uses Tarjan algorithm to find all the maximal 2758 // SCCs.To detect if there's a cycle, we only need to find the maximal ones. 2759 if (!SE || !LI) { 2760 for (scc_iterator<Function *> SCCI = scc_begin(&F); !SCCI.isAtEnd(); ++SCCI) 2761 if (SCCI.hasCycle()) 2762 return true; 2763 return false; 2764 } 2765 2766 // If there's irreducible control, the function may contain non-loop cycles. 2767 if (mayContainIrreducibleControl(F, LI)) 2768 return true; 2769 2770 // Any loop that does not have a max trip count is considered unbounded cycle. 2771 for (auto *L : LI->getLoopsInPreorder()) { 2772 if (!SE->getSmallConstantMaxTripCount(L)) 2773 return true; 2774 } 2775 return false; 2776 } 2777 2778 struct AAWillReturnImpl : public AAWillReturn { 2779 AAWillReturnImpl(const IRPosition &IRP, Attributor &A) 2780 : AAWillReturn(IRP, A) {} 2781 2782 /// See AbstractAttribute::initialize(...). 2783 void initialize(Attributor &A) override { 2784 AAWillReturn::initialize(A); 2785 2786 if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ true)) { 2787 indicateOptimisticFixpoint(); 2788 return; 2789 } 2790 } 2791 2792 /// Check for `mustprogress` and `readonly` as they imply `willreturn`. 2793 bool isImpliedByMustprogressAndReadonly(Attributor &A, bool KnownOnly) { 2794 // Check for `mustprogress` in the scope and the associated function which 2795 // might be different if this is a call site. 2796 if ((!getAnchorScope() || !getAnchorScope()->mustProgress()) && 2797 (!getAssociatedFunction() || !getAssociatedFunction()->mustProgress())) 2798 return false; 2799 2800 const auto &MemAA = 2801 A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE); 2802 if (!MemAA.isAssumedReadOnly()) 2803 return false; 2804 if (KnownOnly && !MemAA.isKnownReadOnly()) 2805 return false; 2806 if (!MemAA.isKnownReadOnly()) 2807 A.recordDependence(MemAA, *this, DepClassTy::OPTIONAL); 2808 2809 return true; 2810 } 2811 2812 /// See AbstractAttribute::updateImpl(...). 2813 ChangeStatus updateImpl(Attributor &A) override { 2814 if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ false)) 2815 return ChangeStatus::UNCHANGED; 2816 2817 auto CheckForWillReturn = [&](Instruction &I) { 2818 IRPosition IPos = IRPosition::callsite_function(cast<CallBase>(I)); 2819 const auto &WillReturnAA = 2820 A.getAAFor<AAWillReturn>(*this, IPos, DepClassTy::REQUIRED); 2821 if (WillReturnAA.isKnownWillReturn()) 2822 return true; 2823 if (!WillReturnAA.isAssumedWillReturn()) 2824 return false; 2825 const auto &NoRecurseAA = 2826 A.getAAFor<AANoRecurse>(*this, IPos, DepClassTy::REQUIRED); 2827 return NoRecurseAA.isAssumedNoRecurse(); 2828 }; 2829 2830 bool UsedAssumedInformation = false; 2831 if (!A.checkForAllCallLikeInstructions(CheckForWillReturn, *this, 2832 UsedAssumedInformation)) 2833 return indicatePessimisticFixpoint(); 2834 2835 return ChangeStatus::UNCHANGED; 2836 } 2837 2838 /// See AbstractAttribute::getAsStr() 2839 const std::string getAsStr() const override { 2840 return getAssumed() ? "willreturn" : "may-noreturn"; 2841 } 2842 }; 2843 2844 struct AAWillReturnFunction final : AAWillReturnImpl { 2845 AAWillReturnFunction(const IRPosition &IRP, Attributor &A) 2846 : AAWillReturnImpl(IRP, A) {} 2847 2848 /// See AbstractAttribute::initialize(...). 2849 void initialize(Attributor &A) override { 2850 AAWillReturnImpl::initialize(A); 2851 2852 Function *F = getAnchorScope(); 2853 if (!F || F->isDeclaration() || mayContainUnboundedCycle(*F, A)) 2854 indicatePessimisticFixpoint(); 2855 } 2856 2857 /// See AbstractAttribute::trackStatistics() 2858 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(willreturn) } 2859 }; 2860 2861 /// WillReturn attribute deduction for a call sites. 2862 struct AAWillReturnCallSite final : AAWillReturnImpl { 2863 AAWillReturnCallSite(const IRPosition &IRP, Attributor &A) 2864 : AAWillReturnImpl(IRP, A) {} 2865 2866 /// See AbstractAttribute::initialize(...). 2867 void initialize(Attributor &A) override { 2868 AAWillReturnImpl::initialize(A); 2869 Function *F = getAssociatedFunction(); 2870 if (!F || !A.isFunctionIPOAmendable(*F)) 2871 indicatePessimisticFixpoint(); 2872 } 2873 2874 /// See AbstractAttribute::updateImpl(...). 2875 ChangeStatus updateImpl(Attributor &A) override { 2876 if (isImpliedByMustprogressAndReadonly(A, /* KnownOnly */ false)) 2877 return ChangeStatus::UNCHANGED; 2878 2879 // TODO: Once we have call site specific value information we can provide 2880 // call site specific liveness information and then it makes 2881 // sense to specialize attributes for call sites arguments instead of 2882 // redirecting requests to the callee argument. 2883 Function *F = getAssociatedFunction(); 2884 const IRPosition &FnPos = IRPosition::function(*F); 2885 auto &FnAA = A.getAAFor<AAWillReturn>(*this, FnPos, DepClassTy::REQUIRED); 2886 return clampStateAndIndicateChange(getState(), FnAA.getState()); 2887 } 2888 2889 /// See AbstractAttribute::trackStatistics() 2890 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(willreturn); } 2891 }; 2892 2893 /// -------------------AAReachability Attribute-------------------------- 2894 2895 struct AAReachabilityImpl : AAReachability { 2896 AAReachabilityImpl(const IRPosition &IRP, Attributor &A) 2897 : AAReachability(IRP, A) {} 2898 2899 const std::string getAsStr() const override { 2900 // TODO: Return the number of reachable queries. 2901 return "reachable"; 2902 } 2903 2904 /// See AbstractAttribute::updateImpl(...). 2905 ChangeStatus updateImpl(Attributor &A) override { 2906 return ChangeStatus::UNCHANGED; 2907 } 2908 }; 2909 2910 struct AAReachabilityFunction final : public AAReachabilityImpl { 2911 AAReachabilityFunction(const IRPosition &IRP, Attributor &A) 2912 : AAReachabilityImpl(IRP, A) {} 2913 2914 /// See AbstractAttribute::trackStatistics() 2915 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(reachable); } 2916 }; 2917 2918 /// ------------------------ NoAlias Argument Attribute ------------------------ 2919 2920 struct AANoAliasImpl : AANoAlias { 2921 AANoAliasImpl(const IRPosition &IRP, Attributor &A) : AANoAlias(IRP, A) { 2922 assert(getAssociatedType()->isPointerTy() && 2923 "Noalias is a pointer attribute"); 2924 } 2925 2926 const std::string getAsStr() const override { 2927 return getAssumed() ? "noalias" : "may-alias"; 2928 } 2929 }; 2930 2931 /// NoAlias attribute for a floating value. 2932 struct AANoAliasFloating final : AANoAliasImpl { 2933 AANoAliasFloating(const IRPosition &IRP, Attributor &A) 2934 : AANoAliasImpl(IRP, A) {} 2935 2936 /// See AbstractAttribute::initialize(...). 2937 void initialize(Attributor &A) override { 2938 AANoAliasImpl::initialize(A); 2939 Value *Val = &getAssociatedValue(); 2940 do { 2941 CastInst *CI = dyn_cast<CastInst>(Val); 2942 if (!CI) 2943 break; 2944 Value *Base = CI->getOperand(0); 2945 if (!Base->hasOneUse()) 2946 break; 2947 Val = Base; 2948 } while (true); 2949 2950 if (!Val->getType()->isPointerTy()) { 2951 indicatePessimisticFixpoint(); 2952 return; 2953 } 2954 2955 if (isa<AllocaInst>(Val)) 2956 indicateOptimisticFixpoint(); 2957 else if (isa<ConstantPointerNull>(Val) && 2958 !NullPointerIsDefined(getAnchorScope(), 2959 Val->getType()->getPointerAddressSpace())) 2960 indicateOptimisticFixpoint(); 2961 else if (Val != &getAssociatedValue()) { 2962 const auto &ValNoAliasAA = A.getAAFor<AANoAlias>( 2963 *this, IRPosition::value(*Val), DepClassTy::OPTIONAL); 2964 if (ValNoAliasAA.isKnownNoAlias()) 2965 indicateOptimisticFixpoint(); 2966 } 2967 } 2968 2969 /// See AbstractAttribute::updateImpl(...). 2970 ChangeStatus updateImpl(Attributor &A) override { 2971 // TODO: Implement this. 2972 return indicatePessimisticFixpoint(); 2973 } 2974 2975 /// See AbstractAttribute::trackStatistics() 2976 void trackStatistics() const override { 2977 STATS_DECLTRACK_FLOATING_ATTR(noalias) 2978 } 2979 }; 2980 2981 /// NoAlias attribute for an argument. 2982 struct AANoAliasArgument final 2983 : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl> { 2984 using Base = AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl>; 2985 AANoAliasArgument(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {} 2986 2987 /// See AbstractAttribute::initialize(...). 2988 void initialize(Attributor &A) override { 2989 Base::initialize(A); 2990 // See callsite argument attribute and callee argument attribute. 2991 if (hasAttr({Attribute::ByVal})) 2992 indicateOptimisticFixpoint(); 2993 } 2994 2995 /// See AbstractAttribute::update(...). 2996 ChangeStatus updateImpl(Attributor &A) override { 2997 // We have to make sure no-alias on the argument does not break 2998 // synchronization when this is a callback argument, see also [1] below. 2999 // If synchronization cannot be affected, we delegate to the base updateImpl 3000 // function, otherwise we give up for now. 3001 3002 // If the function is no-sync, no-alias cannot break synchronization. 3003 const auto &NoSyncAA = 3004 A.getAAFor<AANoSync>(*this, IRPosition::function_scope(getIRPosition()), 3005 DepClassTy::OPTIONAL); 3006 if (NoSyncAA.isAssumedNoSync()) 3007 return Base::updateImpl(A); 3008 3009 // If the argument is read-only, no-alias cannot break synchronization. 3010 const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>( 3011 *this, getIRPosition(), DepClassTy::OPTIONAL); 3012 if (MemBehaviorAA.isAssumedReadOnly()) 3013 return Base::updateImpl(A); 3014 3015 // If the argument is never passed through callbacks, no-alias cannot break 3016 // synchronization. 3017 bool AllCallSitesKnown; 3018 if (A.checkForAllCallSites( 3019 [](AbstractCallSite ACS) { return !ACS.isCallbackCall(); }, *this, 3020 true, AllCallSitesKnown)) 3021 return Base::updateImpl(A); 3022 3023 // TODO: add no-alias but make sure it doesn't break synchronization by 3024 // introducing fake uses. See: 3025 // [1] Compiler Optimizations for OpenMP, J. Doerfert and H. Finkel, 3026 // International Workshop on OpenMP 2018, 3027 // http://compilers.cs.uni-saarland.de/people/doerfert/par_opt18.pdf 3028 3029 return indicatePessimisticFixpoint(); 3030 } 3031 3032 /// See AbstractAttribute::trackStatistics() 3033 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noalias) } 3034 }; 3035 3036 struct AANoAliasCallSiteArgument final : AANoAliasImpl { 3037 AANoAliasCallSiteArgument(const IRPosition &IRP, Attributor &A) 3038 : AANoAliasImpl(IRP, A) {} 3039 3040 /// See AbstractAttribute::initialize(...). 3041 void initialize(Attributor &A) override { 3042 // See callsite argument attribute and callee argument attribute. 3043 const auto &CB = cast<CallBase>(getAnchorValue()); 3044 if (CB.paramHasAttr(getCallSiteArgNo(), Attribute::NoAlias)) 3045 indicateOptimisticFixpoint(); 3046 Value &Val = getAssociatedValue(); 3047 if (isa<ConstantPointerNull>(Val) && 3048 !NullPointerIsDefined(getAnchorScope(), 3049 Val.getType()->getPointerAddressSpace())) 3050 indicateOptimisticFixpoint(); 3051 } 3052 3053 /// Determine if the underlying value may alias with the call site argument 3054 /// \p OtherArgNo of \p ICS (= the underlying call site). 3055 bool mayAliasWithArgument(Attributor &A, AAResults *&AAR, 3056 const AAMemoryBehavior &MemBehaviorAA, 3057 const CallBase &CB, unsigned OtherArgNo) { 3058 // We do not need to worry about aliasing with the underlying IRP. 3059 if (this->getCalleeArgNo() == (int)OtherArgNo) 3060 return false; 3061 3062 // If it is not a pointer or pointer vector we do not alias. 3063 const Value *ArgOp = CB.getArgOperand(OtherArgNo); 3064 if (!ArgOp->getType()->isPtrOrPtrVectorTy()) 3065 return false; 3066 3067 auto &CBArgMemBehaviorAA = A.getAAFor<AAMemoryBehavior>( 3068 *this, IRPosition::callsite_argument(CB, OtherArgNo), DepClassTy::NONE); 3069 3070 // If the argument is readnone, there is no read-write aliasing. 3071 if (CBArgMemBehaviorAA.isAssumedReadNone()) { 3072 A.recordDependence(CBArgMemBehaviorAA, *this, DepClassTy::OPTIONAL); 3073 return false; 3074 } 3075 3076 // If the argument is readonly and the underlying value is readonly, there 3077 // is no read-write aliasing. 3078 bool IsReadOnly = MemBehaviorAA.isAssumedReadOnly(); 3079 if (CBArgMemBehaviorAA.isAssumedReadOnly() && IsReadOnly) { 3080 A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL); 3081 A.recordDependence(CBArgMemBehaviorAA, *this, DepClassTy::OPTIONAL); 3082 return false; 3083 } 3084 3085 // We have to utilize actual alias analysis queries so we need the object. 3086 if (!AAR) 3087 AAR = A.getInfoCache().getAAResultsForFunction(*getAnchorScope()); 3088 3089 // Try to rule it out at the call site. 3090 bool IsAliasing = !AAR || !AAR->isNoAlias(&getAssociatedValue(), ArgOp); 3091 LLVM_DEBUG(dbgs() << "[NoAliasCSArg] Check alias between " 3092 "callsite arguments: " 3093 << getAssociatedValue() << " " << *ArgOp << " => " 3094 << (IsAliasing ? "" : "no-") << "alias \n"); 3095 3096 return IsAliasing; 3097 } 3098 3099 bool 3100 isKnownNoAliasDueToNoAliasPreservation(Attributor &A, AAResults *&AAR, 3101 const AAMemoryBehavior &MemBehaviorAA, 3102 const AANoAlias &NoAliasAA) { 3103 // We can deduce "noalias" if the following conditions hold. 3104 // (i) Associated value is assumed to be noalias in the definition. 3105 // (ii) Associated value is assumed to be no-capture in all the uses 3106 // possibly executed before this callsite. 3107 // (iii) There is no other pointer argument which could alias with the 3108 // value. 3109 3110 bool AssociatedValueIsNoAliasAtDef = NoAliasAA.isAssumedNoAlias(); 3111 if (!AssociatedValueIsNoAliasAtDef) { 3112 LLVM_DEBUG(dbgs() << "[AANoAlias] " << getAssociatedValue() 3113 << " is not no-alias at the definition\n"); 3114 return false; 3115 } 3116 3117 A.recordDependence(NoAliasAA, *this, DepClassTy::OPTIONAL); 3118 3119 const IRPosition &VIRP = IRPosition::value(getAssociatedValue()); 3120 const Function *ScopeFn = VIRP.getAnchorScope(); 3121 auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, VIRP, DepClassTy::NONE); 3122 // Check whether the value is captured in the scope using AANoCapture. 3123 // Look at CFG and check only uses possibly executed before this 3124 // callsite. 3125 auto UsePred = [&](const Use &U, bool &Follow) -> bool { 3126 Instruction *UserI = cast<Instruction>(U.getUser()); 3127 3128 // If UserI is the curr instruction and there is a single potential use of 3129 // the value in UserI we allow the use. 3130 // TODO: We should inspect the operands and allow those that cannot alias 3131 // with the value. 3132 if (UserI == getCtxI() && UserI->getNumOperands() == 1) 3133 return true; 3134 3135 if (ScopeFn) { 3136 const auto &ReachabilityAA = A.getAAFor<AAReachability>( 3137 *this, IRPosition::function(*ScopeFn), DepClassTy::OPTIONAL); 3138 3139 if (!ReachabilityAA.isAssumedReachable(A, *UserI, *getCtxI())) 3140 return true; 3141 3142 if (auto *CB = dyn_cast<CallBase>(UserI)) { 3143 if (CB->isArgOperand(&U)) { 3144 3145 unsigned ArgNo = CB->getArgOperandNo(&U); 3146 3147 const auto &NoCaptureAA = A.getAAFor<AANoCapture>( 3148 *this, IRPosition::callsite_argument(*CB, ArgNo), 3149 DepClassTy::OPTIONAL); 3150 3151 if (NoCaptureAA.isAssumedNoCapture()) 3152 return true; 3153 } 3154 } 3155 } 3156 3157 // For cases which can potentially have more users 3158 if (isa<GetElementPtrInst>(U) || isa<BitCastInst>(U) || isa<PHINode>(U) || 3159 isa<SelectInst>(U)) { 3160 Follow = true; 3161 return true; 3162 } 3163 3164 LLVM_DEBUG(dbgs() << "[AANoAliasCSArg] Unknown user: " << *U << "\n"); 3165 return false; 3166 }; 3167 3168 if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned()) { 3169 if (!A.checkForAllUses(UsePred, *this, getAssociatedValue())) { 3170 LLVM_DEBUG( 3171 dbgs() << "[AANoAliasCSArg] " << getAssociatedValue() 3172 << " cannot be noalias as it is potentially captured\n"); 3173 return false; 3174 } 3175 } 3176 A.recordDependence(NoCaptureAA, *this, DepClassTy::OPTIONAL); 3177 3178 // Check there is no other pointer argument which could alias with the 3179 // value passed at this call site. 3180 // TODO: AbstractCallSite 3181 const auto &CB = cast<CallBase>(getAnchorValue()); 3182 for (unsigned OtherArgNo = 0; OtherArgNo < CB.getNumArgOperands(); 3183 OtherArgNo++) 3184 if (mayAliasWithArgument(A, AAR, MemBehaviorAA, CB, OtherArgNo)) 3185 return false; 3186 3187 return true; 3188 } 3189 3190 /// See AbstractAttribute::updateImpl(...). 3191 ChangeStatus updateImpl(Attributor &A) override { 3192 // If the argument is readnone we are done as there are no accesses via the 3193 // argument. 3194 auto &MemBehaviorAA = 3195 A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE); 3196 if (MemBehaviorAA.isAssumedReadNone()) { 3197 A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL); 3198 return ChangeStatus::UNCHANGED; 3199 } 3200 3201 const IRPosition &VIRP = IRPosition::value(getAssociatedValue()); 3202 const auto &NoAliasAA = 3203 A.getAAFor<AANoAlias>(*this, VIRP, DepClassTy::NONE); 3204 3205 AAResults *AAR = nullptr; 3206 if (isKnownNoAliasDueToNoAliasPreservation(A, AAR, MemBehaviorAA, 3207 NoAliasAA)) { 3208 LLVM_DEBUG( 3209 dbgs() << "[AANoAlias] No-Alias deduced via no-alias preservation\n"); 3210 return ChangeStatus::UNCHANGED; 3211 } 3212 3213 return indicatePessimisticFixpoint(); 3214 } 3215 3216 /// See AbstractAttribute::trackStatistics() 3217 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noalias) } 3218 }; 3219 3220 /// NoAlias attribute for function return value. 3221 struct AANoAliasReturned final : AANoAliasImpl { 3222 AANoAliasReturned(const IRPosition &IRP, Attributor &A) 3223 : AANoAliasImpl(IRP, A) {} 3224 3225 /// See AbstractAttribute::initialize(...). 3226 void initialize(Attributor &A) override { 3227 AANoAliasImpl::initialize(A); 3228 Function *F = getAssociatedFunction(); 3229 if (!F || F->isDeclaration()) 3230 indicatePessimisticFixpoint(); 3231 } 3232 3233 /// See AbstractAttribute::updateImpl(...). 3234 virtual ChangeStatus updateImpl(Attributor &A) override { 3235 3236 auto CheckReturnValue = [&](Value &RV) -> bool { 3237 if (Constant *C = dyn_cast<Constant>(&RV)) 3238 if (C->isNullValue() || isa<UndefValue>(C)) 3239 return true; 3240 3241 /// For now, we can only deduce noalias if we have call sites. 3242 /// FIXME: add more support. 3243 if (!isa<CallBase>(&RV)) 3244 return false; 3245 3246 const IRPosition &RVPos = IRPosition::value(RV); 3247 const auto &NoAliasAA = 3248 A.getAAFor<AANoAlias>(*this, RVPos, DepClassTy::REQUIRED); 3249 if (!NoAliasAA.isAssumedNoAlias()) 3250 return false; 3251 3252 const auto &NoCaptureAA = 3253 A.getAAFor<AANoCapture>(*this, RVPos, DepClassTy::REQUIRED); 3254 return NoCaptureAA.isAssumedNoCaptureMaybeReturned(); 3255 }; 3256 3257 if (!A.checkForAllReturnedValues(CheckReturnValue, *this)) 3258 return indicatePessimisticFixpoint(); 3259 3260 return ChangeStatus::UNCHANGED; 3261 } 3262 3263 /// See AbstractAttribute::trackStatistics() 3264 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noalias) } 3265 }; 3266 3267 /// NoAlias attribute deduction for a call site return value. 3268 struct AANoAliasCallSiteReturned final : AANoAliasImpl { 3269 AANoAliasCallSiteReturned(const IRPosition &IRP, Attributor &A) 3270 : AANoAliasImpl(IRP, A) {} 3271 3272 /// See AbstractAttribute::initialize(...). 3273 void initialize(Attributor &A) override { 3274 AANoAliasImpl::initialize(A); 3275 Function *F = getAssociatedFunction(); 3276 if (!F || F->isDeclaration()) 3277 indicatePessimisticFixpoint(); 3278 } 3279 3280 /// See AbstractAttribute::updateImpl(...). 3281 ChangeStatus updateImpl(Attributor &A) override { 3282 // TODO: Once we have call site specific value information we can provide 3283 // call site specific liveness information and then it makes 3284 // sense to specialize attributes for call sites arguments instead of 3285 // redirecting requests to the callee argument. 3286 Function *F = getAssociatedFunction(); 3287 const IRPosition &FnPos = IRPosition::returned(*F); 3288 auto &FnAA = A.getAAFor<AANoAlias>(*this, FnPos, DepClassTy::REQUIRED); 3289 return clampStateAndIndicateChange(getState(), FnAA.getState()); 3290 } 3291 3292 /// See AbstractAttribute::trackStatistics() 3293 void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noalias); } 3294 }; 3295 3296 /// -------------------AAIsDead Function Attribute----------------------- 3297 3298 struct AAIsDeadValueImpl : public AAIsDead { 3299 AAIsDeadValueImpl(const IRPosition &IRP, Attributor &A) : AAIsDead(IRP, A) {} 3300 3301 /// See AAIsDead::isAssumedDead(). 3302 bool isAssumedDead() const override { return isAssumed(IS_DEAD); } 3303 3304 /// See AAIsDead::isKnownDead(). 3305 bool isKnownDead() const override { return isKnown(IS_DEAD); } 3306 3307 /// See AAIsDead::isAssumedDead(BasicBlock *). 3308 bool isAssumedDead(const BasicBlock *BB) const override { return false; } 3309 3310 /// See AAIsDead::isKnownDead(BasicBlock *). 3311 bool isKnownDead(const BasicBlock *BB) const override { return false; } 3312 3313 /// See AAIsDead::isAssumedDead(Instruction *I). 3314 bool isAssumedDead(const Instruction *I) const override { 3315 return I == getCtxI() && isAssumedDead(); 3316 } 3317 3318 /// See AAIsDead::isKnownDead(Instruction *I). 3319 bool isKnownDead(const Instruction *I) const override { 3320 return isAssumedDead(I) && isKnownDead(); 3321 } 3322 3323 /// See AbstractAttribute::getAsStr(). 3324 const std::string getAsStr() const override { 3325 return isAssumedDead() ? "assumed-dead" : "assumed-live"; 3326 } 3327 3328 /// Check if all uses are assumed dead. 3329 bool areAllUsesAssumedDead(Attributor &A, Value &V) { 3330 // Callers might not check the type, void has no uses. 3331 if (V.getType()->isVoidTy()) 3332 return true; 3333 3334 // If we replace a value with a constant there are no uses left afterwards. 3335 if (!isa<Constant>(V)) { 3336 bool UsedAssumedInformation = false; 3337 Optional<Constant *> C = 3338 A.getAssumedConstant(V, *this, UsedAssumedInformation); 3339 if (!C.hasValue() || *C) 3340 return true; 3341 } 3342 3343 auto UsePred = [&](const Use &U, bool &Follow) { return false; }; 3344 // Explicitly set the dependence class to required because we want a long 3345 // chain of N dependent instructions to be considered live as soon as one is 3346 // without going through N update cycles. This is not required for 3347 // correctness. 3348 return A.checkForAllUses(UsePred, *this, V, /* CheckBBLivenessOnly */ false, 3349 DepClassTy::REQUIRED); 3350 } 3351 3352 /// Determine if \p I is assumed to be side-effect free. 3353 bool isAssumedSideEffectFree(Attributor &A, Instruction *I) { 3354 if (!I || wouldInstructionBeTriviallyDead(I)) 3355 return true; 3356 3357 auto *CB = dyn_cast<CallBase>(I); 3358 if (!CB || isa<IntrinsicInst>(CB)) 3359 return false; 3360 3361 const IRPosition &CallIRP = IRPosition::callsite_function(*CB); 3362 const auto &NoUnwindAA = 3363 A.getAndUpdateAAFor<AANoUnwind>(*this, CallIRP, DepClassTy::NONE); 3364 if (!NoUnwindAA.isAssumedNoUnwind()) 3365 return false; 3366 if (!NoUnwindAA.isKnownNoUnwind()) 3367 A.recordDependence(NoUnwindAA, *this, DepClassTy::OPTIONAL); 3368 3369 const auto &MemBehaviorAA = 3370 A.getAndUpdateAAFor<AAMemoryBehavior>(*this, CallIRP, DepClassTy::NONE); 3371 if (MemBehaviorAA.isAssumedReadOnly()) { 3372 if (!MemBehaviorAA.isKnownReadOnly()) 3373 A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL); 3374 return true; 3375 } 3376 return false; 3377 } 3378 }; 3379 3380 struct AAIsDeadFloating : public AAIsDeadValueImpl { 3381 AAIsDeadFloating(const IRPosition &IRP, Attributor &A) 3382 : AAIsDeadValueImpl(IRP, A) {} 3383 3384 /// See AbstractAttribute::initialize(...). 3385 void initialize(Attributor &A) override { 3386 if (isa<UndefValue>(getAssociatedValue())) { 3387 indicatePessimisticFixpoint(); 3388 return; 3389 } 3390 3391 Instruction *I = dyn_cast<Instruction>(&getAssociatedValue()); 3392 if (!isAssumedSideEffectFree(A, I)) { 3393 if (!isa_and_nonnull<StoreInst>(I)) 3394 indicatePessimisticFixpoint(); 3395 else 3396 removeAssumedBits(HAS_NO_EFFECT); 3397 } 3398 } 3399 3400 bool isDeadStore(Attributor &A, StoreInst &SI) { 3401 bool UsedAssumedInformation = false; 3402 SmallSetVector<Value *, 4> PotentialCopies; 3403 if (!AA::getPotentialCopiesOfStoredValue(A, SI, PotentialCopies, *this, 3404 UsedAssumedInformation)) 3405 return false; 3406 return llvm::all_of(PotentialCopies, [&](Value *V) { 3407 return A.isAssumedDead(IRPosition::value(*V), this, nullptr, 3408 UsedAssumedInformation); 3409 }); 3410 } 3411 3412 /// See AbstractAttribute::updateImpl(...). 3413 ChangeStatus updateImpl(Attributor &A) override { 3414 Instruction *I = dyn_cast<Instruction>(&getAssociatedValue()); 3415 if (auto *SI = dyn_cast_or_null<StoreInst>(I)) { 3416 if (!isDeadStore(A, *SI)) 3417 return indicatePessimisticFixpoint(); 3418 } else { 3419 if (!isAssumedSideEffectFree(A, I)) 3420 return indicatePessimisticFixpoint(); 3421 if (!areAllUsesAssumedDead(A, getAssociatedValue())) 3422 return indicatePessimisticFixpoint(); 3423 } 3424 return ChangeStatus::UNCHANGED; 3425 } 3426 3427 /// See AbstractAttribute::manifest(...). 3428 ChangeStatus manifest(Attributor &A) override { 3429 Value &V = getAssociatedValue(); 3430 if (auto *I = dyn_cast<Instruction>(&V)) { 3431 // If we get here we basically know the users are all dead. We check if 3432 // isAssumedSideEffectFree returns true here again because it might not be 3433 // the case and only the users are dead but the instruction (=call) is 3434 // still needed. 3435 if (isa<StoreInst>(I) || 3436 (isAssumedSideEffectFree(A, I) && !isa<InvokeInst>(I))) { 3437 A.deleteAfterManifest(*I); 3438 return ChangeStatus::CHANGED; 3439 } 3440 } 3441 if (V.use_empty()) 3442 return ChangeStatus::UNCHANGED; 3443 3444 bool UsedAssumedInformation = false; 3445 Optional<Constant *> C = 3446 A.getAssumedConstant(V, *this, UsedAssumedInformation); 3447 if (C.hasValue() && C.getValue()) 3448 return ChangeStatus::UNCHANGED; 3449 3450 // Replace the value with undef as it is dead but keep droppable uses around 3451 // as they provide information we don't want to give up on just yet. 3452 UndefValue &UV = *UndefValue::get(V.getType()); 3453 bool AnyChange = 3454 A.changeValueAfterManifest(V, UV, /* ChangeDropppable */ false); 3455 return AnyChange ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED; 3456 } 3457 3458 /// See AbstractAttribute::trackStatistics() 3459 void trackStatistics() const override { 3460 STATS_DECLTRACK_FLOATING_ATTR(IsDead) 3461 } 3462 }; 3463 3464 struct AAIsDeadArgument : public AAIsDeadFloating { 3465 AAIsDeadArgument(const IRPosition &IRP, Attributor &A) 3466 : AAIsDeadFloating(IRP, A) {} 3467 3468 /// See AbstractAttribute::initialize(...). 3469 void initialize(Attributor &A) override { 3470 if (!A.isFunctionIPOAmendable(*getAnchorScope())) 3471 indicatePessimisticFixpoint(); 3472 } 3473 3474 /// See AbstractAttribute::manifest(...). 3475 ChangeStatus manifest(Attributor &A) override { 3476 ChangeStatus Changed = AAIsDeadFloating::manifest(A); 3477 Argument &Arg = *getAssociatedArgument(); 3478 if (A.isValidFunctionSignatureRewrite(Arg, /* ReplacementTypes */ {})) 3479 if (A.registerFunctionSignatureRewrite( 3480 Arg, /* ReplacementTypes */ {}, 3481 Attributor::ArgumentReplacementInfo::CalleeRepairCBTy{}, 3482 Attributor::ArgumentReplacementInfo::ACSRepairCBTy{})) { 3483 Arg.dropDroppableUses(); 3484 return ChangeStatus::CHANGED; 3485 } 3486 return Changed; 3487 } 3488 3489 /// See AbstractAttribute::trackStatistics() 3490 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(IsDead) } 3491 }; 3492 3493 struct AAIsDeadCallSiteArgument : public AAIsDeadValueImpl { 3494 AAIsDeadCallSiteArgument(const IRPosition &IRP, Attributor &A) 3495 : AAIsDeadValueImpl(IRP, A) {} 3496 3497 /// See AbstractAttribute::initialize(...). 3498 void initialize(Attributor &A) override { 3499 if (isa<UndefValue>(getAssociatedValue())) 3500 indicatePessimisticFixpoint(); 3501 } 3502 3503 /// See AbstractAttribute::updateImpl(...). 3504 ChangeStatus updateImpl(Attributor &A) override { 3505 // TODO: Once we have call site specific value information we can provide 3506 // call site specific liveness information and then it makes 3507 // sense to specialize attributes for call sites arguments instead of 3508 // redirecting requests to the callee argument. 3509 Argument *Arg = getAssociatedArgument(); 3510 if (!Arg) 3511 return indicatePessimisticFixpoint(); 3512 const IRPosition &ArgPos = IRPosition::argument(*Arg); 3513 auto &ArgAA = A.getAAFor<AAIsDead>(*this, ArgPos, DepClassTy::REQUIRED); 3514 return clampStateAndIndicateChange(getState(), ArgAA.getState()); 3515 } 3516 3517 /// See AbstractAttribute::manifest(...). 3518 ChangeStatus manifest(Attributor &A) override { 3519 CallBase &CB = cast<CallBase>(getAnchorValue()); 3520 Use &U = CB.getArgOperandUse(getCallSiteArgNo()); 3521 assert(!isa<UndefValue>(U.get()) && 3522 "Expected undef values to be filtered out!"); 3523 UndefValue &UV = *UndefValue::get(U->getType()); 3524 if (A.changeUseAfterManifest(U, UV)) 3525 return ChangeStatus::CHANGED; 3526 return ChangeStatus::UNCHANGED; 3527 } 3528 3529 /// See AbstractAttribute::trackStatistics() 3530 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(IsDead) } 3531 }; 3532 3533 struct AAIsDeadCallSiteReturned : public AAIsDeadFloating { 3534 AAIsDeadCallSiteReturned(const IRPosition &IRP, Attributor &A) 3535 : AAIsDeadFloating(IRP, A), IsAssumedSideEffectFree(true) {} 3536 3537 /// See AAIsDead::isAssumedDead(). 3538 bool isAssumedDead() const override { 3539 return AAIsDeadFloating::isAssumedDead() && IsAssumedSideEffectFree; 3540 } 3541 3542 /// See AbstractAttribute::initialize(...). 3543 void initialize(Attributor &A) override { 3544 if (isa<UndefValue>(getAssociatedValue())) { 3545 indicatePessimisticFixpoint(); 3546 return; 3547 } 3548 3549 // We track this separately as a secondary state. 3550 IsAssumedSideEffectFree = isAssumedSideEffectFree(A, getCtxI()); 3551 } 3552 3553 /// See AbstractAttribute::updateImpl(...). 3554 ChangeStatus updateImpl(Attributor &A) override { 3555 ChangeStatus Changed = ChangeStatus::UNCHANGED; 3556 if (IsAssumedSideEffectFree && !isAssumedSideEffectFree(A, getCtxI())) { 3557 IsAssumedSideEffectFree = false; 3558 Changed = ChangeStatus::CHANGED; 3559 } 3560 if (!areAllUsesAssumedDead(A, getAssociatedValue())) 3561 return indicatePessimisticFixpoint(); 3562 return Changed; 3563 } 3564 3565 /// See AbstractAttribute::trackStatistics() 3566 void trackStatistics() const override { 3567 if (IsAssumedSideEffectFree) 3568 STATS_DECLTRACK_CSRET_ATTR(IsDead) 3569 else 3570 STATS_DECLTRACK_CSRET_ATTR(UnusedResult) 3571 } 3572 3573 /// See AbstractAttribute::getAsStr(). 3574 const std::string getAsStr() const override { 3575 return isAssumedDead() 3576 ? "assumed-dead" 3577 : (getAssumed() ? "assumed-dead-users" : "assumed-live"); 3578 } 3579 3580 private: 3581 bool IsAssumedSideEffectFree; 3582 }; 3583 3584 struct AAIsDeadReturned : public AAIsDeadValueImpl { 3585 AAIsDeadReturned(const IRPosition &IRP, Attributor &A) 3586 : AAIsDeadValueImpl(IRP, A) {} 3587 3588 /// See AbstractAttribute::updateImpl(...). 3589 ChangeStatus updateImpl(Attributor &A) override { 3590 3591 bool UsedAssumedInformation = false; 3592 A.checkForAllInstructions([](Instruction &) { return true; }, *this, 3593 {Instruction::Ret}, UsedAssumedInformation); 3594 3595 auto PredForCallSite = [&](AbstractCallSite ACS) { 3596 if (ACS.isCallbackCall() || !ACS.getInstruction()) 3597 return false; 3598 return areAllUsesAssumedDead(A, *ACS.getInstruction()); 3599 }; 3600 3601 bool AllCallSitesKnown; 3602 if (!A.checkForAllCallSites(PredForCallSite, *this, true, 3603 AllCallSitesKnown)) 3604 return indicatePessimisticFixpoint(); 3605 3606 return ChangeStatus::UNCHANGED; 3607 } 3608 3609 /// See AbstractAttribute::manifest(...). 3610 ChangeStatus manifest(Attributor &A) override { 3611 // TODO: Rewrite the signature to return void? 3612 bool AnyChange = false; 3613 UndefValue &UV = *UndefValue::get(getAssociatedFunction()->getReturnType()); 3614 auto RetInstPred = [&](Instruction &I) { 3615 ReturnInst &RI = cast<ReturnInst>(I); 3616 if (!isa<UndefValue>(RI.getReturnValue())) 3617 AnyChange |= A.changeUseAfterManifest(RI.getOperandUse(0), UV); 3618 return true; 3619 }; 3620 bool UsedAssumedInformation = false; 3621 A.checkForAllInstructions(RetInstPred, *this, {Instruction::Ret}, 3622 UsedAssumedInformation); 3623 return AnyChange ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED; 3624 } 3625 3626 /// See AbstractAttribute::trackStatistics() 3627 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(IsDead) } 3628 }; 3629 3630 struct AAIsDeadFunction : public AAIsDead { 3631 AAIsDeadFunction(const IRPosition &IRP, Attributor &A) : AAIsDead(IRP, A) {} 3632 3633 /// See AbstractAttribute::initialize(...). 3634 void initialize(Attributor &A) override { 3635 const Function *F = getAnchorScope(); 3636 if (F && !F->isDeclaration()) { 3637 // We only want to compute liveness once. If the function is not part of 3638 // the SCC, skip it. 3639 if (A.isRunOn(*const_cast<Function *>(F))) { 3640 ToBeExploredFrom.insert(&F->getEntryBlock().front()); 3641 assumeLive(A, F->getEntryBlock()); 3642 } else { 3643 indicatePessimisticFixpoint(); 3644 } 3645 } 3646 } 3647 3648 /// See AbstractAttribute::getAsStr(). 3649 const std::string getAsStr() const override { 3650 return "Live[#BB " + std::to_string(AssumedLiveBlocks.size()) + "/" + 3651 std::to_string(getAnchorScope()->size()) + "][#TBEP " + 3652 std::to_string(ToBeExploredFrom.size()) + "][#KDE " + 3653 std::to_string(KnownDeadEnds.size()) + "]"; 3654 } 3655 3656 /// See AbstractAttribute::manifest(...). 3657 ChangeStatus manifest(Attributor &A) override { 3658 assert(getState().isValidState() && 3659 "Attempted to manifest an invalid state!"); 3660 3661 ChangeStatus HasChanged = ChangeStatus::UNCHANGED; 3662 Function &F = *getAnchorScope(); 3663 3664 if (AssumedLiveBlocks.empty()) { 3665 A.deleteAfterManifest(F); 3666 return ChangeStatus::CHANGED; 3667 } 3668 3669 // Flag to determine if we can change an invoke to a call assuming the 3670 // callee is nounwind. This is not possible if the personality of the 3671 // function allows to catch asynchronous exceptions. 3672 bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F); 3673 3674 KnownDeadEnds.set_union(ToBeExploredFrom); 3675 for (const Instruction *DeadEndI : KnownDeadEnds) { 3676 auto *CB = dyn_cast<CallBase>(DeadEndI); 3677 if (!CB) 3678 continue; 3679 const auto &NoReturnAA = A.getAndUpdateAAFor<AANoReturn>( 3680 *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL); 3681 bool MayReturn = !NoReturnAA.isAssumedNoReturn(); 3682 if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB))) 3683 continue; 3684 3685 if (auto *II = dyn_cast<InvokeInst>(DeadEndI)) 3686 A.registerInvokeWithDeadSuccessor(const_cast<InvokeInst &>(*II)); 3687 else 3688 A.changeToUnreachableAfterManifest( 3689 const_cast<Instruction *>(DeadEndI->getNextNode())); 3690 HasChanged = ChangeStatus::CHANGED; 3691 } 3692 3693 STATS_DECL(AAIsDead, BasicBlock, "Number of dead basic blocks deleted."); 3694 for (BasicBlock &BB : F) 3695 if (!AssumedLiveBlocks.count(&BB)) { 3696 A.deleteAfterManifest(BB); 3697 ++BUILD_STAT_NAME(AAIsDead, BasicBlock); 3698 } 3699 3700 return HasChanged; 3701 } 3702 3703 /// See AbstractAttribute::updateImpl(...). 3704 ChangeStatus updateImpl(Attributor &A) override; 3705 3706 bool isEdgeDead(const BasicBlock *From, const BasicBlock *To) const override { 3707 return !AssumedLiveEdges.count(std::make_pair(From, To)); 3708 } 3709 3710 /// See AbstractAttribute::trackStatistics() 3711 void trackStatistics() const override {} 3712 3713 /// Returns true if the function is assumed dead. 3714 bool isAssumedDead() const override { return false; } 3715 3716 /// See AAIsDead::isKnownDead(). 3717 bool isKnownDead() const override { return false; } 3718 3719 /// See AAIsDead::isAssumedDead(BasicBlock *). 3720 bool isAssumedDead(const BasicBlock *BB) const override { 3721 assert(BB->getParent() == getAnchorScope() && 3722 "BB must be in the same anchor scope function."); 3723 3724 if (!getAssumed()) 3725 return false; 3726 return !AssumedLiveBlocks.count(BB); 3727 } 3728 3729 /// See AAIsDead::isKnownDead(BasicBlock *). 3730 bool isKnownDead(const BasicBlock *BB) const override { 3731 return getKnown() && isAssumedDead(BB); 3732 } 3733 3734 /// See AAIsDead::isAssumed(Instruction *I). 3735 bool isAssumedDead(const Instruction *I) const override { 3736 assert(I->getParent()->getParent() == getAnchorScope() && 3737 "Instruction must be in the same anchor scope function."); 3738 3739 if (!getAssumed()) 3740 return false; 3741 3742 // If it is not in AssumedLiveBlocks then it for sure dead. 3743 // Otherwise, it can still be after noreturn call in a live block. 3744 if (!AssumedLiveBlocks.count(I->getParent())) 3745 return true; 3746 3747 // If it is not after a liveness barrier it is live. 3748 const Instruction *PrevI = I->getPrevNode(); 3749 while (PrevI) { 3750 if (KnownDeadEnds.count(PrevI) || ToBeExploredFrom.count(PrevI)) 3751 return true; 3752 PrevI = PrevI->getPrevNode(); 3753 } 3754 return false; 3755 } 3756 3757 /// See AAIsDead::isKnownDead(Instruction *I). 3758 bool isKnownDead(const Instruction *I) const override { 3759 return getKnown() && isAssumedDead(I); 3760 } 3761 3762 /// Assume \p BB is (partially) live now and indicate to the Attributor \p A 3763 /// that internal function called from \p BB should now be looked at. 3764 bool assumeLive(Attributor &A, const BasicBlock &BB) { 3765 if (!AssumedLiveBlocks.insert(&BB).second) 3766 return false; 3767 3768 // We assume that all of BB is (probably) live now and if there are calls to 3769 // internal functions we will assume that those are now live as well. This 3770 // is a performance optimization for blocks with calls to a lot of internal 3771 // functions. It can however cause dead functions to be treated as live. 3772 for (const Instruction &I : BB) 3773 if (const auto *CB = dyn_cast<CallBase>(&I)) 3774 if (const Function *F = CB->getCalledFunction()) 3775 if (F->hasLocalLinkage()) 3776 A.markLiveInternalFunction(*F); 3777 return true; 3778 } 3779 3780 /// Collection of instructions that need to be explored again, e.g., we 3781 /// did assume they do not transfer control to (one of their) successors. 3782 SmallSetVector<const Instruction *, 8> ToBeExploredFrom; 3783 3784 /// Collection of instructions that are known to not transfer control. 3785 SmallSetVector<const Instruction *, 8> KnownDeadEnds; 3786 3787 /// Collection of all assumed live edges 3788 DenseSet<std::pair<const BasicBlock *, const BasicBlock *>> AssumedLiveEdges; 3789 3790 /// Collection of all assumed live BasicBlocks. 3791 DenseSet<const BasicBlock *> AssumedLiveBlocks; 3792 }; 3793 3794 static bool 3795 identifyAliveSuccessors(Attributor &A, const CallBase &CB, 3796 AbstractAttribute &AA, 3797 SmallVectorImpl<const Instruction *> &AliveSuccessors) { 3798 const IRPosition &IPos = IRPosition::callsite_function(CB); 3799 3800 const auto &NoReturnAA = 3801 A.getAndUpdateAAFor<AANoReturn>(AA, IPos, DepClassTy::OPTIONAL); 3802 if (NoReturnAA.isAssumedNoReturn()) 3803 return !NoReturnAA.isKnownNoReturn(); 3804 if (CB.isTerminator()) 3805 AliveSuccessors.push_back(&CB.getSuccessor(0)->front()); 3806 else 3807 AliveSuccessors.push_back(CB.getNextNode()); 3808 return false; 3809 } 3810 3811 static bool 3812 identifyAliveSuccessors(Attributor &A, const InvokeInst &II, 3813 AbstractAttribute &AA, 3814 SmallVectorImpl<const Instruction *> &AliveSuccessors) { 3815 bool UsedAssumedInformation = 3816 identifyAliveSuccessors(A, cast<CallBase>(II), AA, AliveSuccessors); 3817 3818 // First, determine if we can change an invoke to a call assuming the 3819 // callee is nounwind. This is not possible if the personality of the 3820 // function allows to catch asynchronous exceptions. 3821 if (AAIsDeadFunction::mayCatchAsynchronousExceptions(*II.getFunction())) { 3822 AliveSuccessors.push_back(&II.getUnwindDest()->front()); 3823 } else { 3824 const IRPosition &IPos = IRPosition::callsite_function(II); 3825 const auto &AANoUnw = 3826 A.getAndUpdateAAFor<AANoUnwind>(AA, IPos, DepClassTy::OPTIONAL); 3827 if (AANoUnw.isAssumedNoUnwind()) { 3828 UsedAssumedInformation |= !AANoUnw.isKnownNoUnwind(); 3829 } else { 3830 AliveSuccessors.push_back(&II.getUnwindDest()->front()); 3831 } 3832 } 3833 return UsedAssumedInformation; 3834 } 3835 3836 static bool 3837 identifyAliveSuccessors(Attributor &A, const BranchInst &BI, 3838 AbstractAttribute &AA, 3839 SmallVectorImpl<const Instruction *> &AliveSuccessors) { 3840 bool UsedAssumedInformation = false; 3841 if (BI.getNumSuccessors() == 1) { 3842 AliveSuccessors.push_back(&BI.getSuccessor(0)->front()); 3843 } else { 3844 Optional<Constant *> C = 3845 A.getAssumedConstant(*BI.getCondition(), AA, UsedAssumedInformation); 3846 if (!C.hasValue() || isa_and_nonnull<UndefValue>(C.getValue())) { 3847 // No value yet, assume both edges are dead. 3848 } else if (isa_and_nonnull<ConstantInt>(*C)) { 3849 const BasicBlock *SuccBB = 3850 BI.getSuccessor(1 - cast<ConstantInt>(*C)->getValue().getZExtValue()); 3851 AliveSuccessors.push_back(&SuccBB->front()); 3852 } else { 3853 AliveSuccessors.push_back(&BI.getSuccessor(0)->front()); 3854 AliveSuccessors.push_back(&BI.getSuccessor(1)->front()); 3855 UsedAssumedInformation = false; 3856 } 3857 } 3858 return UsedAssumedInformation; 3859 } 3860 3861 static bool 3862 identifyAliveSuccessors(Attributor &A, const SwitchInst &SI, 3863 AbstractAttribute &AA, 3864 SmallVectorImpl<const Instruction *> &AliveSuccessors) { 3865 bool UsedAssumedInformation = false; 3866 Optional<Constant *> C = 3867 A.getAssumedConstant(*SI.getCondition(), AA, UsedAssumedInformation); 3868 if (!C.hasValue() || isa_and_nonnull<UndefValue>(C.getValue())) { 3869 // No value yet, assume all edges are dead. 3870 } else if (isa_and_nonnull<ConstantInt>(C.getValue())) { 3871 for (auto &CaseIt : SI.cases()) { 3872 if (CaseIt.getCaseValue() == C.getValue()) { 3873 AliveSuccessors.push_back(&CaseIt.getCaseSuccessor()->front()); 3874 return UsedAssumedInformation; 3875 } 3876 } 3877 AliveSuccessors.push_back(&SI.getDefaultDest()->front()); 3878 return UsedAssumedInformation; 3879 } else { 3880 for (const BasicBlock *SuccBB : successors(SI.getParent())) 3881 AliveSuccessors.push_back(&SuccBB->front()); 3882 } 3883 return UsedAssumedInformation; 3884 } 3885 3886 ChangeStatus AAIsDeadFunction::updateImpl(Attributor &A) { 3887 ChangeStatus Change = ChangeStatus::UNCHANGED; 3888 3889 LLVM_DEBUG(dbgs() << "[AAIsDead] Live [" << AssumedLiveBlocks.size() << "/" 3890 << getAnchorScope()->size() << "] BBs and " 3891 << ToBeExploredFrom.size() << " exploration points and " 3892 << KnownDeadEnds.size() << " known dead ends\n"); 3893 3894 // Copy and clear the list of instructions we need to explore from. It is 3895 // refilled with instructions the next update has to look at. 3896 SmallVector<const Instruction *, 8> Worklist(ToBeExploredFrom.begin(), 3897 ToBeExploredFrom.end()); 3898 decltype(ToBeExploredFrom) NewToBeExploredFrom; 3899 3900 SmallVector<const Instruction *, 8> AliveSuccessors; 3901 while (!Worklist.empty()) { 3902 const Instruction *I = Worklist.pop_back_val(); 3903 LLVM_DEBUG(dbgs() << "[AAIsDead] Exploration inst: " << *I << "\n"); 3904 3905 // Fast forward for uninteresting instructions. We could look for UB here 3906 // though. 3907 while (!I->isTerminator() && !isa<CallBase>(I)) 3908 I = I->getNextNode(); 3909 3910 AliveSuccessors.clear(); 3911 3912 bool UsedAssumedInformation = false; 3913 switch (I->getOpcode()) { 3914 // TODO: look for (assumed) UB to backwards propagate "deadness". 3915 default: 3916 assert(I->isTerminator() && 3917 "Expected non-terminators to be handled already!"); 3918 for (const BasicBlock *SuccBB : successors(I->getParent())) 3919 AliveSuccessors.push_back(&SuccBB->front()); 3920 break; 3921 case Instruction::Call: 3922 UsedAssumedInformation = identifyAliveSuccessors(A, cast<CallInst>(*I), 3923 *this, AliveSuccessors); 3924 break; 3925 case Instruction::Invoke: 3926 UsedAssumedInformation = identifyAliveSuccessors(A, cast<InvokeInst>(*I), 3927 *this, AliveSuccessors); 3928 break; 3929 case Instruction::Br: 3930 UsedAssumedInformation = identifyAliveSuccessors(A, cast<BranchInst>(*I), 3931 *this, AliveSuccessors); 3932 break; 3933 case Instruction::Switch: 3934 UsedAssumedInformation = identifyAliveSuccessors(A, cast<SwitchInst>(*I), 3935 *this, AliveSuccessors); 3936 break; 3937 } 3938 3939 if (UsedAssumedInformation) { 3940 NewToBeExploredFrom.insert(I); 3941 } else if (AliveSuccessors.empty() || 3942 (I->isTerminator() && 3943 AliveSuccessors.size() < I->getNumSuccessors())) { 3944 if (KnownDeadEnds.insert(I)) 3945 Change = ChangeStatus::CHANGED; 3946 } 3947 3948 LLVM_DEBUG(dbgs() << "[AAIsDead] #AliveSuccessors: " 3949 << AliveSuccessors.size() << " UsedAssumedInformation: " 3950 << UsedAssumedInformation << "\n"); 3951 3952 for (const Instruction *AliveSuccessor : AliveSuccessors) { 3953 if (!I->isTerminator()) { 3954 assert(AliveSuccessors.size() == 1 && 3955 "Non-terminator expected to have a single successor!"); 3956 Worklist.push_back(AliveSuccessor); 3957 } else { 3958 // record the assumed live edge 3959 auto Edge = std::make_pair(I->getParent(), AliveSuccessor->getParent()); 3960 if (AssumedLiveEdges.insert(Edge).second) 3961 Change = ChangeStatus::CHANGED; 3962 if (assumeLive(A, *AliveSuccessor->getParent())) 3963 Worklist.push_back(AliveSuccessor); 3964 } 3965 } 3966 } 3967 3968 // Check if the content of ToBeExploredFrom changed, ignore the order. 3969 if (NewToBeExploredFrom.size() != ToBeExploredFrom.size() || 3970 llvm::any_of(NewToBeExploredFrom, [&](const Instruction *I) { 3971 return !ToBeExploredFrom.count(I); 3972 })) { 3973 Change = ChangeStatus::CHANGED; 3974 ToBeExploredFrom = std::move(NewToBeExploredFrom); 3975 } 3976 3977 // If we know everything is live there is no need to query for liveness. 3978 // Instead, indicating a pessimistic fixpoint will cause the state to be 3979 // "invalid" and all queries to be answered conservatively without lookups. 3980 // To be in this state we have to (1) finished the exploration and (3) not 3981 // discovered any non-trivial dead end and (2) not ruled unreachable code 3982 // dead. 3983 if (ToBeExploredFrom.empty() && 3984 getAnchorScope()->size() == AssumedLiveBlocks.size() && 3985 llvm::all_of(KnownDeadEnds, [](const Instruction *DeadEndI) { 3986 return DeadEndI->isTerminator() && DeadEndI->getNumSuccessors() == 0; 3987 })) 3988 return indicatePessimisticFixpoint(); 3989 return Change; 3990 } 3991 3992 /// Liveness information for a call sites. 3993 struct AAIsDeadCallSite final : AAIsDeadFunction { 3994 AAIsDeadCallSite(const IRPosition &IRP, Attributor &A) 3995 : AAIsDeadFunction(IRP, A) {} 3996 3997 /// See AbstractAttribute::initialize(...). 3998 void initialize(Attributor &A) override { 3999 // TODO: Once we have call site specific value information we can provide 4000 // call site specific liveness information and then it makes 4001 // sense to specialize attributes for call sites instead of 4002 // redirecting requests to the callee. 4003 llvm_unreachable("Abstract attributes for liveness are not " 4004 "supported for call sites yet!"); 4005 } 4006 4007 /// See AbstractAttribute::updateImpl(...). 4008 ChangeStatus updateImpl(Attributor &A) override { 4009 return indicatePessimisticFixpoint(); 4010 } 4011 4012 /// See AbstractAttribute::trackStatistics() 4013 void trackStatistics() const override {} 4014 }; 4015 4016 /// -------------------- Dereferenceable Argument Attribute -------------------- 4017 4018 struct AADereferenceableImpl : AADereferenceable { 4019 AADereferenceableImpl(const IRPosition &IRP, Attributor &A) 4020 : AADereferenceable(IRP, A) {} 4021 using StateType = DerefState; 4022 4023 /// See AbstractAttribute::initialize(...). 4024 void initialize(Attributor &A) override { 4025 SmallVector<Attribute, 4> Attrs; 4026 getAttrs({Attribute::Dereferenceable, Attribute::DereferenceableOrNull}, 4027 Attrs, /* IgnoreSubsumingPositions */ false, &A); 4028 for (const Attribute &Attr : Attrs) 4029 takeKnownDerefBytesMaximum(Attr.getValueAsInt()); 4030 4031 const IRPosition &IRP = this->getIRPosition(); 4032 NonNullAA = &A.getAAFor<AANonNull>(*this, IRP, DepClassTy::NONE); 4033 4034 bool CanBeNull, CanBeFreed; 4035 takeKnownDerefBytesMaximum( 4036 IRP.getAssociatedValue().getPointerDereferenceableBytes( 4037 A.getDataLayout(), CanBeNull, CanBeFreed)); 4038 4039 bool IsFnInterface = IRP.isFnInterfaceKind(); 4040 Function *FnScope = IRP.getAnchorScope(); 4041 if (IsFnInterface && (!FnScope || !A.isFunctionIPOAmendable(*FnScope))) { 4042 indicatePessimisticFixpoint(); 4043 return; 4044 } 4045 4046 if (Instruction *CtxI = getCtxI()) 4047 followUsesInMBEC(*this, A, getState(), *CtxI); 4048 } 4049 4050 /// See AbstractAttribute::getState() 4051 /// { 4052 StateType &getState() override { return *this; } 4053 const StateType &getState() const override { return *this; } 4054 /// } 4055 4056 /// Helper function for collecting accessed bytes in must-be-executed-context 4057 void addAccessedBytesForUse(Attributor &A, const Use *U, const Instruction *I, 4058 DerefState &State) { 4059 const Value *UseV = U->get(); 4060 if (!UseV->getType()->isPointerTy()) 4061 return; 4062 4063 Type *PtrTy = UseV->getType(); 4064 const DataLayout &DL = A.getDataLayout(); 4065 int64_t Offset; 4066 if (const Value *Base = getBasePointerOfAccessPointerOperand( 4067 I, Offset, DL, /*AllowNonInbounds*/ true)) { 4068 if (Base == &getAssociatedValue() && 4069 getPointerOperand(I, /* AllowVolatile */ false) == UseV) { 4070 uint64_t Size = DL.getTypeStoreSize(PtrTy->getPointerElementType()); 4071 State.addAccessedBytes(Offset, Size); 4072 } 4073 } 4074 } 4075 4076 /// See followUsesInMBEC 4077 bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I, 4078 AADereferenceable::StateType &State) { 4079 bool IsNonNull = false; 4080 bool TrackUse = false; 4081 int64_t DerefBytes = getKnownNonNullAndDerefBytesForUse( 4082 A, *this, getAssociatedValue(), U, I, IsNonNull, TrackUse); 4083 LLVM_DEBUG(dbgs() << "[AADereferenceable] Deref bytes: " << DerefBytes 4084 << " for instruction " << *I << "\n"); 4085 4086 addAccessedBytesForUse(A, U, I, State); 4087 State.takeKnownDerefBytesMaximum(DerefBytes); 4088 return TrackUse; 4089 } 4090 4091 /// See AbstractAttribute::manifest(...). 4092 ChangeStatus manifest(Attributor &A) override { 4093 ChangeStatus Change = AADereferenceable::manifest(A); 4094 if (isAssumedNonNull() && hasAttr(Attribute::DereferenceableOrNull)) { 4095 removeAttrs({Attribute::DereferenceableOrNull}); 4096 return ChangeStatus::CHANGED; 4097 } 4098 return Change; 4099 } 4100 4101 void getDeducedAttributes(LLVMContext &Ctx, 4102 SmallVectorImpl<Attribute> &Attrs) const override { 4103 // TODO: Add *_globally support 4104 if (isAssumedNonNull()) 4105 Attrs.emplace_back(Attribute::getWithDereferenceableBytes( 4106 Ctx, getAssumedDereferenceableBytes())); 4107 else 4108 Attrs.emplace_back(Attribute::getWithDereferenceableOrNullBytes( 4109 Ctx, getAssumedDereferenceableBytes())); 4110 } 4111 4112 /// See AbstractAttribute::getAsStr(). 4113 const std::string getAsStr() const override { 4114 if (!getAssumedDereferenceableBytes()) 4115 return "unknown-dereferenceable"; 4116 return std::string("dereferenceable") + 4117 (isAssumedNonNull() ? "" : "_or_null") + 4118 (isAssumedGlobal() ? "_globally" : "") + "<" + 4119 std::to_string(getKnownDereferenceableBytes()) + "-" + 4120 std::to_string(getAssumedDereferenceableBytes()) + ">"; 4121 } 4122 }; 4123 4124 /// Dereferenceable attribute for a floating value. 4125 struct AADereferenceableFloating : AADereferenceableImpl { 4126 AADereferenceableFloating(const IRPosition &IRP, Attributor &A) 4127 : AADereferenceableImpl(IRP, A) {} 4128 4129 /// See AbstractAttribute::updateImpl(...). 4130 ChangeStatus updateImpl(Attributor &A) override { 4131 const DataLayout &DL = A.getDataLayout(); 4132 4133 auto VisitValueCB = [&](const Value &V, const Instruction *, DerefState &T, 4134 bool Stripped) -> bool { 4135 unsigned IdxWidth = 4136 DL.getIndexSizeInBits(V.getType()->getPointerAddressSpace()); 4137 APInt Offset(IdxWidth, 0); 4138 const Value *Base = 4139 stripAndAccumulateMinimalOffsets(A, *this, &V, DL, Offset, false); 4140 4141 const auto &AA = A.getAAFor<AADereferenceable>( 4142 *this, IRPosition::value(*Base), DepClassTy::REQUIRED); 4143 int64_t DerefBytes = 0; 4144 if (!Stripped && this == &AA) { 4145 // Use IR information if we did not strip anything. 4146 // TODO: track globally. 4147 bool CanBeNull, CanBeFreed; 4148 DerefBytes = 4149 Base->getPointerDereferenceableBytes(DL, CanBeNull, CanBeFreed); 4150 T.GlobalState.indicatePessimisticFixpoint(); 4151 } else { 4152 const DerefState &DS = AA.getState(); 4153 DerefBytes = DS.DerefBytesState.getAssumed(); 4154 T.GlobalState &= DS.GlobalState; 4155 } 4156 4157 // For now we do not try to "increase" dereferenceability due to negative 4158 // indices as we first have to come up with code to deal with loops and 4159 // for overflows of the dereferenceable bytes. 4160 int64_t OffsetSExt = Offset.getSExtValue(); 4161 if (OffsetSExt < 0) 4162 OffsetSExt = 0; 4163 4164 T.takeAssumedDerefBytesMinimum( 4165 std::max(int64_t(0), DerefBytes - OffsetSExt)); 4166 4167 if (this == &AA) { 4168 if (!Stripped) { 4169 // If nothing was stripped IR information is all we got. 4170 T.takeKnownDerefBytesMaximum( 4171 std::max(int64_t(0), DerefBytes - OffsetSExt)); 4172 T.indicatePessimisticFixpoint(); 4173 } else if (OffsetSExt > 0) { 4174 // If something was stripped but there is circular reasoning we look 4175 // for the offset. If it is positive we basically decrease the 4176 // dereferenceable bytes in a circluar loop now, which will simply 4177 // drive them down to the known value in a very slow way which we 4178 // can accelerate. 4179 T.indicatePessimisticFixpoint(); 4180 } 4181 } 4182 4183 return T.isValidState(); 4184 }; 4185 4186 DerefState T; 4187 if (!genericValueTraversal<DerefState>(A, getIRPosition(), *this, T, 4188 VisitValueCB, getCtxI())) 4189 return indicatePessimisticFixpoint(); 4190 4191 return clampStateAndIndicateChange(getState(), T); 4192 } 4193 4194 /// See AbstractAttribute::trackStatistics() 4195 void trackStatistics() const override { 4196 STATS_DECLTRACK_FLOATING_ATTR(dereferenceable) 4197 } 4198 }; 4199 4200 /// Dereferenceable attribute for a return value. 4201 struct AADereferenceableReturned final 4202 : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl> { 4203 AADereferenceableReturned(const IRPosition &IRP, Attributor &A) 4204 : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl>( 4205 IRP, A) {} 4206 4207 /// See AbstractAttribute::trackStatistics() 4208 void trackStatistics() const override { 4209 STATS_DECLTRACK_FNRET_ATTR(dereferenceable) 4210 } 4211 }; 4212 4213 /// Dereferenceable attribute for an argument 4214 struct AADereferenceableArgument final 4215 : AAArgumentFromCallSiteArguments<AADereferenceable, 4216 AADereferenceableImpl> { 4217 using Base = 4218 AAArgumentFromCallSiteArguments<AADereferenceable, AADereferenceableImpl>; 4219 AADereferenceableArgument(const IRPosition &IRP, Attributor &A) 4220 : Base(IRP, A) {} 4221 4222 /// See AbstractAttribute::trackStatistics() 4223 void trackStatistics() const override { 4224 STATS_DECLTRACK_ARG_ATTR(dereferenceable) 4225 } 4226 }; 4227 4228 /// Dereferenceable attribute for a call site argument. 4229 struct AADereferenceableCallSiteArgument final : AADereferenceableFloating { 4230 AADereferenceableCallSiteArgument(const IRPosition &IRP, Attributor &A) 4231 : AADereferenceableFloating(IRP, A) {} 4232 4233 /// See AbstractAttribute::trackStatistics() 4234 void trackStatistics() const override { 4235 STATS_DECLTRACK_CSARG_ATTR(dereferenceable) 4236 } 4237 }; 4238 4239 /// Dereferenceable attribute deduction for a call site return value. 4240 struct AADereferenceableCallSiteReturned final 4241 : AACallSiteReturnedFromReturned<AADereferenceable, AADereferenceableImpl> { 4242 using Base = 4243 AACallSiteReturnedFromReturned<AADereferenceable, AADereferenceableImpl>; 4244 AADereferenceableCallSiteReturned(const IRPosition &IRP, Attributor &A) 4245 : Base(IRP, A) {} 4246 4247 /// See AbstractAttribute::trackStatistics() 4248 void trackStatistics() const override { 4249 STATS_DECLTRACK_CS_ATTR(dereferenceable); 4250 } 4251 }; 4252 4253 // ------------------------ Align Argument Attribute ------------------------ 4254 4255 static unsigned getKnownAlignForUse(Attributor &A, AAAlign &QueryingAA, 4256 Value &AssociatedValue, const Use *U, 4257 const Instruction *I, bool &TrackUse) { 4258 // We need to follow common pointer manipulation uses to the accesses they 4259 // feed into. 4260 if (isa<CastInst>(I)) { 4261 // Follow all but ptr2int casts. 4262 TrackUse = !isa<PtrToIntInst>(I); 4263 return 0; 4264 } 4265 if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) { 4266 if (GEP->hasAllConstantIndices()) 4267 TrackUse = true; 4268 return 0; 4269 } 4270 4271 MaybeAlign MA; 4272 if (const auto *CB = dyn_cast<CallBase>(I)) { 4273 if (CB->isBundleOperand(U) || CB->isCallee(U)) 4274 return 0; 4275 4276 unsigned ArgNo = CB->getArgOperandNo(U); 4277 IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo); 4278 // As long as we only use known information there is no need to track 4279 // dependences here. 4280 auto &AlignAA = A.getAAFor<AAAlign>(QueryingAA, IRP, DepClassTy::NONE); 4281 MA = MaybeAlign(AlignAA.getKnownAlign()); 4282 } 4283 4284 const DataLayout &DL = A.getDataLayout(); 4285 const Value *UseV = U->get(); 4286 if (auto *SI = dyn_cast<StoreInst>(I)) { 4287 if (SI->getPointerOperand() == UseV) 4288 MA = SI->getAlign(); 4289 } else if (auto *LI = dyn_cast<LoadInst>(I)) { 4290 if (LI->getPointerOperand() == UseV) 4291 MA = LI->getAlign(); 4292 } 4293 4294 if (!MA || *MA <= QueryingAA.getKnownAlign()) 4295 return 0; 4296 4297 unsigned Alignment = MA->value(); 4298 int64_t Offset; 4299 4300 if (const Value *Base = GetPointerBaseWithConstantOffset(UseV, Offset, DL)) { 4301 if (Base == &AssociatedValue) { 4302 // BasePointerAddr + Offset = Alignment * Q for some integer Q. 4303 // So we can say that the maximum power of two which is a divisor of 4304 // gcd(Offset, Alignment) is an alignment. 4305 4306 uint32_t gcd = 4307 greatestCommonDivisor(uint32_t(abs((int32_t)Offset)), Alignment); 4308 Alignment = llvm::PowerOf2Floor(gcd); 4309 } 4310 } 4311 4312 return Alignment; 4313 } 4314 4315 struct AAAlignImpl : AAAlign { 4316 AAAlignImpl(const IRPosition &IRP, Attributor &A) : AAAlign(IRP, A) {} 4317 4318 /// See AbstractAttribute::initialize(...). 4319 void initialize(Attributor &A) override { 4320 SmallVector<Attribute, 4> Attrs; 4321 getAttrs({Attribute::Alignment}, Attrs); 4322 for (const Attribute &Attr : Attrs) 4323 takeKnownMaximum(Attr.getValueAsInt()); 4324 4325 Value &V = getAssociatedValue(); 4326 // TODO: This is a HACK to avoid getPointerAlignment to introduce a ptr2int 4327 // use of the function pointer. This was caused by D73131. We want to 4328 // avoid this for function pointers especially because we iterate 4329 // their uses and int2ptr is not handled. It is not a correctness 4330 // problem though! 4331 if (!V.getType()->getPointerElementType()->isFunctionTy()) 4332 takeKnownMaximum(V.getPointerAlignment(A.getDataLayout()).value()); 4333 4334 if (getIRPosition().isFnInterfaceKind() && 4335 (!getAnchorScope() || 4336 !A.isFunctionIPOAmendable(*getAssociatedFunction()))) { 4337 indicatePessimisticFixpoint(); 4338 return; 4339 } 4340 4341 if (Instruction *CtxI = getCtxI()) 4342 followUsesInMBEC(*this, A, getState(), *CtxI); 4343 } 4344 4345 /// See AbstractAttribute::manifest(...). 4346 ChangeStatus manifest(Attributor &A) override { 4347 ChangeStatus LoadStoreChanged = ChangeStatus::UNCHANGED; 4348 4349 // Check for users that allow alignment annotations. 4350 Value &AssociatedValue = getAssociatedValue(); 4351 for (const Use &U : AssociatedValue.uses()) { 4352 if (auto *SI = dyn_cast<StoreInst>(U.getUser())) { 4353 if (SI->getPointerOperand() == &AssociatedValue) 4354 if (SI->getAlignment() < getAssumedAlign()) { 4355 STATS_DECLTRACK(AAAlign, Store, 4356 "Number of times alignment added to a store"); 4357 SI->setAlignment(Align(getAssumedAlign())); 4358 LoadStoreChanged = ChangeStatus::CHANGED; 4359 } 4360 } else if (auto *LI = dyn_cast<LoadInst>(U.getUser())) { 4361 if (LI->getPointerOperand() == &AssociatedValue) 4362 if (LI->getAlignment() < getAssumedAlign()) { 4363 LI->setAlignment(Align(getAssumedAlign())); 4364 STATS_DECLTRACK(AAAlign, Load, 4365 "Number of times alignment added to a load"); 4366 LoadStoreChanged = ChangeStatus::CHANGED; 4367 } 4368 } 4369 } 4370 4371 ChangeStatus Changed = AAAlign::manifest(A); 4372 4373 Align InheritAlign = 4374 getAssociatedValue().getPointerAlignment(A.getDataLayout()); 4375 if (InheritAlign >= getAssumedAlign()) 4376 return LoadStoreChanged; 4377 return Changed | LoadStoreChanged; 4378 } 4379 4380 // TODO: Provide a helper to determine the implied ABI alignment and check in 4381 // the existing manifest method and a new one for AAAlignImpl that value 4382 // to avoid making the alignment explicit if it did not improve. 4383 4384 /// See AbstractAttribute::getDeducedAttributes 4385 virtual void 4386 getDeducedAttributes(LLVMContext &Ctx, 4387 SmallVectorImpl<Attribute> &Attrs) const override { 4388 if (getAssumedAlign() > 1) 4389 Attrs.emplace_back( 4390 Attribute::getWithAlignment(Ctx, Align(getAssumedAlign()))); 4391 } 4392 4393 /// See followUsesInMBEC 4394 bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I, 4395 AAAlign::StateType &State) { 4396 bool TrackUse = false; 4397 4398 unsigned int KnownAlign = 4399 getKnownAlignForUse(A, *this, getAssociatedValue(), U, I, TrackUse); 4400 State.takeKnownMaximum(KnownAlign); 4401 4402 return TrackUse; 4403 } 4404 4405 /// See AbstractAttribute::getAsStr(). 4406 const std::string getAsStr() const override { 4407 return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) + 4408 "-" + std::to_string(getAssumedAlign()) + ">") 4409 : "unknown-align"; 4410 } 4411 }; 4412 4413 /// Align attribute for a floating value. 4414 struct AAAlignFloating : AAAlignImpl { 4415 AAAlignFloating(const IRPosition &IRP, Attributor &A) : AAAlignImpl(IRP, A) {} 4416 4417 /// See AbstractAttribute::updateImpl(...). 4418 ChangeStatus updateImpl(Attributor &A) override { 4419 const DataLayout &DL = A.getDataLayout(); 4420 4421 auto VisitValueCB = [&](Value &V, const Instruction *, 4422 AAAlign::StateType &T, bool Stripped) -> bool { 4423 const auto &AA = A.getAAFor<AAAlign>(*this, IRPosition::value(V), 4424 DepClassTy::REQUIRED); 4425 if (!Stripped && this == &AA) { 4426 int64_t Offset; 4427 unsigned Alignment = 1; 4428 if (const Value *Base = 4429 GetPointerBaseWithConstantOffset(&V, Offset, DL)) { 4430 Align PA = Base->getPointerAlignment(DL); 4431 // BasePointerAddr + Offset = Alignment * Q for some integer Q. 4432 // So we can say that the maximum power of two which is a divisor of 4433 // gcd(Offset, Alignment) is an alignment. 4434 4435 uint32_t gcd = greatestCommonDivisor(uint32_t(abs((int32_t)Offset)), 4436 uint32_t(PA.value())); 4437 Alignment = llvm::PowerOf2Floor(gcd); 4438 } else { 4439 Alignment = V.getPointerAlignment(DL).value(); 4440 } 4441 // Use only IR information if we did not strip anything. 4442 T.takeKnownMaximum(Alignment); 4443 T.indicatePessimisticFixpoint(); 4444 } else { 4445 // Use abstract attribute information. 4446 const AAAlign::StateType &DS = AA.getState(); 4447 T ^= DS; 4448 } 4449 return T.isValidState(); 4450 }; 4451 4452 StateType T; 4453 if (!genericValueTraversal<StateType>(A, getIRPosition(), *this, T, 4454 VisitValueCB, getCtxI())) 4455 return indicatePessimisticFixpoint(); 4456 4457 // TODO: If we know we visited all incoming values, thus no are assumed 4458 // dead, we can take the known information from the state T. 4459 return clampStateAndIndicateChange(getState(), T); 4460 } 4461 4462 /// See AbstractAttribute::trackStatistics() 4463 void trackStatistics() const override { STATS_DECLTRACK_FLOATING_ATTR(align) } 4464 }; 4465 4466 /// Align attribute for function return value. 4467 struct AAAlignReturned final 4468 : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl> { 4469 using Base = AAReturnedFromReturnedValues<AAAlign, AAAlignImpl>; 4470 AAAlignReturned(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {} 4471 4472 /// See AbstractAttribute::initialize(...). 4473 void initialize(Attributor &A) override { 4474 Base::initialize(A); 4475 Function *F = getAssociatedFunction(); 4476 if (!F || F->isDeclaration()) 4477 indicatePessimisticFixpoint(); 4478 } 4479 4480 /// See AbstractAttribute::trackStatistics() 4481 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(aligned) } 4482 }; 4483 4484 /// Align attribute for function argument. 4485 struct AAAlignArgument final 4486 : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl> { 4487 using Base = AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl>; 4488 AAAlignArgument(const IRPosition &IRP, Attributor &A) : Base(IRP, A) {} 4489 4490 /// See AbstractAttribute::manifest(...). 4491 ChangeStatus manifest(Attributor &A) override { 4492 // If the associated argument is involved in a must-tail call we give up 4493 // because we would need to keep the argument alignments of caller and 4494 // callee in-sync. Just does not seem worth the trouble right now. 4495 if (A.getInfoCache().isInvolvedInMustTailCall(*getAssociatedArgument())) 4496 return ChangeStatus::UNCHANGED; 4497 return Base::manifest(A); 4498 } 4499 4500 /// See AbstractAttribute::trackStatistics() 4501 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(aligned) } 4502 }; 4503 4504 struct AAAlignCallSiteArgument final : AAAlignFloating { 4505 AAAlignCallSiteArgument(const IRPosition &IRP, Attributor &A) 4506 : AAAlignFloating(IRP, A) {} 4507 4508 /// See AbstractAttribute::manifest(...). 4509 ChangeStatus manifest(Attributor &A) override { 4510 // If the associated argument is involved in a must-tail call we give up 4511 // because we would need to keep the argument alignments of caller and 4512 // callee in-sync. Just does not seem worth the trouble right now. 4513 if (Argument *Arg = getAssociatedArgument()) 4514 if (A.getInfoCache().isInvolvedInMustTailCall(*Arg)) 4515 return ChangeStatus::UNCHANGED; 4516 ChangeStatus Changed = AAAlignImpl::manifest(A); 4517 Align InheritAlign = 4518 getAssociatedValue().getPointerAlignment(A.getDataLayout()); 4519 if (InheritAlign >= getAssumedAlign()) 4520 Changed = ChangeStatus::UNCHANGED; 4521 return Changed; 4522 } 4523 4524 /// See AbstractAttribute::updateImpl(Attributor &A). 4525 ChangeStatus updateImpl(Attributor &A) override { 4526 ChangeStatus Changed = AAAlignFloating::updateImpl(A); 4527 if (Argument *Arg = getAssociatedArgument()) { 4528 // We only take known information from the argument 4529 // so we do not need to track a dependence. 4530 const auto &ArgAlignAA = A.getAAFor<AAAlign>( 4531 *this, IRPosition::argument(*Arg), DepClassTy::NONE); 4532 takeKnownMaximum(ArgAlignAA.getKnownAlign()); 4533 } 4534 return Changed; 4535 } 4536 4537 /// See AbstractAttribute::trackStatistics() 4538 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(aligned) } 4539 }; 4540 4541 /// Align attribute deduction for a call site return value. 4542 struct AAAlignCallSiteReturned final 4543 : AACallSiteReturnedFromReturned<AAAlign, AAAlignImpl> { 4544 using Base = AACallSiteReturnedFromReturned<AAAlign, AAAlignImpl>; 4545 AAAlignCallSiteReturned(const IRPosition &IRP, Attributor &A) 4546 : Base(IRP, A) {} 4547 4548 /// See AbstractAttribute::initialize(...). 4549 void initialize(Attributor &A) override { 4550 Base::initialize(A); 4551 Function *F = getAssociatedFunction(); 4552 if (!F || F->isDeclaration()) 4553 indicatePessimisticFixpoint(); 4554 } 4555 4556 /// See AbstractAttribute::trackStatistics() 4557 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(align); } 4558 }; 4559 4560 /// ------------------ Function No-Return Attribute ---------------------------- 4561 struct AANoReturnImpl : public AANoReturn { 4562 AANoReturnImpl(const IRPosition &IRP, Attributor &A) : AANoReturn(IRP, A) {} 4563 4564 /// See AbstractAttribute::initialize(...). 4565 void initialize(Attributor &A) override { 4566 AANoReturn::initialize(A); 4567 Function *F = getAssociatedFunction(); 4568 if (!F || F->isDeclaration()) 4569 indicatePessimisticFixpoint(); 4570 } 4571 4572 /// See AbstractAttribute::getAsStr(). 4573 const std::string getAsStr() const override { 4574 return getAssumed() ? "noreturn" : "may-return"; 4575 } 4576 4577 /// See AbstractAttribute::updateImpl(Attributor &A). 4578 virtual ChangeStatus updateImpl(Attributor &A) override { 4579 auto CheckForNoReturn = [](Instruction &) { return false; }; 4580 bool UsedAssumedInformation = false; 4581 if (!A.checkForAllInstructions(CheckForNoReturn, *this, 4582 {(unsigned)Instruction::Ret}, 4583 UsedAssumedInformation)) 4584 return indicatePessimisticFixpoint(); 4585 return ChangeStatus::UNCHANGED; 4586 } 4587 }; 4588 4589 struct AANoReturnFunction final : AANoReturnImpl { 4590 AANoReturnFunction(const IRPosition &IRP, Attributor &A) 4591 : AANoReturnImpl(IRP, A) {} 4592 4593 /// See AbstractAttribute::trackStatistics() 4594 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(noreturn) } 4595 }; 4596 4597 /// NoReturn attribute deduction for a call sites. 4598 struct AANoReturnCallSite final : AANoReturnImpl { 4599 AANoReturnCallSite(const IRPosition &IRP, Attributor &A) 4600 : AANoReturnImpl(IRP, A) {} 4601 4602 /// See AbstractAttribute::initialize(...). 4603 void initialize(Attributor &A) override { 4604 AANoReturnImpl::initialize(A); 4605 if (Function *F = getAssociatedFunction()) { 4606 const IRPosition &FnPos = IRPosition::function(*F); 4607 auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED); 4608 if (!FnAA.isAssumedNoReturn()) 4609 indicatePessimisticFixpoint(); 4610 } 4611 } 4612 4613 /// See AbstractAttribute::updateImpl(...). 4614 ChangeStatus updateImpl(Attributor &A) override { 4615 // TODO: Once we have call site specific value information we can provide 4616 // call site specific liveness information and then it makes 4617 // sense to specialize attributes for call sites arguments instead of 4618 // redirecting requests to the callee argument. 4619 Function *F = getAssociatedFunction(); 4620 const IRPosition &FnPos = IRPosition::function(*F); 4621 auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos, DepClassTy::REQUIRED); 4622 return clampStateAndIndicateChange(getState(), FnAA.getState()); 4623 } 4624 4625 /// See AbstractAttribute::trackStatistics() 4626 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(noreturn); } 4627 }; 4628 4629 /// ----------------------- Variable Capturing --------------------------------- 4630 4631 /// A class to hold the state of for no-capture attributes. 4632 struct AANoCaptureImpl : public AANoCapture { 4633 AANoCaptureImpl(const IRPosition &IRP, Attributor &A) : AANoCapture(IRP, A) {} 4634 4635 /// See AbstractAttribute::initialize(...). 4636 void initialize(Attributor &A) override { 4637 if (hasAttr(getAttrKind(), /* IgnoreSubsumingPositions */ true)) { 4638 indicateOptimisticFixpoint(); 4639 return; 4640 } 4641 Function *AnchorScope = getAnchorScope(); 4642 if (isFnInterfaceKind() && 4643 (!AnchorScope || !A.isFunctionIPOAmendable(*AnchorScope))) { 4644 indicatePessimisticFixpoint(); 4645 return; 4646 } 4647 4648 // You cannot "capture" null in the default address space. 4649 if (isa<ConstantPointerNull>(getAssociatedValue()) && 4650 getAssociatedValue().getType()->getPointerAddressSpace() == 0) { 4651 indicateOptimisticFixpoint(); 4652 return; 4653 } 4654 4655 const Function *F = 4656 isArgumentPosition() ? getAssociatedFunction() : AnchorScope; 4657 4658 // Check what state the associated function can actually capture. 4659 if (F) 4660 determineFunctionCaptureCapabilities(getIRPosition(), *F, *this); 4661 else 4662 indicatePessimisticFixpoint(); 4663 } 4664 4665 /// See AbstractAttribute::updateImpl(...). 4666 ChangeStatus updateImpl(Attributor &A) override; 4667 4668 /// see AbstractAttribute::isAssumedNoCaptureMaybeReturned(...). 4669 virtual void 4670 getDeducedAttributes(LLVMContext &Ctx, 4671 SmallVectorImpl<Attribute> &Attrs) const override { 4672 if (!isAssumedNoCaptureMaybeReturned()) 4673 return; 4674 4675 if (isArgumentPosition()) { 4676 if (isAssumedNoCapture()) 4677 Attrs.emplace_back(Attribute::get(Ctx, Attribute::NoCapture)); 4678 else if (ManifestInternal) 4679 Attrs.emplace_back(Attribute::get(Ctx, "no-capture-maybe-returned")); 4680 } 4681 } 4682 4683 /// Set the NOT_CAPTURED_IN_MEM and NOT_CAPTURED_IN_RET bits in \p Known 4684 /// depending on the ability of the function associated with \p IRP to capture 4685 /// state in memory and through "returning/throwing", respectively. 4686 static void determineFunctionCaptureCapabilities(const IRPosition &IRP, 4687 const Function &F, 4688 BitIntegerState &State) { 4689 // TODO: Once we have memory behavior attributes we should use them here. 4690 4691 // If we know we cannot communicate or write to memory, we do not care about 4692 // ptr2int anymore. 4693 if (F.onlyReadsMemory() && F.doesNotThrow() && 4694 F.getReturnType()->isVoidTy()) { 4695 State.addKnownBits(NO_CAPTURE); 4696 return; 4697 } 4698 4699 // A function cannot capture state in memory if it only reads memory, it can 4700 // however return/throw state and the state might be influenced by the 4701 // pointer value, e.g., loading from a returned pointer might reveal a bit. 4702 if (F.onlyReadsMemory()) 4703 State.addKnownBits(NOT_CAPTURED_IN_MEM); 4704 4705 // A function cannot communicate state back if it does not through 4706 // exceptions and doesn not return values. 4707 if (F.doesNotThrow() && F.getReturnType()->isVoidTy()) 4708 State.addKnownBits(NOT_CAPTURED_IN_RET); 4709 4710 // Check existing "returned" attributes. 4711 int ArgNo = IRP.getCalleeArgNo(); 4712 if (F.doesNotThrow() && ArgNo >= 0) { 4713 for (unsigned u = 0, e = F.arg_size(); u < e; ++u) 4714 if (F.hasParamAttribute(u, Attribute::Returned)) { 4715 if (u == unsigned(ArgNo)) 4716 State.removeAssumedBits(NOT_CAPTURED_IN_RET); 4717 else if (F.onlyReadsMemory()) 4718 State.addKnownBits(NO_CAPTURE); 4719 else 4720 State.addKnownBits(NOT_CAPTURED_IN_RET); 4721 break; 4722 } 4723 } 4724 } 4725 4726 /// See AbstractState::getAsStr(). 4727 const std::string getAsStr() const override { 4728 if (isKnownNoCapture()) 4729 return "known not-captured"; 4730 if (isAssumedNoCapture()) 4731 return "assumed not-captured"; 4732 if (isKnownNoCaptureMaybeReturned()) 4733 return "known not-captured-maybe-returned"; 4734 if (isAssumedNoCaptureMaybeReturned()) 4735 return "assumed not-captured-maybe-returned"; 4736 return "assumed-captured"; 4737 } 4738 }; 4739 4740 /// Attributor-aware capture tracker. 4741 struct AACaptureUseTracker final : public CaptureTracker { 4742 4743 /// Create a capture tracker that can lookup in-flight abstract attributes 4744 /// through the Attributor \p A. 4745 /// 4746 /// If a use leads to a potential capture, \p CapturedInMemory is set and the 4747 /// search is stopped. If a use leads to a return instruction, 4748 /// \p CommunicatedBack is set to true and \p CapturedInMemory is not changed. 4749 /// If a use leads to a ptr2int which may capture the value, 4750 /// \p CapturedInInteger is set. If a use is found that is currently assumed 4751 /// "no-capture-maybe-returned", the user is added to the \p PotentialCopies 4752 /// set. All values in \p PotentialCopies are later tracked as well. For every 4753 /// explored use we decrement \p RemainingUsesToExplore. Once it reaches 0, 4754 /// the search is stopped with \p CapturedInMemory and \p CapturedInInteger 4755 /// conservatively set to true. 4756 AACaptureUseTracker(Attributor &A, AANoCapture &NoCaptureAA, 4757 const AAIsDead &IsDeadAA, AANoCapture::StateType &State, 4758 SmallSetVector<Value *, 4> &PotentialCopies, 4759 unsigned &RemainingUsesToExplore) 4760 : A(A), NoCaptureAA(NoCaptureAA), IsDeadAA(IsDeadAA), State(State), 4761 PotentialCopies(PotentialCopies), 4762 RemainingUsesToExplore(RemainingUsesToExplore) {} 4763 4764 /// Determine if \p V maybe captured. *Also updates the state!* 4765 bool valueMayBeCaptured(const Value *V) { 4766 if (V->getType()->isPointerTy()) { 4767 PointerMayBeCaptured(V, this); 4768 } else { 4769 State.indicatePessimisticFixpoint(); 4770 } 4771 return State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED); 4772 } 4773 4774 /// See CaptureTracker::tooManyUses(). 4775 void tooManyUses() override { 4776 State.removeAssumedBits(AANoCapture::NO_CAPTURE); 4777 } 4778 4779 bool isDereferenceableOrNull(Value *O, const DataLayout &DL) override { 4780 if (CaptureTracker::isDereferenceableOrNull(O, DL)) 4781 return true; 4782 const auto &DerefAA = A.getAAFor<AADereferenceable>( 4783 NoCaptureAA, IRPosition::value(*O), DepClassTy::OPTIONAL); 4784 return DerefAA.getAssumedDereferenceableBytes(); 4785 } 4786 4787 /// See CaptureTracker::captured(...). 4788 bool captured(const Use *U) override { 4789 Instruction *UInst = cast<Instruction>(U->getUser()); 4790 LLVM_DEBUG(dbgs() << "Check use: " << *U->get() << " in " << *UInst 4791 << "\n"); 4792 4793 // Because we may reuse the tracker multiple times we keep track of the 4794 // number of explored uses ourselves as well. 4795 if (RemainingUsesToExplore-- == 0) { 4796 LLVM_DEBUG(dbgs() << " - too many uses to explore!\n"); 4797 return isCapturedIn(/* Memory */ true, /* Integer */ true, 4798 /* Return */ true); 4799 } 4800 4801 // Deal with ptr2int by following uses. 4802 if (isa<PtrToIntInst>(UInst)) { 4803 LLVM_DEBUG(dbgs() << " - ptr2int assume the worst!\n"); 4804 return valueMayBeCaptured(UInst); 4805 } 4806 4807 // For stores we check if we can follow the value through memory or not. 4808 if (auto *SI = dyn_cast<StoreInst>(UInst)) { 4809 if (SI->isVolatile()) 4810 return isCapturedIn(/* Memory */ true, /* Integer */ false, 4811 /* Return */ false); 4812 bool UsedAssumedInformation = false; 4813 if (!AA::getPotentialCopiesOfStoredValue( 4814 A, *SI, PotentialCopies, NoCaptureAA, UsedAssumedInformation)) 4815 return isCapturedIn(/* Memory */ true, /* Integer */ false, 4816 /* Return */ false); 4817 // Not captured directly, potential copies will be checked. 4818 return isCapturedIn(/* Memory */ false, /* Integer */ false, 4819 /* Return */ false); 4820 } 4821 4822 // Explicitly catch return instructions. 4823 if (isa<ReturnInst>(UInst)) { 4824 if (UInst->getFunction() == NoCaptureAA.getAnchorScope()) 4825 return isCapturedIn(/* Memory */ false, /* Integer */ false, 4826 /* Return */ true); 4827 return isCapturedIn(/* Memory */ true, /* Integer */ true, 4828 /* Return */ true); 4829 } 4830 4831 // For now we only use special logic for call sites. However, the tracker 4832 // itself knows about a lot of other non-capturing cases already. 4833 auto *CB = dyn_cast<CallBase>(UInst); 4834 if (!CB || !CB->isArgOperand(U)) 4835 return isCapturedIn(/* Memory */ true, /* Integer */ true, 4836 /* Return */ true); 4837 4838 unsigned ArgNo = CB->getArgOperandNo(U); 4839 const IRPosition &CSArgPos = IRPosition::callsite_argument(*CB, ArgNo); 4840 // If we have a abstract no-capture attribute for the argument we can use 4841 // it to justify a non-capture attribute here. This allows recursion! 4842 auto &ArgNoCaptureAA = 4843 A.getAAFor<AANoCapture>(NoCaptureAA, CSArgPos, DepClassTy::REQUIRED); 4844 if (ArgNoCaptureAA.isAssumedNoCapture()) 4845 return isCapturedIn(/* Memory */ false, /* Integer */ false, 4846 /* Return */ false); 4847 if (ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) { 4848 addPotentialCopy(*CB); 4849 return isCapturedIn(/* Memory */ false, /* Integer */ false, 4850 /* Return */ false); 4851 } 4852 4853 // Lastly, we could not find a reason no-capture can be assumed so we don't. 4854 return isCapturedIn(/* Memory */ true, /* Integer */ true, 4855 /* Return */ true); 4856 } 4857 4858 /// Register \p CS as potential copy of the value we are checking. 4859 void addPotentialCopy(CallBase &CB) { PotentialCopies.insert(&CB); } 4860 4861 /// See CaptureTracker::shouldExplore(...). 4862 bool shouldExplore(const Use *U) override { 4863 // Check liveness and ignore droppable users. 4864 bool UsedAssumedInformation = false; 4865 return !U->getUser()->isDroppable() && 4866 !A.isAssumedDead(*U, &NoCaptureAA, &IsDeadAA, 4867 UsedAssumedInformation); 4868 } 4869 4870 /// Update the state according to \p CapturedInMem, \p CapturedInInt, and 4871 /// \p CapturedInRet, then return the appropriate value for use in the 4872 /// CaptureTracker::captured() interface. 4873 bool isCapturedIn(bool CapturedInMem, bool CapturedInInt, 4874 bool CapturedInRet) { 4875 LLVM_DEBUG(dbgs() << " - captures [Mem " << CapturedInMem << "|Int " 4876 << CapturedInInt << "|Ret " << CapturedInRet << "]\n"); 4877 if (CapturedInMem) 4878 State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_MEM); 4879 if (CapturedInInt) 4880 State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_INT); 4881 if (CapturedInRet) 4882 State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_RET); 4883 return !State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED); 4884 } 4885 4886 private: 4887 /// The attributor providing in-flight abstract attributes. 4888 Attributor &A; 4889 4890 /// The abstract attribute currently updated. 4891 AANoCapture &NoCaptureAA; 4892 4893 /// The abstract liveness state. 4894 const AAIsDead &IsDeadAA; 4895 4896 /// The state currently updated. 4897 AANoCapture::StateType &State; 4898 4899 /// Set of potential copies of the tracked value. 4900 SmallSetVector<Value *, 4> &PotentialCopies; 4901 4902 /// Global counter to limit the number of explored uses. 4903 unsigned &RemainingUsesToExplore; 4904 }; 4905 4906 ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) { 4907 const IRPosition &IRP = getIRPosition(); 4908 Value *V = isArgumentPosition() ? IRP.getAssociatedArgument() 4909 : &IRP.getAssociatedValue(); 4910 if (!V) 4911 return indicatePessimisticFixpoint(); 4912 4913 const Function *F = 4914 isArgumentPosition() ? IRP.getAssociatedFunction() : IRP.getAnchorScope(); 4915 assert(F && "Expected a function!"); 4916 const IRPosition &FnPos = IRPosition::function(*F); 4917 const auto &IsDeadAA = A.getAAFor<AAIsDead>(*this, FnPos, DepClassTy::NONE); 4918 4919 AANoCapture::StateType T; 4920 4921 // Readonly means we cannot capture through memory. 4922 const auto &FnMemAA = 4923 A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::NONE); 4924 if (FnMemAA.isAssumedReadOnly()) { 4925 T.addKnownBits(NOT_CAPTURED_IN_MEM); 4926 if (FnMemAA.isKnownReadOnly()) 4927 addKnownBits(NOT_CAPTURED_IN_MEM); 4928 else 4929 A.recordDependence(FnMemAA, *this, DepClassTy::OPTIONAL); 4930 } 4931 4932 // Make sure all returned values are different than the underlying value. 4933 // TODO: we could do this in a more sophisticated way inside 4934 // AAReturnedValues, e.g., track all values that escape through returns 4935 // directly somehow. 4936 auto CheckReturnedArgs = [&](const AAReturnedValues &RVAA) { 4937 bool SeenConstant = false; 4938 for (auto &It : RVAA.returned_values()) { 4939 if (isa<Constant>(It.first)) { 4940 if (SeenConstant) 4941 return false; 4942 SeenConstant = true; 4943 } else if (!isa<Argument>(It.first) || 4944 It.first == getAssociatedArgument()) 4945 return false; 4946 } 4947 return true; 4948 }; 4949 4950 const auto &NoUnwindAA = 4951 A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::OPTIONAL); 4952 if (NoUnwindAA.isAssumedNoUnwind()) { 4953 bool IsVoidTy = F->getReturnType()->isVoidTy(); 4954 const AAReturnedValues *RVAA = 4955 IsVoidTy ? nullptr 4956 : &A.getAAFor<AAReturnedValues>(*this, FnPos, 4957 4958 DepClassTy::OPTIONAL); 4959 if (IsVoidTy || CheckReturnedArgs(*RVAA)) { 4960 T.addKnownBits(NOT_CAPTURED_IN_RET); 4961 if (T.isKnown(NOT_CAPTURED_IN_MEM)) 4962 return ChangeStatus::UNCHANGED; 4963 if (NoUnwindAA.isKnownNoUnwind() && 4964 (IsVoidTy || RVAA->getState().isAtFixpoint())) { 4965 addKnownBits(NOT_CAPTURED_IN_RET); 4966 if (isKnown(NOT_CAPTURED_IN_MEM)) 4967 return indicateOptimisticFixpoint(); 4968 } 4969 } 4970 } 4971 4972 // Use the CaptureTracker interface and logic with the specialized tracker, 4973 // defined in AACaptureUseTracker, that can look at in-flight abstract 4974 // attributes and directly updates the assumed state. 4975 SmallSetVector<Value *, 4> PotentialCopies; 4976 unsigned RemainingUsesToExplore = 4977 getDefaultMaxUsesToExploreForCaptureTracking(); 4978 AACaptureUseTracker Tracker(A, *this, IsDeadAA, T, PotentialCopies, 4979 RemainingUsesToExplore); 4980 4981 // Check all potential copies of the associated value until we can assume 4982 // none will be captured or we have to assume at least one might be. 4983 unsigned Idx = 0; 4984 PotentialCopies.insert(V); 4985 while (T.isAssumed(NO_CAPTURE_MAYBE_RETURNED) && Idx < PotentialCopies.size()) 4986 Tracker.valueMayBeCaptured(PotentialCopies[Idx++]); 4987 4988 AANoCapture::StateType &S = getState(); 4989 auto Assumed = S.getAssumed(); 4990 S.intersectAssumedBits(T.getAssumed()); 4991 if (!isAssumedNoCaptureMaybeReturned()) 4992 return indicatePessimisticFixpoint(); 4993 return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED 4994 : ChangeStatus::CHANGED; 4995 } 4996 4997 /// NoCapture attribute for function arguments. 4998 struct AANoCaptureArgument final : AANoCaptureImpl { 4999 AANoCaptureArgument(const IRPosition &IRP, Attributor &A) 5000 : AANoCaptureImpl(IRP, A) {} 5001 5002 /// See AbstractAttribute::trackStatistics() 5003 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nocapture) } 5004 }; 5005 5006 /// NoCapture attribute for call site arguments. 5007 struct AANoCaptureCallSiteArgument final : AANoCaptureImpl { 5008 AANoCaptureCallSiteArgument(const IRPosition &IRP, Attributor &A) 5009 : AANoCaptureImpl(IRP, A) {} 5010 5011 /// See AbstractAttribute::initialize(...). 5012 void initialize(Attributor &A) override { 5013 if (Argument *Arg = getAssociatedArgument()) 5014 if (Arg->hasByValAttr()) 5015 indicateOptimisticFixpoint(); 5016 AANoCaptureImpl::initialize(A); 5017 } 5018 5019 /// See AbstractAttribute::updateImpl(...). 5020 ChangeStatus updateImpl(Attributor &A) override { 5021 // TODO: Once we have call site specific value information we can provide 5022 // call site specific liveness information and then it makes 5023 // sense to specialize attributes for call sites arguments instead of 5024 // redirecting requests to the callee argument. 5025 Argument *Arg = getAssociatedArgument(); 5026 if (!Arg) 5027 return indicatePessimisticFixpoint(); 5028 const IRPosition &ArgPos = IRPosition::argument(*Arg); 5029 auto &ArgAA = A.getAAFor<AANoCapture>(*this, ArgPos, DepClassTy::REQUIRED); 5030 return clampStateAndIndicateChange(getState(), ArgAA.getState()); 5031 } 5032 5033 /// See AbstractAttribute::trackStatistics() 5034 void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nocapture)}; 5035 }; 5036 5037 /// NoCapture attribute for floating values. 5038 struct AANoCaptureFloating final : AANoCaptureImpl { 5039 AANoCaptureFloating(const IRPosition &IRP, Attributor &A) 5040 : AANoCaptureImpl(IRP, A) {} 5041 5042 /// See AbstractAttribute::trackStatistics() 5043 void trackStatistics() const override { 5044 STATS_DECLTRACK_FLOATING_ATTR(nocapture) 5045 } 5046 }; 5047 5048 /// NoCapture attribute for function return value. 5049 struct AANoCaptureReturned final : AANoCaptureImpl { 5050 AANoCaptureReturned(const IRPosition &IRP, Attributor &A) 5051 : AANoCaptureImpl(IRP, A) { 5052 llvm_unreachable("NoCapture is not applicable to function returns!"); 5053 } 5054 5055 /// See AbstractAttribute::initialize(...). 5056 void initialize(Attributor &A) override { 5057 llvm_unreachable("NoCapture is not applicable to function returns!"); 5058 } 5059 5060 /// See AbstractAttribute::updateImpl(...). 5061 ChangeStatus updateImpl(Attributor &A) override { 5062 llvm_unreachable("NoCapture is not applicable to function returns!"); 5063 } 5064 5065 /// See AbstractAttribute::trackStatistics() 5066 void trackStatistics() const override {} 5067 }; 5068 5069 /// NoCapture attribute deduction for a call site return value. 5070 struct AANoCaptureCallSiteReturned final : AANoCaptureImpl { 5071 AANoCaptureCallSiteReturned(const IRPosition &IRP, Attributor &A) 5072 : AANoCaptureImpl(IRP, A) {} 5073 5074 /// See AbstractAttribute::initialize(...). 5075 void initialize(Attributor &A) override { 5076 const Function *F = getAnchorScope(); 5077 // Check what state the associated function can actually capture. 5078 determineFunctionCaptureCapabilities(getIRPosition(), *F, *this); 5079 } 5080 5081 /// See AbstractAttribute::trackStatistics() 5082 void trackStatistics() const override { 5083 STATS_DECLTRACK_CSRET_ATTR(nocapture) 5084 } 5085 }; 5086 5087 /// ------------------ Value Simplify Attribute ---------------------------- 5088 5089 bool ValueSimplifyStateType::unionAssumed(Optional<Value *> Other) { 5090 // FIXME: Add a typecast support. 5091 SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice( 5092 SimplifiedAssociatedValue, Other, Ty); 5093 if (SimplifiedAssociatedValue == Optional<Value *>(nullptr)) 5094 return false; 5095 5096 LLVM_DEBUG({ 5097 if (SimplifiedAssociatedValue.hasValue()) 5098 dbgs() << "[ValueSimplify] is assumed to be " 5099 << **SimplifiedAssociatedValue << "\n"; 5100 else 5101 dbgs() << "[ValueSimplify] is assumed to be <none>\n"; 5102 }); 5103 return true; 5104 } 5105 5106 struct AAValueSimplifyImpl : AAValueSimplify { 5107 AAValueSimplifyImpl(const IRPosition &IRP, Attributor &A) 5108 : AAValueSimplify(IRP, A) {} 5109 5110 /// See AbstractAttribute::initialize(...). 5111 void initialize(Attributor &A) override { 5112 if (getAssociatedValue().getType()->isVoidTy()) 5113 indicatePessimisticFixpoint(); 5114 if (A.hasSimplificationCallback(getIRPosition())) 5115 indicatePessimisticFixpoint(); 5116 } 5117 5118 /// See AbstractAttribute::getAsStr(). 5119 const std::string getAsStr() const override { 5120 LLVM_DEBUG({ 5121 errs() << "SAV: " << SimplifiedAssociatedValue << " "; 5122 if (SimplifiedAssociatedValue && *SimplifiedAssociatedValue) 5123 errs() << "SAV: " << **SimplifiedAssociatedValue << " "; 5124 }); 5125 return isValidState() ? (isAtFixpoint() ? "simplified" : "maybe-simple") 5126 : "not-simple"; 5127 } 5128 5129 /// See AbstractAttribute::trackStatistics() 5130 void trackStatistics() const override {} 5131 5132 /// See AAValueSimplify::getAssumedSimplifiedValue() 5133 Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override { 5134 return SimplifiedAssociatedValue; 5135 } 5136 5137 /// Return a value we can use as replacement for the associated one, or 5138 /// nullptr if we don't have one that makes sense. 5139 Value *getReplacementValue(Attributor &A) const { 5140 Value *NewV; 5141 NewV = SimplifiedAssociatedValue.hasValue() 5142 ? SimplifiedAssociatedValue.getValue() 5143 : UndefValue::get(getAssociatedType()); 5144 if (!NewV) 5145 return nullptr; 5146 NewV = AA::getWithType(*NewV, *getAssociatedType()); 5147 if (!NewV || NewV == &getAssociatedValue()) 5148 return nullptr; 5149 const Instruction *CtxI = getCtxI(); 5150 if (CtxI && !AA::isValidAtPosition(*NewV, *CtxI, A.getInfoCache())) 5151 return nullptr; 5152 if (!CtxI && !AA::isValidInScope(*NewV, getAnchorScope())) 5153 return nullptr; 5154 return NewV; 5155 } 5156 5157 /// Helper function for querying AAValueSimplify and updating candicate. 5158 /// \param IRP The value position we are trying to unify with SimplifiedValue 5159 bool checkAndUpdate(Attributor &A, const AbstractAttribute &QueryingAA, 5160 const IRPosition &IRP, bool Simplify = true) { 5161 bool UsedAssumedInformation = false; 5162 Optional<Value *> QueryingValueSimplified = &IRP.getAssociatedValue(); 5163 if (Simplify) 5164 QueryingValueSimplified = 5165 A.getAssumedSimplified(IRP, QueryingAA, UsedAssumedInformation); 5166 return unionAssumed(QueryingValueSimplified); 5167 } 5168 5169 /// Returns a candidate is found or not 5170 template <typename AAType> bool askSimplifiedValueFor(Attributor &A) { 5171 if (!getAssociatedValue().getType()->isIntegerTy()) 5172 return false; 5173 5174 // This will also pass the call base context. 5175 const auto &AA = 5176 A.getAAFor<AAType>(*this, getIRPosition(), DepClassTy::NONE); 5177 5178 Optional<ConstantInt *> COpt = AA.getAssumedConstantInt(A); 5179 5180 if (!COpt.hasValue()) { 5181 SimplifiedAssociatedValue = llvm::None; 5182 A.recordDependence(AA, *this, DepClassTy::OPTIONAL); 5183 return true; 5184 } 5185 if (auto *C = COpt.getValue()) { 5186 SimplifiedAssociatedValue = C; 5187 A.recordDependence(AA, *this, DepClassTy::OPTIONAL); 5188 return true; 5189 } 5190 return false; 5191 } 5192 5193 bool askSimplifiedValueForOtherAAs(Attributor &A) { 5194 if (askSimplifiedValueFor<AAValueConstantRange>(A)) 5195 return true; 5196 if (askSimplifiedValueFor<AAPotentialValues>(A)) 5197 return true; 5198 return false; 5199 } 5200 5201 /// See AbstractAttribute::manifest(...). 5202 ChangeStatus manifest(Attributor &A) override { 5203 ChangeStatus Changed = ChangeStatus::UNCHANGED; 5204 if (getAssociatedValue().user_empty()) 5205 return Changed; 5206 5207 if (auto *NewV = getReplacementValue(A)) { 5208 LLVM_DEBUG(dbgs() << "[ValueSimplify] " << getAssociatedValue() << " -> " 5209 << *NewV << " :: " << *this << "\n"); 5210 if (A.changeValueAfterManifest(getAssociatedValue(), *NewV)) 5211 Changed = ChangeStatus::CHANGED; 5212 } 5213 5214 return Changed | AAValueSimplify::manifest(A); 5215 } 5216 5217 /// See AbstractState::indicatePessimisticFixpoint(...). 5218 ChangeStatus indicatePessimisticFixpoint() override { 5219 SimplifiedAssociatedValue = &getAssociatedValue(); 5220 return AAValueSimplify::indicatePessimisticFixpoint(); 5221 } 5222 5223 static bool handleLoad(Attributor &A, const AbstractAttribute &AA, 5224 LoadInst &L, function_ref<bool(Value &)> Union) { 5225 auto UnionWrapper = [&](Value &V, Value &Obj) { 5226 if (isa<AllocaInst>(Obj)) 5227 return Union(V); 5228 if (!AA::isDynamicallyUnique(A, AA, V)) 5229 return false; 5230 if (!AA::isValidAtPosition(V, L, A.getInfoCache())) 5231 return false; 5232 return Union(V); 5233 }; 5234 5235 Value &Ptr = *L.getPointerOperand(); 5236 SmallVector<Value *, 8> Objects; 5237 if (!AA::getAssumedUnderlyingObjects(A, Ptr, Objects, AA, &L)) 5238 return false; 5239 5240 for (Value *Obj : Objects) { 5241 LLVM_DEBUG(dbgs() << "Visit underlying object " << *Obj << "\n"); 5242 if (isa<UndefValue>(Obj)) 5243 continue; 5244 if (isa<ConstantPointerNull>(Obj)) { 5245 // A null pointer access can be undefined but any offset from null may 5246 // be OK. We do not try to optimize the latter. 5247 bool UsedAssumedInformation = false; 5248 if (!NullPointerIsDefined(L.getFunction(), 5249 Ptr.getType()->getPointerAddressSpace()) && 5250 A.getAssumedSimplified(Ptr, AA, UsedAssumedInformation) == Obj) 5251 continue; 5252 return false; 5253 } 5254 if (!isa<AllocaInst>(Obj) && !isa<GlobalVariable>(Obj)) 5255 return false; 5256 Constant *InitialVal = AA::getInitialValueForObj(*Obj, *L.getType()); 5257 if (!InitialVal || !Union(*InitialVal)) 5258 return false; 5259 5260 LLVM_DEBUG(dbgs() << "Underlying object amenable to load-store " 5261 "propagation, checking accesses next.\n"); 5262 5263 auto CheckAccess = [&](const AAPointerInfo::Access &Acc, bool IsExact) { 5264 LLVM_DEBUG(dbgs() << " - visit access " << Acc << "\n"); 5265 if (!Acc.isWrite()) 5266 return true; 5267 if (Acc.isWrittenValueYetUndetermined()) 5268 return true; 5269 Value *Content = Acc.getWrittenValue(); 5270 if (!Content) 5271 return false; 5272 Value *CastedContent = 5273 AA::getWithType(*Content, *AA.getAssociatedType()); 5274 if (!CastedContent) 5275 return false; 5276 if (IsExact) 5277 return UnionWrapper(*CastedContent, *Obj); 5278 if (auto *C = dyn_cast<Constant>(CastedContent)) 5279 if (C->isNullValue() || C->isAllOnesValue() || isa<UndefValue>(C)) 5280 return UnionWrapper(*CastedContent, *Obj); 5281 return false; 5282 }; 5283 5284 auto &PI = A.getAAFor<AAPointerInfo>(AA, IRPosition::value(*Obj), 5285 DepClassTy::REQUIRED); 5286 if (!PI.forallInterferingAccesses(L, CheckAccess)) 5287 return false; 5288 } 5289 return true; 5290 } 5291 }; 5292 5293 struct AAValueSimplifyArgument final : AAValueSimplifyImpl { 5294 AAValueSimplifyArgument(const IRPosition &IRP, Attributor &A) 5295 : AAValueSimplifyImpl(IRP, A) {} 5296 5297 void initialize(Attributor &A) override { 5298 AAValueSimplifyImpl::initialize(A); 5299 if (!getAnchorScope() || getAnchorScope()->isDeclaration()) 5300 indicatePessimisticFixpoint(); 5301 if (hasAttr({Attribute::InAlloca, Attribute::Preallocated, 5302 Attribute::StructRet, Attribute::Nest, Attribute::ByVal}, 5303 /* IgnoreSubsumingPositions */ true)) 5304 indicatePessimisticFixpoint(); 5305 5306 // FIXME: This is a hack to prevent us from propagating function poiner in 5307 // the new pass manager CGSCC pass as it creates call edges the 5308 // CallGraphUpdater cannot handle yet. 5309 Value &V = getAssociatedValue(); 5310 if (V.getType()->isPointerTy() && 5311 V.getType()->getPointerElementType()->isFunctionTy() && 5312 !A.isModulePass()) 5313 indicatePessimisticFixpoint(); 5314 } 5315 5316 /// See AbstractAttribute::updateImpl(...). 5317 ChangeStatus updateImpl(Attributor &A) override { 5318 // Byval is only replacable if it is readonly otherwise we would write into 5319 // the replaced value and not the copy that byval creates implicitly. 5320 Argument *Arg = getAssociatedArgument(); 5321 if (Arg->hasByValAttr()) { 5322 // TODO: We probably need to verify synchronization is not an issue, e.g., 5323 // there is no race by not copying a constant byval. 5324 const auto &MemAA = A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), 5325 DepClassTy::REQUIRED); 5326 if (!MemAA.isAssumedReadOnly()) 5327 return indicatePessimisticFixpoint(); 5328 } 5329 5330 auto Before = SimplifiedAssociatedValue; 5331 5332 auto PredForCallSite = [&](AbstractCallSite ACS) { 5333 const IRPosition &ACSArgPos = 5334 IRPosition::callsite_argument(ACS, getCallSiteArgNo()); 5335 // Check if a coresponding argument was found or if it is on not 5336 // associated (which can happen for callback calls). 5337 if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID) 5338 return false; 5339 5340 // Simplify the argument operand explicitly and check if the result is 5341 // valid in the current scope. This avoids refering to simplified values 5342 // in other functions, e.g., we don't want to say a an argument in a 5343 // static function is actually an argument in a different function. 5344 bool UsedAssumedInformation = false; 5345 Optional<Constant *> SimpleArgOp = 5346 A.getAssumedConstant(ACSArgPos, *this, UsedAssumedInformation); 5347 if (!SimpleArgOp.hasValue()) 5348 return true; 5349 if (!SimpleArgOp.getValue()) 5350 return false; 5351 if (!AA::isDynamicallyUnique(A, *this, **SimpleArgOp)) 5352 return false; 5353 return unionAssumed(*SimpleArgOp); 5354 }; 5355 5356 // Generate a answer specific to a call site context. 5357 bool Success; 5358 bool AllCallSitesKnown; 5359 if (hasCallBaseContext() && 5360 getCallBaseContext()->getCalledFunction() == Arg->getParent()) 5361 Success = PredForCallSite( 5362 AbstractCallSite(&getCallBaseContext()->getCalledOperandUse())); 5363 else 5364 Success = A.checkForAllCallSites(PredForCallSite, *this, true, 5365 AllCallSitesKnown); 5366 5367 if (!Success) 5368 if (!askSimplifiedValueForOtherAAs(A)) 5369 return indicatePessimisticFixpoint(); 5370 5371 // If a candicate was found in this update, return CHANGED. 5372 return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED 5373 : ChangeStatus ::CHANGED; 5374 } 5375 5376 /// See AbstractAttribute::trackStatistics() 5377 void trackStatistics() const override { 5378 STATS_DECLTRACK_ARG_ATTR(value_simplify) 5379 } 5380 }; 5381 5382 struct AAValueSimplifyReturned : AAValueSimplifyImpl { 5383 AAValueSimplifyReturned(const IRPosition &IRP, Attributor &A) 5384 : AAValueSimplifyImpl(IRP, A) {} 5385 5386 /// See AAValueSimplify::getAssumedSimplifiedValue() 5387 Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override { 5388 if (!isValidState()) 5389 return nullptr; 5390 return SimplifiedAssociatedValue; 5391 } 5392 5393 /// See AbstractAttribute::updateImpl(...). 5394 ChangeStatus updateImpl(Attributor &A) override { 5395 auto Before = SimplifiedAssociatedValue; 5396 5397 auto PredForReturned = [&](Value &V) { 5398 return checkAndUpdate(A, *this, 5399 IRPosition::value(V, getCallBaseContext())); 5400 }; 5401 5402 if (!A.checkForAllReturnedValues(PredForReturned, *this)) 5403 if (!askSimplifiedValueForOtherAAs(A)) 5404 return indicatePessimisticFixpoint(); 5405 5406 // If a candicate was found in this update, return CHANGED. 5407 return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED 5408 : ChangeStatus ::CHANGED; 5409 } 5410 5411 ChangeStatus manifest(Attributor &A) override { 5412 ChangeStatus Changed = ChangeStatus::UNCHANGED; 5413 5414 if (auto *NewV = getReplacementValue(A)) { 5415 auto PredForReturned = 5416 [&](Value &, const SmallSetVector<ReturnInst *, 4> &RetInsts) { 5417 for (ReturnInst *RI : RetInsts) { 5418 Value *ReturnedVal = RI->getReturnValue(); 5419 if (ReturnedVal == NewV || isa<UndefValue>(ReturnedVal)) 5420 return true; 5421 assert(RI->getFunction() == getAnchorScope() && 5422 "ReturnInst in wrong function!"); 5423 LLVM_DEBUG(dbgs() 5424 << "[ValueSimplify] " << *ReturnedVal << " -> " 5425 << *NewV << " in " << *RI << " :: " << *this << "\n"); 5426 if (A.changeUseAfterManifest(RI->getOperandUse(0), *NewV)) 5427 Changed = ChangeStatus::CHANGED; 5428 } 5429 return true; 5430 }; 5431 A.checkForAllReturnedValuesAndReturnInsts(PredForReturned, *this); 5432 } 5433 5434 return Changed | AAValueSimplify::manifest(A); 5435 } 5436 5437 /// See AbstractAttribute::trackStatistics() 5438 void trackStatistics() const override { 5439 STATS_DECLTRACK_FNRET_ATTR(value_simplify) 5440 } 5441 }; 5442 5443 struct AAValueSimplifyFloating : AAValueSimplifyImpl { 5444 AAValueSimplifyFloating(const IRPosition &IRP, Attributor &A) 5445 : AAValueSimplifyImpl(IRP, A) {} 5446 5447 /// See AbstractAttribute::initialize(...). 5448 void initialize(Attributor &A) override { 5449 AAValueSimplifyImpl::initialize(A); 5450 Value &V = getAnchorValue(); 5451 5452 // TODO: add other stuffs 5453 if (isa<Constant>(V)) 5454 indicatePessimisticFixpoint(); 5455 } 5456 5457 /// Check if \p Cmp is a comparison we can simplify. 5458 /// 5459 /// We handle multiple cases, one in which at least one operand is an 5460 /// (assumed) nullptr. If so, try to simplify it using AANonNull on the other 5461 /// operand. Return true if successful, in that case SimplifiedAssociatedValue 5462 /// will be updated. 5463 bool handleCmp(Attributor &A, CmpInst &Cmp) { 5464 auto Union = [&](Value &V) { 5465 SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice( 5466 SimplifiedAssociatedValue, &V, V.getType()); 5467 return SimplifiedAssociatedValue != Optional<Value *>(nullptr); 5468 }; 5469 5470 Value *LHS = Cmp.getOperand(0); 5471 Value *RHS = Cmp.getOperand(1); 5472 5473 // Simplify the operands first. 5474 bool UsedAssumedInformation = false; 5475 const auto &SimplifiedLHS = 5476 A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()), 5477 *this, UsedAssumedInformation); 5478 if (!SimplifiedLHS.hasValue()) 5479 return true; 5480 if (!SimplifiedLHS.getValue()) 5481 return false; 5482 LHS = *SimplifiedLHS; 5483 5484 const auto &SimplifiedRHS = 5485 A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()), 5486 *this, UsedAssumedInformation); 5487 if (!SimplifiedRHS.hasValue()) 5488 return true; 5489 if (!SimplifiedRHS.getValue()) 5490 return false; 5491 RHS = *SimplifiedRHS; 5492 5493 LLVMContext &Ctx = Cmp.getContext(); 5494 // Handle the trivial case first in which we don't even need to think about 5495 // null or non-null. 5496 if (LHS == RHS && (Cmp.isTrueWhenEqual() || Cmp.isFalseWhenEqual())) { 5497 Constant *NewVal = 5498 ConstantInt::get(Type::getInt1Ty(Ctx), Cmp.isTrueWhenEqual()); 5499 if (!Union(*NewVal)) 5500 return false; 5501 if (!UsedAssumedInformation) 5502 indicateOptimisticFixpoint(); 5503 return true; 5504 } 5505 5506 // From now on we only handle equalities (==, !=). 5507 ICmpInst *ICmp = dyn_cast<ICmpInst>(&Cmp); 5508 if (!ICmp || !ICmp->isEquality()) 5509 return false; 5510 5511 bool LHSIsNull = isa<ConstantPointerNull>(LHS); 5512 bool RHSIsNull = isa<ConstantPointerNull>(RHS); 5513 if (!LHSIsNull && !RHSIsNull) 5514 return false; 5515 5516 // Left is the nullptr ==/!= non-nullptr case. We'll use AANonNull on the 5517 // non-nullptr operand and if we assume it's non-null we can conclude the 5518 // result of the comparison. 5519 assert((LHSIsNull || RHSIsNull) && 5520 "Expected nullptr versus non-nullptr comparison at this point"); 5521 5522 // The index is the operand that we assume is not null. 5523 unsigned PtrIdx = LHSIsNull; 5524 auto &PtrNonNullAA = A.getAAFor<AANonNull>( 5525 *this, IRPosition::value(*ICmp->getOperand(PtrIdx)), 5526 DepClassTy::REQUIRED); 5527 if (!PtrNonNullAA.isAssumedNonNull()) 5528 return false; 5529 UsedAssumedInformation |= !PtrNonNullAA.isKnownNonNull(); 5530 5531 // The new value depends on the predicate, true for != and false for ==. 5532 Constant *NewVal = ConstantInt::get( 5533 Type::getInt1Ty(Ctx), ICmp->getPredicate() == CmpInst::ICMP_NE); 5534 if (!Union(*NewVal)) 5535 return false; 5536 5537 if (!UsedAssumedInformation) 5538 indicateOptimisticFixpoint(); 5539 5540 return true; 5541 } 5542 5543 bool updateWithLoad(Attributor &A, LoadInst &L) { 5544 auto Union = [&](Value &V) { 5545 SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice( 5546 SimplifiedAssociatedValue, &V, L.getType()); 5547 return SimplifiedAssociatedValue != Optional<Value *>(nullptr); 5548 }; 5549 return handleLoad(A, *this, L, Union); 5550 } 5551 5552 /// Use the generic, non-optimistic InstSimplfy functionality if we managed to 5553 /// simplify any operand of the instruction \p I. Return true if successful, 5554 /// in that case SimplifiedAssociatedValue will be updated. 5555 bool handleGenericInst(Attributor &A, Instruction &I) { 5556 bool SomeSimplified = false; 5557 bool UsedAssumedInformation = false; 5558 5559 SmallVector<Value *, 8> NewOps(I.getNumOperands()); 5560 int Idx = 0; 5561 for (Value *Op : I.operands()) { 5562 const auto &SimplifiedOp = 5563 A.getAssumedSimplified(IRPosition::value(*Op, getCallBaseContext()), 5564 *this, UsedAssumedInformation); 5565 // If we are not sure about any operand we are not sure about the entire 5566 // instruction, we'll wait. 5567 if (!SimplifiedOp.hasValue()) 5568 return true; 5569 5570 if (SimplifiedOp.getValue()) 5571 NewOps[Idx] = SimplifiedOp.getValue(); 5572 else 5573 NewOps[Idx] = Op; 5574 5575 SomeSimplified |= (NewOps[Idx] != Op); 5576 ++Idx; 5577 } 5578 5579 // We won't bother with the InstSimplify interface if we didn't simplify any 5580 // operand ourselves. 5581 if (!SomeSimplified) 5582 return false; 5583 5584 InformationCache &InfoCache = A.getInfoCache(); 5585 Function *F = I.getFunction(); 5586 const auto *DT = 5587 InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*F); 5588 const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F); 5589 auto *AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*F); 5590 OptimizationRemarkEmitter *ORE = nullptr; 5591 5592 const DataLayout &DL = I.getModule()->getDataLayout(); 5593 SimplifyQuery Q(DL, TLI, DT, AC, &I); 5594 if (Value *SimplifiedI = 5595 SimplifyInstructionWithOperands(&I, NewOps, Q, ORE)) { 5596 SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice( 5597 SimplifiedAssociatedValue, SimplifiedI, I.getType()); 5598 return SimplifiedAssociatedValue != Optional<Value *>(nullptr); 5599 } 5600 return false; 5601 } 5602 5603 /// See AbstractAttribute::updateImpl(...). 5604 ChangeStatus updateImpl(Attributor &A) override { 5605 auto Before = SimplifiedAssociatedValue; 5606 5607 auto VisitValueCB = [&](Value &V, const Instruction *CtxI, bool &, 5608 bool Stripped) -> bool { 5609 auto &AA = A.getAAFor<AAValueSimplify>( 5610 *this, IRPosition::value(V, getCallBaseContext()), 5611 DepClassTy::REQUIRED); 5612 if (!Stripped && this == &AA) { 5613 5614 if (auto *I = dyn_cast<Instruction>(&V)) { 5615 if (auto *LI = dyn_cast<LoadInst>(&V)) 5616 if (updateWithLoad(A, *LI)) 5617 return true; 5618 if (auto *Cmp = dyn_cast<CmpInst>(&V)) 5619 if (handleCmp(A, *Cmp)) 5620 return true; 5621 if (handleGenericInst(A, *I)) 5622 return true; 5623 } 5624 // TODO: Look the instruction and check recursively. 5625 5626 LLVM_DEBUG(dbgs() << "[ValueSimplify] Can't be stripped more : " << V 5627 << "\n"); 5628 return false; 5629 } 5630 return checkAndUpdate(A, *this, 5631 IRPosition::value(V, getCallBaseContext())); 5632 }; 5633 5634 bool Dummy = false; 5635 if (!genericValueTraversal<bool>(A, getIRPosition(), *this, Dummy, 5636 VisitValueCB, getCtxI(), 5637 /* UseValueSimplify */ false)) 5638 if (!askSimplifiedValueForOtherAAs(A)) 5639 return indicatePessimisticFixpoint(); 5640 5641 // If a candicate was found in this update, return CHANGED. 5642 return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED 5643 : ChangeStatus ::CHANGED; 5644 } 5645 5646 /// See AbstractAttribute::trackStatistics() 5647 void trackStatistics() const override { 5648 STATS_DECLTRACK_FLOATING_ATTR(value_simplify) 5649 } 5650 }; 5651 5652 struct AAValueSimplifyFunction : AAValueSimplifyImpl { 5653 AAValueSimplifyFunction(const IRPosition &IRP, Attributor &A) 5654 : AAValueSimplifyImpl(IRP, A) {} 5655 5656 /// See AbstractAttribute::initialize(...). 5657 void initialize(Attributor &A) override { 5658 SimplifiedAssociatedValue = nullptr; 5659 indicateOptimisticFixpoint(); 5660 } 5661 /// See AbstractAttribute::initialize(...). 5662 ChangeStatus updateImpl(Attributor &A) override { 5663 llvm_unreachable( 5664 "AAValueSimplify(Function|CallSite)::updateImpl will not be called"); 5665 } 5666 /// See AbstractAttribute::trackStatistics() 5667 void trackStatistics() const override { 5668 STATS_DECLTRACK_FN_ATTR(value_simplify) 5669 } 5670 }; 5671 5672 struct AAValueSimplifyCallSite : AAValueSimplifyFunction { 5673 AAValueSimplifyCallSite(const IRPosition &IRP, Attributor &A) 5674 : AAValueSimplifyFunction(IRP, A) {} 5675 /// See AbstractAttribute::trackStatistics() 5676 void trackStatistics() const override { 5677 STATS_DECLTRACK_CS_ATTR(value_simplify) 5678 } 5679 }; 5680 5681 struct AAValueSimplifyCallSiteReturned : AAValueSimplifyImpl { 5682 AAValueSimplifyCallSiteReturned(const IRPosition &IRP, Attributor &A) 5683 : AAValueSimplifyImpl(IRP, A) {} 5684 5685 void initialize(Attributor &A) override { 5686 AAValueSimplifyImpl::initialize(A); 5687 if (!getAssociatedFunction()) 5688 indicatePessimisticFixpoint(); 5689 } 5690 5691 /// See AbstractAttribute::updateImpl(...). 5692 ChangeStatus updateImpl(Attributor &A) override { 5693 auto Before = SimplifiedAssociatedValue; 5694 auto &RetAA = A.getAAFor<AAReturnedValues>( 5695 *this, IRPosition::function(*getAssociatedFunction()), 5696 DepClassTy::REQUIRED); 5697 auto PredForReturned = 5698 [&](Value &RetVal, const SmallSetVector<ReturnInst *, 4> &RetInsts) { 5699 bool UsedAssumedInformation = false; 5700 Optional<Value *> CSRetVal = A.translateArgumentToCallSiteContent( 5701 &RetVal, *cast<CallBase>(getCtxI()), *this, 5702 UsedAssumedInformation); 5703 SimplifiedAssociatedValue = AA::combineOptionalValuesInAAValueLatice( 5704 SimplifiedAssociatedValue, CSRetVal, getAssociatedType()); 5705 return SimplifiedAssociatedValue != Optional<Value *>(nullptr); 5706 }; 5707 if (!RetAA.checkForAllReturnedValuesAndReturnInsts(PredForReturned)) 5708 if (!askSimplifiedValueForOtherAAs(A)) 5709 return indicatePessimisticFixpoint(); 5710 return Before == SimplifiedAssociatedValue ? ChangeStatus::UNCHANGED 5711 : ChangeStatus ::CHANGED; 5712 } 5713 5714 void trackStatistics() const override { 5715 STATS_DECLTRACK_CSRET_ATTR(value_simplify) 5716 } 5717 }; 5718 5719 struct AAValueSimplifyCallSiteArgument : AAValueSimplifyFloating { 5720 AAValueSimplifyCallSiteArgument(const IRPosition &IRP, Attributor &A) 5721 : AAValueSimplifyFloating(IRP, A) {} 5722 5723 /// See AbstractAttribute::manifest(...). 5724 ChangeStatus manifest(Attributor &A) override { 5725 ChangeStatus Changed = ChangeStatus::UNCHANGED; 5726 5727 if (auto *NewV = getReplacementValue(A)) { 5728 Use &U = cast<CallBase>(&getAnchorValue()) 5729 ->getArgOperandUse(getCallSiteArgNo()); 5730 if (A.changeUseAfterManifest(U, *NewV)) 5731 Changed = ChangeStatus::CHANGED; 5732 } 5733 5734 return Changed | AAValueSimplify::manifest(A); 5735 } 5736 5737 void trackStatistics() const override { 5738 STATS_DECLTRACK_CSARG_ATTR(value_simplify) 5739 } 5740 }; 5741 5742 /// ----------------------- Heap-To-Stack Conversion --------------------------- 5743 struct AAHeapToStackFunction final : public AAHeapToStack { 5744 5745 struct AllocationInfo { 5746 /// The call that allocates the memory. 5747 CallBase *const CB; 5748 5749 /// The kind of allocation. 5750 const enum class AllocationKind { 5751 MALLOC, 5752 CALLOC, 5753 ALIGNED_ALLOC, 5754 } Kind; 5755 5756 /// The library function id for the allocation. 5757 LibFunc LibraryFunctionId = NotLibFunc; 5758 5759 /// The status wrt. a rewrite. 5760 enum { 5761 STACK_DUE_TO_USE, 5762 STACK_DUE_TO_FREE, 5763 INVALID, 5764 } Status = STACK_DUE_TO_USE; 5765 5766 /// Flag to indicate if we encountered a use that might free this allocation 5767 /// but which is not in the deallocation infos. 5768 bool HasPotentiallyFreeingUnknownUses = false; 5769 5770 /// The set of free calls that use this allocation. 5771 SmallPtrSet<CallBase *, 1> PotentialFreeCalls{}; 5772 }; 5773 5774 struct DeallocationInfo { 5775 /// The call that deallocates the memory. 5776 CallBase *const CB; 5777 5778 /// Flag to indicate if we don't know all objects this deallocation might 5779 /// free. 5780 bool MightFreeUnknownObjects = false; 5781 5782 /// The set of allocation calls that are potentially freed. 5783 SmallPtrSet<CallBase *, 1> PotentialAllocationCalls{}; 5784 }; 5785 5786 AAHeapToStackFunction(const IRPosition &IRP, Attributor &A) 5787 : AAHeapToStack(IRP, A) {} 5788 5789 ~AAHeapToStackFunction() { 5790 // Ensure we call the destructor so we release any memory allocated in the 5791 // sets. 5792 for (auto &It : AllocationInfos) 5793 It.getSecond()->~AllocationInfo(); 5794 for (auto &It : DeallocationInfos) 5795 It.getSecond()->~DeallocationInfo(); 5796 } 5797 5798 void initialize(Attributor &A) override { 5799 AAHeapToStack::initialize(A); 5800 5801 const Function *F = getAnchorScope(); 5802 const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F); 5803 5804 auto AllocationIdentifierCB = [&](Instruction &I) { 5805 CallBase *CB = dyn_cast<CallBase>(&I); 5806 if (!CB) 5807 return true; 5808 if (isFreeCall(CB, TLI)) { 5809 DeallocationInfos[CB] = new (A.Allocator) DeallocationInfo{CB}; 5810 return true; 5811 } 5812 bool IsMalloc = isMallocLikeFn(CB, TLI); 5813 bool IsAlignedAllocLike = !IsMalloc && isAlignedAllocLikeFn(CB, TLI); 5814 bool IsCalloc = 5815 !IsMalloc && !IsAlignedAllocLike && isCallocLikeFn(CB, TLI); 5816 if (!IsMalloc && !IsAlignedAllocLike && !IsCalloc) 5817 return true; 5818 auto Kind = 5819 IsMalloc ? AllocationInfo::AllocationKind::MALLOC 5820 : (IsCalloc ? AllocationInfo::AllocationKind::CALLOC 5821 : AllocationInfo::AllocationKind::ALIGNED_ALLOC); 5822 5823 AllocationInfo *AI = new (A.Allocator) AllocationInfo{CB, Kind}; 5824 AllocationInfos[CB] = AI; 5825 TLI->getLibFunc(*CB, AI->LibraryFunctionId); 5826 return true; 5827 }; 5828 5829 bool UsedAssumedInformation = false; 5830 bool Success = A.checkForAllCallLikeInstructions( 5831 AllocationIdentifierCB, *this, UsedAssumedInformation, 5832 /* CheckBBLivenessOnly */ false, 5833 /* CheckPotentiallyDead */ true); 5834 (void)Success; 5835 assert(Success && "Did not expect the call base visit callback to fail!"); 5836 } 5837 5838 const std::string getAsStr() const override { 5839 unsigned NumH2SMallocs = 0, NumInvalidMallocs = 0; 5840 for (const auto &It : AllocationInfos) { 5841 if (It.second->Status == AllocationInfo::INVALID) 5842 ++NumInvalidMallocs; 5843 else 5844 ++NumH2SMallocs; 5845 } 5846 return "[H2S] Mallocs Good/Bad: " + std::to_string(NumH2SMallocs) + "/" + 5847 std::to_string(NumInvalidMallocs); 5848 } 5849 5850 /// See AbstractAttribute::trackStatistics(). 5851 void trackStatistics() const override { 5852 STATS_DECL( 5853 MallocCalls, Function, 5854 "Number of malloc/calloc/aligned_alloc calls converted to allocas"); 5855 for (auto &It : AllocationInfos) 5856 if (It.second->Status != AllocationInfo::INVALID) 5857 ++BUILD_STAT_NAME(MallocCalls, Function); 5858 } 5859 5860 bool isAssumedHeapToStack(const CallBase &CB) const override { 5861 if (isValidState()) 5862 if (AllocationInfo *AI = AllocationInfos.lookup(&CB)) 5863 return AI->Status != AllocationInfo::INVALID; 5864 return false; 5865 } 5866 5867 bool isAssumedHeapToStackRemovedFree(CallBase &CB) const override { 5868 if (!isValidState()) 5869 return false; 5870 5871 for (auto &It : AllocationInfos) { 5872 AllocationInfo &AI = *It.second; 5873 if (AI.Status == AllocationInfo::INVALID) 5874 continue; 5875 5876 if (AI.PotentialFreeCalls.count(&CB)) 5877 return true; 5878 } 5879 5880 return false; 5881 } 5882 5883 ChangeStatus manifest(Attributor &A) override { 5884 assert(getState().isValidState() && 5885 "Attempted to manifest an invalid state!"); 5886 5887 ChangeStatus HasChanged = ChangeStatus::UNCHANGED; 5888 Function *F = getAnchorScope(); 5889 const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F); 5890 5891 for (auto &It : AllocationInfos) { 5892 AllocationInfo &AI = *It.second; 5893 if (AI.Status == AllocationInfo::INVALID) 5894 continue; 5895 5896 for (CallBase *FreeCall : AI.PotentialFreeCalls) { 5897 LLVM_DEBUG(dbgs() << "H2S: Removing free call: " << *FreeCall << "\n"); 5898 A.deleteAfterManifest(*FreeCall); 5899 HasChanged = ChangeStatus::CHANGED; 5900 } 5901 5902 LLVM_DEBUG(dbgs() << "H2S: Removing malloc-like call: " << *AI.CB 5903 << "\n"); 5904 5905 auto Remark = [&](OptimizationRemark OR) { 5906 LibFunc IsAllocShared; 5907 if (TLI->getLibFunc(*AI.CB, IsAllocShared)) 5908 if (IsAllocShared == LibFunc___kmpc_alloc_shared) 5909 return OR << "Moving globalized variable to the stack."; 5910 return OR << "Moving memory allocation from the heap to the stack."; 5911 }; 5912 if (AI.LibraryFunctionId == LibFunc___kmpc_alloc_shared) 5913 A.emitRemark<OptimizationRemark>(AI.CB, "OMP110", Remark); 5914 else 5915 A.emitRemark<OptimizationRemark>(AI.CB, "HeapToStack", Remark); 5916 5917 Value *Size; 5918 Optional<APInt> SizeAPI = getSize(A, *this, AI); 5919 if (SizeAPI.hasValue()) { 5920 Size = ConstantInt::get(AI.CB->getContext(), *SizeAPI); 5921 } else if (AI.Kind == AllocationInfo::AllocationKind::CALLOC) { 5922 auto *Num = AI.CB->getOperand(0); 5923 auto *SizeT = AI.CB->getOperand(1); 5924 IRBuilder<> B(AI.CB); 5925 Size = B.CreateMul(Num, SizeT, "h2s.calloc.size"); 5926 } else if (AI.Kind == AllocationInfo::AllocationKind::ALIGNED_ALLOC) { 5927 Size = AI.CB->getOperand(1); 5928 } else { 5929 Size = AI.CB->getOperand(0); 5930 } 5931 5932 Align Alignment(1); 5933 if (AI.Kind == AllocationInfo::AllocationKind::ALIGNED_ALLOC) { 5934 Optional<APInt> AlignmentAPI = 5935 getAPInt(A, *this, *AI.CB->getArgOperand(0)); 5936 assert(AlignmentAPI.hasValue() && 5937 "Expected an alignment during manifest!"); 5938 Alignment = 5939 max(Alignment, MaybeAlign(AlignmentAPI.getValue().getZExtValue())); 5940 } 5941 5942 unsigned AS = cast<PointerType>(AI.CB->getType())->getAddressSpace(); 5943 Instruction *Alloca = 5944 new AllocaInst(Type::getInt8Ty(F->getContext()), AS, Size, Alignment, 5945 "", AI.CB->getNextNode()); 5946 5947 if (Alloca->getType() != AI.CB->getType()) 5948 Alloca = new BitCastInst(Alloca, AI.CB->getType(), "malloc_bc", 5949 Alloca->getNextNode()); 5950 5951 A.changeValueAfterManifest(*AI.CB, *Alloca); 5952 5953 if (auto *II = dyn_cast<InvokeInst>(AI.CB)) { 5954 auto *NBB = II->getNormalDest(); 5955 BranchInst::Create(NBB, AI.CB->getParent()); 5956 A.deleteAfterManifest(*AI.CB); 5957 } else { 5958 A.deleteAfterManifest(*AI.CB); 5959 } 5960 5961 // Zero out the allocated memory if it was a calloc. 5962 if (AI.Kind == AllocationInfo::AllocationKind::CALLOC) { 5963 auto *BI = new BitCastInst(Alloca, AI.CB->getType(), "calloc_bc", 5964 Alloca->getNextNode()); 5965 Value *Ops[] = { 5966 BI, ConstantInt::get(F->getContext(), APInt(8, 0, false)), Size, 5967 ConstantInt::get(Type::getInt1Ty(F->getContext()), false)}; 5968 5969 Type *Tys[] = {BI->getType(), AI.CB->getOperand(0)->getType()}; 5970 Module *M = F->getParent(); 5971 Function *Fn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys); 5972 CallInst::Create(Fn, Ops, "", BI->getNextNode()); 5973 } 5974 HasChanged = ChangeStatus::CHANGED; 5975 } 5976 5977 return HasChanged; 5978 } 5979 5980 Optional<APInt> getAPInt(Attributor &A, const AbstractAttribute &AA, 5981 Value &V) { 5982 bool UsedAssumedInformation = false; 5983 Optional<Constant *> SimpleV = 5984 A.getAssumedConstant(V, AA, UsedAssumedInformation); 5985 if (!SimpleV.hasValue()) 5986 return APInt(64, 0); 5987 if (auto *CI = dyn_cast_or_null<ConstantInt>(SimpleV.getValue())) 5988 return CI->getValue(); 5989 return llvm::None; 5990 } 5991 5992 Optional<APInt> getSize(Attributor &A, const AbstractAttribute &AA, 5993 AllocationInfo &AI) { 5994 5995 if (AI.Kind == AllocationInfo::AllocationKind::MALLOC) 5996 return getAPInt(A, AA, *AI.CB->getArgOperand(0)); 5997 5998 if (AI.Kind == AllocationInfo::AllocationKind::ALIGNED_ALLOC) 5999 // Only if the alignment is also constant we return a size. 6000 return getAPInt(A, AA, *AI.CB->getArgOperand(0)).hasValue() 6001 ? getAPInt(A, AA, *AI.CB->getArgOperand(1)) 6002 : llvm::None; 6003 6004 assert(AI.Kind == AllocationInfo::AllocationKind::CALLOC && 6005 "Expected only callocs are left"); 6006 Optional<APInt> Num = getAPInt(A, AA, *AI.CB->getArgOperand(0)); 6007 Optional<APInt> Size = getAPInt(A, AA, *AI.CB->getArgOperand(1)); 6008 if (!Num.hasValue() || !Size.hasValue()) 6009 return llvm::None; 6010 bool Overflow = false; 6011 Size = Size.getValue().umul_ov(Num.getValue(), Overflow); 6012 return Overflow ? llvm::None : Size; 6013 } 6014 6015 /// Collection of all malloc-like calls in a function with associated 6016 /// information. 6017 DenseMap<CallBase *, AllocationInfo *> AllocationInfos; 6018 6019 /// Collection of all free-like calls in a function with associated 6020 /// information. 6021 DenseMap<CallBase *, DeallocationInfo *> DeallocationInfos; 6022 6023 ChangeStatus updateImpl(Attributor &A) override; 6024 }; 6025 6026 ChangeStatus AAHeapToStackFunction::updateImpl(Attributor &A) { 6027 ChangeStatus Changed = ChangeStatus::UNCHANGED; 6028 const Function *F = getAnchorScope(); 6029 6030 const auto &LivenessAA = 6031 A.getAAFor<AAIsDead>(*this, IRPosition::function(*F), DepClassTy::NONE); 6032 6033 MustBeExecutedContextExplorer &Explorer = 6034 A.getInfoCache().getMustBeExecutedContextExplorer(); 6035 6036 bool StackIsAccessibleByOtherThreads = 6037 A.getInfoCache().stackIsAccessibleByOtherThreads(); 6038 6039 // Flag to ensure we update our deallocation information at most once per 6040 // updateImpl call and only if we use the free check reasoning. 6041 bool HasUpdatedFrees = false; 6042 6043 auto UpdateFrees = [&]() { 6044 HasUpdatedFrees = true; 6045 6046 for (auto &It : DeallocationInfos) { 6047 DeallocationInfo &DI = *It.second; 6048 // For now we cannot use deallocations that have unknown inputs, skip 6049 // them. 6050 if (DI.MightFreeUnknownObjects) 6051 continue; 6052 6053 // No need to analyze dead calls, ignore them instead. 6054 bool UsedAssumedInformation = false; 6055 if (A.isAssumedDead(*DI.CB, this, &LivenessAA, UsedAssumedInformation, 6056 /* CheckBBLivenessOnly */ true)) 6057 continue; 6058 6059 // Use the optimistic version to get the freed objects, ignoring dead 6060 // branches etc. 6061 SmallVector<Value *, 8> Objects; 6062 if (!AA::getAssumedUnderlyingObjects(A, *DI.CB->getArgOperand(0), Objects, 6063 *this, DI.CB)) { 6064 LLVM_DEBUG( 6065 dbgs() 6066 << "[H2S] Unexpected failure in getAssumedUnderlyingObjects!\n"); 6067 DI.MightFreeUnknownObjects = true; 6068 continue; 6069 } 6070 6071 // Check each object explicitly. 6072 for (auto *Obj : Objects) { 6073 // Free of null and undef can be ignored as no-ops (or UB in the latter 6074 // case). 6075 if (isa<ConstantPointerNull>(Obj) || isa<UndefValue>(Obj)) 6076 continue; 6077 6078 CallBase *ObjCB = dyn_cast<CallBase>(Obj); 6079 if (!ObjCB) { 6080 LLVM_DEBUG(dbgs() 6081 << "[H2S] Free of a non-call object: " << *Obj << "\n"); 6082 DI.MightFreeUnknownObjects = true; 6083 continue; 6084 } 6085 6086 AllocationInfo *AI = AllocationInfos.lookup(ObjCB); 6087 if (!AI) { 6088 LLVM_DEBUG(dbgs() << "[H2S] Free of a non-allocation object: " << *Obj 6089 << "\n"); 6090 DI.MightFreeUnknownObjects = true; 6091 continue; 6092 } 6093 6094 DI.PotentialAllocationCalls.insert(ObjCB); 6095 } 6096 } 6097 }; 6098 6099 auto FreeCheck = [&](AllocationInfo &AI) { 6100 // If the stack is not accessible by other threads, the "must-free" logic 6101 // doesn't apply as the pointer could be shared and needs to be places in 6102 // "shareable" memory. 6103 if (!StackIsAccessibleByOtherThreads) { 6104 auto &NoSyncAA = 6105 A.getAAFor<AANoSync>(*this, getIRPosition(), DepClassTy::OPTIONAL); 6106 if (!NoSyncAA.isAssumedNoSync()) { 6107 LLVM_DEBUG( 6108 dbgs() << "[H2S] found an escaping use, stack is not accessible by " 6109 "other threads and function is not nosync:\n"); 6110 return false; 6111 } 6112 } 6113 if (!HasUpdatedFrees) 6114 UpdateFrees(); 6115 6116 // TODO: Allow multi exit functions that have different free calls. 6117 if (AI.PotentialFreeCalls.size() != 1) { 6118 LLVM_DEBUG(dbgs() << "[H2S] did not find one free call but " 6119 << AI.PotentialFreeCalls.size() << "\n"); 6120 return false; 6121 } 6122 CallBase *UniqueFree = *AI.PotentialFreeCalls.begin(); 6123 DeallocationInfo *DI = DeallocationInfos.lookup(UniqueFree); 6124 if (!DI) { 6125 LLVM_DEBUG( 6126 dbgs() << "[H2S] unique free call was not known as deallocation call " 6127 << *UniqueFree << "\n"); 6128 return false; 6129 } 6130 if (DI->MightFreeUnknownObjects) { 6131 LLVM_DEBUG( 6132 dbgs() << "[H2S] unique free call might free unknown allocations\n"); 6133 return false; 6134 } 6135 if (DI->PotentialAllocationCalls.size() > 1) { 6136 LLVM_DEBUG(dbgs() << "[H2S] unique free call might free " 6137 << DI->PotentialAllocationCalls.size() 6138 << " different allocations\n"); 6139 return false; 6140 } 6141 if (*DI->PotentialAllocationCalls.begin() != AI.CB) { 6142 LLVM_DEBUG( 6143 dbgs() 6144 << "[H2S] unique free call not known to free this allocation but " 6145 << **DI->PotentialAllocationCalls.begin() << "\n"); 6146 return false; 6147 } 6148 Instruction *CtxI = isa<InvokeInst>(AI.CB) ? AI.CB : AI.CB->getNextNode(); 6149 if (!Explorer.findInContextOf(UniqueFree, CtxI)) { 6150 LLVM_DEBUG( 6151 dbgs() 6152 << "[H2S] unique free call might not be executed with the allocation " 6153 << *UniqueFree << "\n"); 6154 return false; 6155 } 6156 return true; 6157 }; 6158 6159 auto UsesCheck = [&](AllocationInfo &AI) { 6160 bool ValidUsesOnly = true; 6161 6162 auto Pred = [&](const Use &U, bool &Follow) -> bool { 6163 Instruction *UserI = cast<Instruction>(U.getUser()); 6164 if (isa<LoadInst>(UserI)) 6165 return true; 6166 if (auto *SI = dyn_cast<StoreInst>(UserI)) { 6167 if (SI->getValueOperand() == U.get()) { 6168 LLVM_DEBUG(dbgs() 6169 << "[H2S] escaping store to memory: " << *UserI << "\n"); 6170 ValidUsesOnly = false; 6171 } else { 6172 // A store into the malloc'ed memory is fine. 6173 } 6174 return true; 6175 } 6176 if (auto *CB = dyn_cast<CallBase>(UserI)) { 6177 if (!CB->isArgOperand(&U) || CB->isLifetimeStartOrEnd()) 6178 return true; 6179 if (DeallocationInfos.count(CB)) { 6180 AI.PotentialFreeCalls.insert(CB); 6181 return true; 6182 } 6183 6184 unsigned ArgNo = CB->getArgOperandNo(&U); 6185 6186 const auto &NoCaptureAA = A.getAAFor<AANoCapture>( 6187 *this, IRPosition::callsite_argument(*CB, ArgNo), 6188 DepClassTy::OPTIONAL); 6189 6190 // If a call site argument use is nofree, we are fine. 6191 const auto &ArgNoFreeAA = A.getAAFor<AANoFree>( 6192 *this, IRPosition::callsite_argument(*CB, ArgNo), 6193 DepClassTy::OPTIONAL); 6194 6195 bool MaybeCaptured = !NoCaptureAA.isAssumedNoCapture(); 6196 bool MaybeFreed = !ArgNoFreeAA.isAssumedNoFree(); 6197 if (MaybeCaptured || 6198 (AI.LibraryFunctionId != LibFunc___kmpc_alloc_shared && 6199 MaybeFreed)) { 6200 AI.HasPotentiallyFreeingUnknownUses |= MaybeFreed; 6201 6202 // Emit a missed remark if this is missed OpenMP globalization. 6203 auto Remark = [&](OptimizationRemarkMissed ORM) { 6204 return ORM 6205 << "Could not move globalized variable to the stack. " 6206 "Variable is potentially captured in call. Mark " 6207 "parameter as `__attribute__((noescape))` to override."; 6208 }; 6209 6210 if (ValidUsesOnly && 6211 AI.LibraryFunctionId == LibFunc___kmpc_alloc_shared) 6212 A.emitRemark<OptimizationRemarkMissed>(AI.CB, "OMP113", Remark); 6213 6214 LLVM_DEBUG(dbgs() << "[H2S] Bad user: " << *UserI << "\n"); 6215 ValidUsesOnly = false; 6216 } 6217 return true; 6218 } 6219 6220 if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI) || 6221 isa<PHINode>(UserI) || isa<SelectInst>(UserI)) { 6222 Follow = true; 6223 return true; 6224 } 6225 // Unknown user for which we can not track uses further (in a way that 6226 // makes sense). 6227 LLVM_DEBUG(dbgs() << "[H2S] Unknown user: " << *UserI << "\n"); 6228 ValidUsesOnly = false; 6229 return true; 6230 }; 6231 if (!A.checkForAllUses(Pred, *this, *AI.CB)) 6232 return false; 6233 return ValidUsesOnly; 6234 }; 6235 6236 // The actual update starts here. We look at all allocations and depending on 6237 // their status perform the appropriate check(s). 6238 for (auto &It : AllocationInfos) { 6239 AllocationInfo &AI = *It.second; 6240 if (AI.Status == AllocationInfo::INVALID) 6241 continue; 6242 6243 if (MaxHeapToStackSize == -1) { 6244 if (AI.Kind == AllocationInfo::AllocationKind::ALIGNED_ALLOC) 6245 if (!getAPInt(A, *this, *AI.CB->getArgOperand(0)).hasValue()) { 6246 LLVM_DEBUG(dbgs() << "[H2S] Unknown allocation alignment: " << *AI.CB 6247 << "\n"); 6248 AI.Status = AllocationInfo::INVALID; 6249 Changed = ChangeStatus::CHANGED; 6250 continue; 6251 } 6252 } else { 6253 Optional<APInt> Size = getSize(A, *this, AI); 6254 if (!Size.hasValue() || Size.getValue().ugt(MaxHeapToStackSize)) { 6255 LLVM_DEBUG({ 6256 if (!Size.hasValue()) 6257 dbgs() << "[H2S] Unknown allocation size (or alignment): " << *AI.CB 6258 << "\n"; 6259 else 6260 dbgs() << "[H2S] Allocation size too large: " << *AI.CB << " vs. " 6261 << MaxHeapToStackSize << "\n"; 6262 }); 6263 6264 AI.Status = AllocationInfo::INVALID; 6265 Changed = ChangeStatus::CHANGED; 6266 continue; 6267 } 6268 } 6269 6270 switch (AI.Status) { 6271 case AllocationInfo::STACK_DUE_TO_USE: 6272 if (UsesCheck(AI)) 6273 continue; 6274 AI.Status = AllocationInfo::STACK_DUE_TO_FREE; 6275 LLVM_FALLTHROUGH; 6276 case AllocationInfo::STACK_DUE_TO_FREE: 6277 if (FreeCheck(AI)) 6278 continue; 6279 AI.Status = AllocationInfo::INVALID; 6280 Changed = ChangeStatus::CHANGED; 6281 continue; 6282 case AllocationInfo::INVALID: 6283 llvm_unreachable("Invalid allocations should never reach this point!"); 6284 }; 6285 } 6286 6287 return Changed; 6288 } 6289 6290 /// ----------------------- Privatizable Pointers ------------------------------ 6291 struct AAPrivatizablePtrImpl : public AAPrivatizablePtr { 6292 AAPrivatizablePtrImpl(const IRPosition &IRP, Attributor &A) 6293 : AAPrivatizablePtr(IRP, A), PrivatizableType(llvm::None) {} 6294 6295 ChangeStatus indicatePessimisticFixpoint() override { 6296 AAPrivatizablePtr::indicatePessimisticFixpoint(); 6297 PrivatizableType = nullptr; 6298 return ChangeStatus::CHANGED; 6299 } 6300 6301 /// Identify the type we can chose for a private copy of the underlying 6302 /// argument. None means it is not clear yet, nullptr means there is none. 6303 virtual Optional<Type *> identifyPrivatizableType(Attributor &A) = 0; 6304 6305 /// Return a privatizable type that encloses both T0 and T1. 6306 /// TODO: This is merely a stub for now as we should manage a mapping as well. 6307 Optional<Type *> combineTypes(Optional<Type *> T0, Optional<Type *> T1) { 6308 if (!T0.hasValue()) 6309 return T1; 6310 if (!T1.hasValue()) 6311 return T0; 6312 if (T0 == T1) 6313 return T0; 6314 return nullptr; 6315 } 6316 6317 Optional<Type *> getPrivatizableType() const override { 6318 return PrivatizableType; 6319 } 6320 6321 const std::string getAsStr() const override { 6322 return isAssumedPrivatizablePtr() ? "[priv]" : "[no-priv]"; 6323 } 6324 6325 protected: 6326 Optional<Type *> PrivatizableType; 6327 }; 6328 6329 // TODO: Do this for call site arguments (probably also other values) as well. 6330 6331 struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl { 6332 AAPrivatizablePtrArgument(const IRPosition &IRP, Attributor &A) 6333 : AAPrivatizablePtrImpl(IRP, A) {} 6334 6335 /// See AAPrivatizablePtrImpl::identifyPrivatizableType(...) 6336 Optional<Type *> identifyPrivatizableType(Attributor &A) override { 6337 // If this is a byval argument and we know all the call sites (so we can 6338 // rewrite them), there is no need to check them explicitly. 6339 bool AllCallSitesKnown; 6340 if (getIRPosition().hasAttr(Attribute::ByVal) && 6341 A.checkForAllCallSites([](AbstractCallSite ACS) { return true; }, *this, 6342 true, AllCallSitesKnown)) 6343 return getAssociatedValue().getType()->getPointerElementType(); 6344 6345 Optional<Type *> Ty; 6346 unsigned ArgNo = getIRPosition().getCallSiteArgNo(); 6347 6348 // Make sure the associated call site argument has the same type at all call 6349 // sites and it is an allocation we know is safe to privatize, for now that 6350 // means we only allow alloca instructions. 6351 // TODO: We can additionally analyze the accesses in the callee to create 6352 // the type from that information instead. That is a little more 6353 // involved and will be done in a follow up patch. 6354 auto CallSiteCheck = [&](AbstractCallSite ACS) { 6355 IRPosition ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo); 6356 // Check if a coresponding argument was found or if it is one not 6357 // associated (which can happen for callback calls). 6358 if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID) 6359 return false; 6360 6361 // Check that all call sites agree on a type. 6362 auto &PrivCSArgAA = 6363 A.getAAFor<AAPrivatizablePtr>(*this, ACSArgPos, DepClassTy::REQUIRED); 6364 Optional<Type *> CSTy = PrivCSArgAA.getPrivatizableType(); 6365 6366 LLVM_DEBUG({ 6367 dbgs() << "[AAPrivatizablePtr] ACSPos: " << ACSArgPos << ", CSTy: "; 6368 if (CSTy.hasValue() && CSTy.getValue()) 6369 CSTy.getValue()->print(dbgs()); 6370 else if (CSTy.hasValue()) 6371 dbgs() << "<nullptr>"; 6372 else 6373 dbgs() << "<none>"; 6374 }); 6375 6376 Ty = combineTypes(Ty, CSTy); 6377 6378 LLVM_DEBUG({ 6379 dbgs() << " : New Type: "; 6380 if (Ty.hasValue() && Ty.getValue()) 6381 Ty.getValue()->print(dbgs()); 6382 else if (Ty.hasValue()) 6383 dbgs() << "<nullptr>"; 6384 else 6385 dbgs() << "<none>"; 6386 dbgs() << "\n"; 6387 }); 6388 6389 return !Ty.hasValue() || Ty.getValue(); 6390 }; 6391 6392 if (!A.checkForAllCallSites(CallSiteCheck, *this, true, AllCallSitesKnown)) 6393 return nullptr; 6394 return Ty; 6395 } 6396 6397 /// See AbstractAttribute::updateImpl(...). 6398 ChangeStatus updateImpl(Attributor &A) override { 6399 PrivatizableType = identifyPrivatizableType(A); 6400 if (!PrivatizableType.hasValue()) 6401 return ChangeStatus::UNCHANGED; 6402 if (!PrivatizableType.getValue()) 6403 return indicatePessimisticFixpoint(); 6404 6405 // The dependence is optional so we don't give up once we give up on the 6406 // alignment. 6407 A.getAAFor<AAAlign>(*this, IRPosition::value(getAssociatedValue()), 6408 DepClassTy::OPTIONAL); 6409 6410 // Avoid arguments with padding for now. 6411 if (!getIRPosition().hasAttr(Attribute::ByVal) && 6412 !ArgumentPromotionPass::isDenselyPacked(PrivatizableType.getValue(), 6413 A.getInfoCache().getDL())) { 6414 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Padding detected\n"); 6415 return indicatePessimisticFixpoint(); 6416 } 6417 6418 // Verify callee and caller agree on how the promoted argument would be 6419 // passed. 6420 // TODO: The use of the ArgumentPromotion interface here is ugly, we need a 6421 // specialized form of TargetTransformInfo::areFunctionArgsABICompatible 6422 // which doesn't require the arguments ArgumentPromotion wanted to pass. 6423 Function &Fn = *getIRPosition().getAnchorScope(); 6424 SmallPtrSet<Argument *, 1> ArgsToPromote, Dummy; 6425 ArgsToPromote.insert(getAssociatedArgument()); 6426 const auto *TTI = 6427 A.getInfoCache().getAnalysisResultForFunction<TargetIRAnalysis>(Fn); 6428 if (!TTI || 6429 !ArgumentPromotionPass::areFunctionArgsABICompatible( 6430 Fn, *TTI, ArgsToPromote, Dummy) || 6431 ArgsToPromote.empty()) { 6432 LLVM_DEBUG( 6433 dbgs() << "[AAPrivatizablePtr] ABI incompatibility detected for " 6434 << Fn.getName() << "\n"); 6435 return indicatePessimisticFixpoint(); 6436 } 6437 6438 // Collect the types that will replace the privatizable type in the function 6439 // signature. 6440 SmallVector<Type *, 16> ReplacementTypes; 6441 identifyReplacementTypes(PrivatizableType.getValue(), ReplacementTypes); 6442 6443 // Register a rewrite of the argument. 6444 Argument *Arg = getAssociatedArgument(); 6445 if (!A.isValidFunctionSignatureRewrite(*Arg, ReplacementTypes)) { 6446 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Rewrite not valid\n"); 6447 return indicatePessimisticFixpoint(); 6448 } 6449 6450 unsigned ArgNo = Arg->getArgNo(); 6451 6452 // Helper to check if for the given call site the associated argument is 6453 // passed to a callback where the privatization would be different. 6454 auto IsCompatiblePrivArgOfCallback = [&](CallBase &CB) { 6455 SmallVector<const Use *, 4> CallbackUses; 6456 AbstractCallSite::getCallbackUses(CB, CallbackUses); 6457 for (const Use *U : CallbackUses) { 6458 AbstractCallSite CBACS(U); 6459 assert(CBACS && CBACS.isCallbackCall()); 6460 for (Argument &CBArg : CBACS.getCalledFunction()->args()) { 6461 int CBArgNo = CBACS.getCallArgOperandNo(CBArg); 6462 6463 LLVM_DEBUG({ 6464 dbgs() 6465 << "[AAPrivatizablePtr] Argument " << *Arg 6466 << "check if can be privatized in the context of its parent (" 6467 << Arg->getParent()->getName() 6468 << ")\n[AAPrivatizablePtr] because it is an argument in a " 6469 "callback (" 6470 << CBArgNo << "@" << CBACS.getCalledFunction()->getName() 6471 << ")\n[AAPrivatizablePtr] " << CBArg << " : " 6472 << CBACS.getCallArgOperand(CBArg) << " vs " 6473 << CB.getArgOperand(ArgNo) << "\n" 6474 << "[AAPrivatizablePtr] " << CBArg << " : " 6475 << CBACS.getCallArgOperandNo(CBArg) << " vs " << ArgNo << "\n"; 6476 }); 6477 6478 if (CBArgNo != int(ArgNo)) 6479 continue; 6480 const auto &CBArgPrivAA = A.getAAFor<AAPrivatizablePtr>( 6481 *this, IRPosition::argument(CBArg), DepClassTy::REQUIRED); 6482 if (CBArgPrivAA.isValidState()) { 6483 auto CBArgPrivTy = CBArgPrivAA.getPrivatizableType(); 6484 if (!CBArgPrivTy.hasValue()) 6485 continue; 6486 if (CBArgPrivTy.getValue() == PrivatizableType) 6487 continue; 6488 } 6489 6490 LLVM_DEBUG({ 6491 dbgs() << "[AAPrivatizablePtr] Argument " << *Arg 6492 << " cannot be privatized in the context of its parent (" 6493 << Arg->getParent()->getName() 6494 << ")\n[AAPrivatizablePtr] because it is an argument in a " 6495 "callback (" 6496 << CBArgNo << "@" << CBACS.getCalledFunction()->getName() 6497 << ").\n[AAPrivatizablePtr] for which the argument " 6498 "privatization is not compatible.\n"; 6499 }); 6500 return false; 6501 } 6502 } 6503 return true; 6504 }; 6505 6506 // Helper to check if for the given call site the associated argument is 6507 // passed to a direct call where the privatization would be different. 6508 auto IsCompatiblePrivArgOfDirectCS = [&](AbstractCallSite ACS) { 6509 CallBase *DC = cast<CallBase>(ACS.getInstruction()); 6510 int DCArgNo = ACS.getCallArgOperandNo(ArgNo); 6511 assert(DCArgNo >= 0 && unsigned(DCArgNo) < DC->getNumArgOperands() && 6512 "Expected a direct call operand for callback call operand"); 6513 6514 LLVM_DEBUG({ 6515 dbgs() << "[AAPrivatizablePtr] Argument " << *Arg 6516 << " check if be privatized in the context of its parent (" 6517 << Arg->getParent()->getName() 6518 << ")\n[AAPrivatizablePtr] because it is an argument in a " 6519 "direct call of (" 6520 << DCArgNo << "@" << DC->getCalledFunction()->getName() 6521 << ").\n"; 6522 }); 6523 6524 Function *DCCallee = DC->getCalledFunction(); 6525 if (unsigned(DCArgNo) < DCCallee->arg_size()) { 6526 const auto &DCArgPrivAA = A.getAAFor<AAPrivatizablePtr>( 6527 *this, IRPosition::argument(*DCCallee->getArg(DCArgNo)), 6528 DepClassTy::REQUIRED); 6529 if (DCArgPrivAA.isValidState()) { 6530 auto DCArgPrivTy = DCArgPrivAA.getPrivatizableType(); 6531 if (!DCArgPrivTy.hasValue()) 6532 return true; 6533 if (DCArgPrivTy.getValue() == PrivatizableType) 6534 return true; 6535 } 6536 } 6537 6538 LLVM_DEBUG({ 6539 dbgs() << "[AAPrivatizablePtr] Argument " << *Arg 6540 << " cannot be privatized in the context of its parent (" 6541 << Arg->getParent()->getName() 6542 << ")\n[AAPrivatizablePtr] because it is an argument in a " 6543 "direct call of (" 6544 << ACS.getInstruction()->getCalledFunction()->getName() 6545 << ").\n[AAPrivatizablePtr] for which the argument " 6546 "privatization is not compatible.\n"; 6547 }); 6548 return false; 6549 }; 6550 6551 // Helper to check if the associated argument is used at the given abstract 6552 // call site in a way that is incompatible with the privatization assumed 6553 // here. 6554 auto IsCompatiblePrivArgOfOtherCallSite = [&](AbstractCallSite ACS) { 6555 if (ACS.isDirectCall()) 6556 return IsCompatiblePrivArgOfCallback(*ACS.getInstruction()); 6557 if (ACS.isCallbackCall()) 6558 return IsCompatiblePrivArgOfDirectCS(ACS); 6559 return false; 6560 }; 6561 6562 bool AllCallSitesKnown; 6563 if (!A.checkForAllCallSites(IsCompatiblePrivArgOfOtherCallSite, *this, true, 6564 AllCallSitesKnown)) 6565 return indicatePessimisticFixpoint(); 6566 6567 return ChangeStatus::UNCHANGED; 6568 } 6569 6570 /// Given a type to private \p PrivType, collect the constituates (which are 6571 /// used) in \p ReplacementTypes. 6572 static void 6573 identifyReplacementTypes(Type *PrivType, 6574 SmallVectorImpl<Type *> &ReplacementTypes) { 6575 // TODO: For now we expand the privatization type to the fullest which can 6576 // lead to dead arguments that need to be removed later. 6577 assert(PrivType && "Expected privatizable type!"); 6578 6579 // Traverse the type, extract constituate types on the outermost level. 6580 if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) { 6581 for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) 6582 ReplacementTypes.push_back(PrivStructType->getElementType(u)); 6583 } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) { 6584 ReplacementTypes.append(PrivArrayType->getNumElements(), 6585 PrivArrayType->getElementType()); 6586 } else { 6587 ReplacementTypes.push_back(PrivType); 6588 } 6589 } 6590 6591 /// Initialize \p Base according to the type \p PrivType at position \p IP. 6592 /// The values needed are taken from the arguments of \p F starting at 6593 /// position \p ArgNo. 6594 static void createInitialization(Type *PrivType, Value &Base, Function &F, 6595 unsigned ArgNo, Instruction &IP) { 6596 assert(PrivType && "Expected privatizable type!"); 6597 6598 IRBuilder<NoFolder> IRB(&IP); 6599 const DataLayout &DL = F.getParent()->getDataLayout(); 6600 6601 // Traverse the type, build GEPs and stores. 6602 if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) { 6603 const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType); 6604 for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) { 6605 Type *PointeeTy = PrivStructType->getElementType(u)->getPointerTo(); 6606 Value *Ptr = 6607 constructPointer(PointeeTy, PrivType, &Base, 6608 PrivStructLayout->getElementOffset(u), IRB, DL); 6609 new StoreInst(F.getArg(ArgNo + u), Ptr, &IP); 6610 } 6611 } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) { 6612 Type *PointeeTy = PrivArrayType->getElementType(); 6613 Type *PointeePtrTy = PointeeTy->getPointerTo(); 6614 uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy); 6615 for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) { 6616 Value *Ptr = constructPointer(PointeePtrTy, PrivType, &Base, 6617 u * PointeeTySize, IRB, DL); 6618 new StoreInst(F.getArg(ArgNo + u), Ptr, &IP); 6619 } 6620 } else { 6621 new StoreInst(F.getArg(ArgNo), &Base, &IP); 6622 } 6623 } 6624 6625 /// Extract values from \p Base according to the type \p PrivType at the 6626 /// call position \p ACS. The values are appended to \p ReplacementValues. 6627 void createReplacementValues(Align Alignment, Type *PrivType, 6628 AbstractCallSite ACS, Value *Base, 6629 SmallVectorImpl<Value *> &ReplacementValues) { 6630 assert(Base && "Expected base value!"); 6631 assert(PrivType && "Expected privatizable type!"); 6632 Instruction *IP = ACS.getInstruction(); 6633 6634 IRBuilder<NoFolder> IRB(IP); 6635 const DataLayout &DL = IP->getModule()->getDataLayout(); 6636 6637 if (Base->getType()->getPointerElementType() != PrivType) 6638 Base = BitCastInst::CreateBitOrPointerCast(Base, PrivType->getPointerTo(), 6639 "", ACS.getInstruction()); 6640 6641 // Traverse the type, build GEPs and loads. 6642 if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) { 6643 const StructLayout *PrivStructLayout = DL.getStructLayout(PrivStructType); 6644 for (unsigned u = 0, e = PrivStructType->getNumElements(); u < e; u++) { 6645 Type *PointeeTy = PrivStructType->getElementType(u); 6646 Value *Ptr = 6647 constructPointer(PointeeTy->getPointerTo(), PrivType, Base, 6648 PrivStructLayout->getElementOffset(u), IRB, DL); 6649 LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP); 6650 L->setAlignment(Alignment); 6651 ReplacementValues.push_back(L); 6652 } 6653 } else if (auto *PrivArrayType = dyn_cast<ArrayType>(PrivType)) { 6654 Type *PointeeTy = PrivArrayType->getElementType(); 6655 uint64_t PointeeTySize = DL.getTypeStoreSize(PointeeTy); 6656 Type *PointeePtrTy = PointeeTy->getPointerTo(); 6657 for (unsigned u = 0, e = PrivArrayType->getNumElements(); u < e; u++) { 6658 Value *Ptr = constructPointer(PointeePtrTy, PrivType, Base, 6659 u * PointeeTySize, IRB, DL); 6660 LoadInst *L = new LoadInst(PointeeTy, Ptr, "", IP); 6661 L->setAlignment(Alignment); 6662 ReplacementValues.push_back(L); 6663 } 6664 } else { 6665 LoadInst *L = new LoadInst(PrivType, Base, "", IP); 6666 L->setAlignment(Alignment); 6667 ReplacementValues.push_back(L); 6668 } 6669 } 6670 6671 /// See AbstractAttribute::manifest(...) 6672 ChangeStatus manifest(Attributor &A) override { 6673 if (!PrivatizableType.hasValue()) 6674 return ChangeStatus::UNCHANGED; 6675 assert(PrivatizableType.getValue() && "Expected privatizable type!"); 6676 6677 // Collect all tail calls in the function as we cannot allow new allocas to 6678 // escape into tail recursion. 6679 // TODO: Be smarter about new allocas escaping into tail calls. 6680 SmallVector<CallInst *, 16> TailCalls; 6681 bool UsedAssumedInformation = false; 6682 if (!A.checkForAllInstructions( 6683 [&](Instruction &I) { 6684 CallInst &CI = cast<CallInst>(I); 6685 if (CI.isTailCall()) 6686 TailCalls.push_back(&CI); 6687 return true; 6688 }, 6689 *this, {Instruction::Call}, UsedAssumedInformation)) 6690 return ChangeStatus::UNCHANGED; 6691 6692 Argument *Arg = getAssociatedArgument(); 6693 // Query AAAlign attribute for alignment of associated argument to 6694 // determine the best alignment of loads. 6695 const auto &AlignAA = 6696 A.getAAFor<AAAlign>(*this, IRPosition::value(*Arg), DepClassTy::NONE); 6697 6698 // Callback to repair the associated function. A new alloca is placed at the 6699 // beginning and initialized with the values passed through arguments. The 6700 // new alloca replaces the use of the old pointer argument. 6701 Attributor::ArgumentReplacementInfo::CalleeRepairCBTy FnRepairCB = 6702 [=](const Attributor::ArgumentReplacementInfo &ARI, 6703 Function &ReplacementFn, Function::arg_iterator ArgIt) { 6704 BasicBlock &EntryBB = ReplacementFn.getEntryBlock(); 6705 Instruction *IP = &*EntryBB.getFirstInsertionPt(); 6706 Instruction *AI = new AllocaInst(PrivatizableType.getValue(), 0, 6707 Arg->getName() + ".priv", IP); 6708 createInitialization(PrivatizableType.getValue(), *AI, ReplacementFn, 6709 ArgIt->getArgNo(), *IP); 6710 6711 if (AI->getType() != Arg->getType()) 6712 AI = 6713 BitCastInst::CreateBitOrPointerCast(AI, Arg->getType(), "", IP); 6714 Arg->replaceAllUsesWith(AI); 6715 6716 for (CallInst *CI : TailCalls) 6717 CI->setTailCall(false); 6718 }; 6719 6720 // Callback to repair a call site of the associated function. The elements 6721 // of the privatizable type are loaded prior to the call and passed to the 6722 // new function version. 6723 Attributor::ArgumentReplacementInfo::ACSRepairCBTy ACSRepairCB = 6724 [=, &AlignAA](const Attributor::ArgumentReplacementInfo &ARI, 6725 AbstractCallSite ACS, 6726 SmallVectorImpl<Value *> &NewArgOperands) { 6727 // When no alignment is specified for the load instruction, 6728 // natural alignment is assumed. 6729 createReplacementValues( 6730 assumeAligned(AlignAA.getAssumedAlign()), 6731 PrivatizableType.getValue(), ACS, 6732 ACS.getCallArgOperand(ARI.getReplacedArg().getArgNo()), 6733 NewArgOperands); 6734 }; 6735 6736 // Collect the types that will replace the privatizable type in the function 6737 // signature. 6738 SmallVector<Type *, 16> ReplacementTypes; 6739 identifyReplacementTypes(PrivatizableType.getValue(), ReplacementTypes); 6740 6741 // Register a rewrite of the argument. 6742 if (A.registerFunctionSignatureRewrite(*Arg, ReplacementTypes, 6743 std::move(FnRepairCB), 6744 std::move(ACSRepairCB))) 6745 return ChangeStatus::CHANGED; 6746 return ChangeStatus::UNCHANGED; 6747 } 6748 6749 /// See AbstractAttribute::trackStatistics() 6750 void trackStatistics() const override { 6751 STATS_DECLTRACK_ARG_ATTR(privatizable_ptr); 6752 } 6753 }; 6754 6755 struct AAPrivatizablePtrFloating : public AAPrivatizablePtrImpl { 6756 AAPrivatizablePtrFloating(const IRPosition &IRP, Attributor &A) 6757 : AAPrivatizablePtrImpl(IRP, A) {} 6758 6759 /// See AbstractAttribute::initialize(...). 6760 virtual void initialize(Attributor &A) override { 6761 // TODO: We can privatize more than arguments. 6762 indicatePessimisticFixpoint(); 6763 } 6764 6765 ChangeStatus updateImpl(Attributor &A) override { 6766 llvm_unreachable("AAPrivatizablePtr(Floating|Returned|CallSiteReturned)::" 6767 "updateImpl will not be called"); 6768 } 6769 6770 /// See AAPrivatizablePtrImpl::identifyPrivatizableType(...) 6771 Optional<Type *> identifyPrivatizableType(Attributor &A) override { 6772 Value *Obj = getUnderlyingObject(&getAssociatedValue()); 6773 if (!Obj) { 6774 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] No underlying object found!\n"); 6775 return nullptr; 6776 } 6777 6778 if (auto *AI = dyn_cast<AllocaInst>(Obj)) 6779 if (auto *CI = dyn_cast<ConstantInt>(AI->getArraySize())) 6780 if (CI->isOne()) 6781 return Obj->getType()->getPointerElementType(); 6782 if (auto *Arg = dyn_cast<Argument>(Obj)) { 6783 auto &PrivArgAA = A.getAAFor<AAPrivatizablePtr>( 6784 *this, IRPosition::argument(*Arg), DepClassTy::REQUIRED); 6785 if (PrivArgAA.isAssumedPrivatizablePtr()) 6786 return Obj->getType()->getPointerElementType(); 6787 } 6788 6789 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] Underlying object neither valid " 6790 "alloca nor privatizable argument: " 6791 << *Obj << "!\n"); 6792 return nullptr; 6793 } 6794 6795 /// See AbstractAttribute::trackStatistics() 6796 void trackStatistics() const override { 6797 STATS_DECLTRACK_FLOATING_ATTR(privatizable_ptr); 6798 } 6799 }; 6800 6801 struct AAPrivatizablePtrCallSiteArgument final 6802 : public AAPrivatizablePtrFloating { 6803 AAPrivatizablePtrCallSiteArgument(const IRPosition &IRP, Attributor &A) 6804 : AAPrivatizablePtrFloating(IRP, A) {} 6805 6806 /// See AbstractAttribute::initialize(...). 6807 void initialize(Attributor &A) override { 6808 if (getIRPosition().hasAttr(Attribute::ByVal)) 6809 indicateOptimisticFixpoint(); 6810 } 6811 6812 /// See AbstractAttribute::updateImpl(...). 6813 ChangeStatus updateImpl(Attributor &A) override { 6814 PrivatizableType = identifyPrivatizableType(A); 6815 if (!PrivatizableType.hasValue()) 6816 return ChangeStatus::UNCHANGED; 6817 if (!PrivatizableType.getValue()) 6818 return indicatePessimisticFixpoint(); 6819 6820 const IRPosition &IRP = getIRPosition(); 6821 auto &NoCaptureAA = 6822 A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::REQUIRED); 6823 if (!NoCaptureAA.isAssumedNoCapture()) { 6824 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer might be captured!\n"); 6825 return indicatePessimisticFixpoint(); 6826 } 6827 6828 auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, IRP, DepClassTy::REQUIRED); 6829 if (!NoAliasAA.isAssumedNoAlias()) { 6830 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer might alias!\n"); 6831 return indicatePessimisticFixpoint(); 6832 } 6833 6834 const auto &MemBehaviorAA = 6835 A.getAAFor<AAMemoryBehavior>(*this, IRP, DepClassTy::REQUIRED); 6836 if (!MemBehaviorAA.isAssumedReadOnly()) { 6837 LLVM_DEBUG(dbgs() << "[AAPrivatizablePtr] pointer is written!\n"); 6838 return indicatePessimisticFixpoint(); 6839 } 6840 6841 return ChangeStatus::UNCHANGED; 6842 } 6843 6844 /// See AbstractAttribute::trackStatistics() 6845 void trackStatistics() const override { 6846 STATS_DECLTRACK_CSARG_ATTR(privatizable_ptr); 6847 } 6848 }; 6849 6850 struct AAPrivatizablePtrCallSiteReturned final 6851 : public AAPrivatizablePtrFloating { 6852 AAPrivatizablePtrCallSiteReturned(const IRPosition &IRP, Attributor &A) 6853 : AAPrivatizablePtrFloating(IRP, A) {} 6854 6855 /// See AbstractAttribute::initialize(...). 6856 void initialize(Attributor &A) override { 6857 // TODO: We can privatize more than arguments. 6858 indicatePessimisticFixpoint(); 6859 } 6860 6861 /// See AbstractAttribute::trackStatistics() 6862 void trackStatistics() const override { 6863 STATS_DECLTRACK_CSRET_ATTR(privatizable_ptr); 6864 } 6865 }; 6866 6867 struct AAPrivatizablePtrReturned final : public AAPrivatizablePtrFloating { 6868 AAPrivatizablePtrReturned(const IRPosition &IRP, Attributor &A) 6869 : AAPrivatizablePtrFloating(IRP, A) {} 6870 6871 /// See AbstractAttribute::initialize(...). 6872 void initialize(Attributor &A) override { 6873 // TODO: We can privatize more than arguments. 6874 indicatePessimisticFixpoint(); 6875 } 6876 6877 /// See AbstractAttribute::trackStatistics() 6878 void trackStatistics() const override { 6879 STATS_DECLTRACK_FNRET_ATTR(privatizable_ptr); 6880 } 6881 }; 6882 6883 /// -------------------- Memory Behavior Attributes ---------------------------- 6884 /// Includes read-none, read-only, and write-only. 6885 /// ---------------------------------------------------------------------------- 6886 struct AAMemoryBehaviorImpl : public AAMemoryBehavior { 6887 AAMemoryBehaviorImpl(const IRPosition &IRP, Attributor &A) 6888 : AAMemoryBehavior(IRP, A) {} 6889 6890 /// See AbstractAttribute::initialize(...). 6891 void initialize(Attributor &A) override { 6892 intersectAssumedBits(BEST_STATE); 6893 getKnownStateFromValue(getIRPosition(), getState()); 6894 AAMemoryBehavior::initialize(A); 6895 } 6896 6897 /// Return the memory behavior information encoded in the IR for \p IRP. 6898 static void getKnownStateFromValue(const IRPosition &IRP, 6899 BitIntegerState &State, 6900 bool IgnoreSubsumingPositions = false) { 6901 SmallVector<Attribute, 2> Attrs; 6902 IRP.getAttrs(AttrKinds, Attrs, IgnoreSubsumingPositions); 6903 for (const Attribute &Attr : Attrs) { 6904 switch (Attr.getKindAsEnum()) { 6905 case Attribute::ReadNone: 6906 State.addKnownBits(NO_ACCESSES); 6907 break; 6908 case Attribute::ReadOnly: 6909 State.addKnownBits(NO_WRITES); 6910 break; 6911 case Attribute::WriteOnly: 6912 State.addKnownBits(NO_READS); 6913 break; 6914 default: 6915 llvm_unreachable("Unexpected attribute!"); 6916 } 6917 } 6918 6919 if (auto *I = dyn_cast<Instruction>(&IRP.getAnchorValue())) { 6920 if (!I->mayReadFromMemory()) 6921 State.addKnownBits(NO_READS); 6922 if (!I->mayWriteToMemory()) 6923 State.addKnownBits(NO_WRITES); 6924 } 6925 } 6926 6927 /// See AbstractAttribute::getDeducedAttributes(...). 6928 void getDeducedAttributes(LLVMContext &Ctx, 6929 SmallVectorImpl<Attribute> &Attrs) const override { 6930 assert(Attrs.size() == 0); 6931 if (isAssumedReadNone()) 6932 Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone)); 6933 else if (isAssumedReadOnly()) 6934 Attrs.push_back(Attribute::get(Ctx, Attribute::ReadOnly)); 6935 else if (isAssumedWriteOnly()) 6936 Attrs.push_back(Attribute::get(Ctx, Attribute::WriteOnly)); 6937 assert(Attrs.size() <= 1); 6938 } 6939 6940 /// See AbstractAttribute::manifest(...). 6941 ChangeStatus manifest(Attributor &A) override { 6942 if (hasAttr(Attribute::ReadNone, /* IgnoreSubsumingPositions */ true)) 6943 return ChangeStatus::UNCHANGED; 6944 6945 const IRPosition &IRP = getIRPosition(); 6946 6947 // Check if we would improve the existing attributes first. 6948 SmallVector<Attribute, 4> DeducedAttrs; 6949 getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs); 6950 if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) { 6951 return IRP.hasAttr(Attr.getKindAsEnum(), 6952 /* IgnoreSubsumingPositions */ true); 6953 })) 6954 return ChangeStatus::UNCHANGED; 6955 6956 // Clear existing attributes. 6957 IRP.removeAttrs(AttrKinds); 6958 6959 // Use the generic manifest method. 6960 return IRAttribute::manifest(A); 6961 } 6962 6963 /// See AbstractState::getAsStr(). 6964 const std::string getAsStr() const override { 6965 if (isAssumedReadNone()) 6966 return "readnone"; 6967 if (isAssumedReadOnly()) 6968 return "readonly"; 6969 if (isAssumedWriteOnly()) 6970 return "writeonly"; 6971 return "may-read/write"; 6972 } 6973 6974 /// The set of IR attributes AAMemoryBehavior deals with. 6975 static const Attribute::AttrKind AttrKinds[3]; 6976 }; 6977 6978 const Attribute::AttrKind AAMemoryBehaviorImpl::AttrKinds[] = { 6979 Attribute::ReadNone, Attribute::ReadOnly, Attribute::WriteOnly}; 6980 6981 /// Memory behavior attribute for a floating value. 6982 struct AAMemoryBehaviorFloating : AAMemoryBehaviorImpl { 6983 AAMemoryBehaviorFloating(const IRPosition &IRP, Attributor &A) 6984 : AAMemoryBehaviorImpl(IRP, A) {} 6985 6986 /// See AbstractAttribute::updateImpl(...). 6987 ChangeStatus updateImpl(Attributor &A) override; 6988 6989 /// See AbstractAttribute::trackStatistics() 6990 void trackStatistics() const override { 6991 if (isAssumedReadNone()) 6992 STATS_DECLTRACK_FLOATING_ATTR(readnone) 6993 else if (isAssumedReadOnly()) 6994 STATS_DECLTRACK_FLOATING_ATTR(readonly) 6995 else if (isAssumedWriteOnly()) 6996 STATS_DECLTRACK_FLOATING_ATTR(writeonly) 6997 } 6998 6999 private: 7000 /// Return true if users of \p UserI might access the underlying 7001 /// variable/location described by \p U and should therefore be analyzed. 7002 bool followUsersOfUseIn(Attributor &A, const Use &U, 7003 const Instruction *UserI); 7004 7005 /// Update the state according to the effect of use \p U in \p UserI. 7006 void analyzeUseIn(Attributor &A, const Use &U, const Instruction *UserI); 7007 }; 7008 7009 /// Memory behavior attribute for function argument. 7010 struct AAMemoryBehaviorArgument : AAMemoryBehaviorFloating { 7011 AAMemoryBehaviorArgument(const IRPosition &IRP, Attributor &A) 7012 : AAMemoryBehaviorFloating(IRP, A) {} 7013 7014 /// See AbstractAttribute::initialize(...). 7015 void initialize(Attributor &A) override { 7016 intersectAssumedBits(BEST_STATE); 7017 const IRPosition &IRP = getIRPosition(); 7018 // TODO: Make IgnoreSubsumingPositions a property of an IRAttribute so we 7019 // can query it when we use has/getAttr. That would allow us to reuse the 7020 // initialize of the base class here. 7021 bool HasByVal = 7022 IRP.hasAttr({Attribute::ByVal}, /* IgnoreSubsumingPositions */ true); 7023 getKnownStateFromValue(IRP, getState(), 7024 /* IgnoreSubsumingPositions */ HasByVal); 7025 7026 // Initialize the use vector with all direct uses of the associated value. 7027 Argument *Arg = getAssociatedArgument(); 7028 if (!Arg || !A.isFunctionIPOAmendable(*(Arg->getParent()))) 7029 indicatePessimisticFixpoint(); 7030 } 7031 7032 ChangeStatus manifest(Attributor &A) override { 7033 // TODO: Pointer arguments are not supported on vectors of pointers yet. 7034 if (!getAssociatedValue().getType()->isPointerTy()) 7035 return ChangeStatus::UNCHANGED; 7036 7037 // TODO: From readattrs.ll: "inalloca parameters are always 7038 // considered written" 7039 if (hasAttr({Attribute::InAlloca, Attribute::Preallocated})) { 7040 removeKnownBits(NO_WRITES); 7041 removeAssumedBits(NO_WRITES); 7042 } 7043 return AAMemoryBehaviorFloating::manifest(A); 7044 } 7045 7046 /// See AbstractAttribute::trackStatistics() 7047 void trackStatistics() const override { 7048 if (isAssumedReadNone()) 7049 STATS_DECLTRACK_ARG_ATTR(readnone) 7050 else if (isAssumedReadOnly()) 7051 STATS_DECLTRACK_ARG_ATTR(readonly) 7052 else if (isAssumedWriteOnly()) 7053 STATS_DECLTRACK_ARG_ATTR(writeonly) 7054 } 7055 }; 7056 7057 struct AAMemoryBehaviorCallSiteArgument final : AAMemoryBehaviorArgument { 7058 AAMemoryBehaviorCallSiteArgument(const IRPosition &IRP, Attributor &A) 7059 : AAMemoryBehaviorArgument(IRP, A) {} 7060 7061 /// See AbstractAttribute::initialize(...). 7062 void initialize(Attributor &A) override { 7063 // If we don't have an associated attribute this is either a variadic call 7064 // or an indirect call, either way, nothing to do here. 7065 Argument *Arg = getAssociatedArgument(); 7066 if (!Arg) { 7067 indicatePessimisticFixpoint(); 7068 return; 7069 } 7070 if (Arg->hasByValAttr()) { 7071 addKnownBits(NO_WRITES); 7072 removeKnownBits(NO_READS); 7073 removeAssumedBits(NO_READS); 7074 } 7075 AAMemoryBehaviorArgument::initialize(A); 7076 if (getAssociatedFunction()->isDeclaration()) 7077 indicatePessimisticFixpoint(); 7078 } 7079 7080 /// See AbstractAttribute::updateImpl(...). 7081 ChangeStatus updateImpl(Attributor &A) override { 7082 // TODO: Once we have call site specific value information we can provide 7083 // call site specific liveness liveness information and then it makes 7084 // sense to specialize attributes for call sites arguments instead of 7085 // redirecting requests to the callee argument. 7086 Argument *Arg = getAssociatedArgument(); 7087 const IRPosition &ArgPos = IRPosition::argument(*Arg); 7088 auto &ArgAA = 7089 A.getAAFor<AAMemoryBehavior>(*this, ArgPos, DepClassTy::REQUIRED); 7090 return clampStateAndIndicateChange(getState(), ArgAA.getState()); 7091 } 7092 7093 /// See AbstractAttribute::trackStatistics() 7094 void trackStatistics() const override { 7095 if (isAssumedReadNone()) 7096 STATS_DECLTRACK_CSARG_ATTR(readnone) 7097 else if (isAssumedReadOnly()) 7098 STATS_DECLTRACK_CSARG_ATTR(readonly) 7099 else if (isAssumedWriteOnly()) 7100 STATS_DECLTRACK_CSARG_ATTR(writeonly) 7101 } 7102 }; 7103 7104 /// Memory behavior attribute for a call site return position. 7105 struct AAMemoryBehaviorCallSiteReturned final : AAMemoryBehaviorFloating { 7106 AAMemoryBehaviorCallSiteReturned(const IRPosition &IRP, Attributor &A) 7107 : AAMemoryBehaviorFloating(IRP, A) {} 7108 7109 /// See AbstractAttribute::initialize(...). 7110 void initialize(Attributor &A) override { 7111 AAMemoryBehaviorImpl::initialize(A); 7112 Function *F = getAssociatedFunction(); 7113 if (!F || F->isDeclaration()) 7114 indicatePessimisticFixpoint(); 7115 } 7116 7117 /// See AbstractAttribute::manifest(...). 7118 ChangeStatus manifest(Attributor &A) override { 7119 // We do not annotate returned values. 7120 return ChangeStatus::UNCHANGED; 7121 } 7122 7123 /// See AbstractAttribute::trackStatistics() 7124 void trackStatistics() const override {} 7125 }; 7126 7127 /// An AA to represent the memory behavior function attributes. 7128 struct AAMemoryBehaviorFunction final : public AAMemoryBehaviorImpl { 7129 AAMemoryBehaviorFunction(const IRPosition &IRP, Attributor &A) 7130 : AAMemoryBehaviorImpl(IRP, A) {} 7131 7132 /// See AbstractAttribute::updateImpl(Attributor &A). 7133 virtual ChangeStatus updateImpl(Attributor &A) override; 7134 7135 /// See AbstractAttribute::manifest(...). 7136 ChangeStatus manifest(Attributor &A) override { 7137 Function &F = cast<Function>(getAnchorValue()); 7138 if (isAssumedReadNone()) { 7139 F.removeFnAttr(Attribute::ArgMemOnly); 7140 F.removeFnAttr(Attribute::InaccessibleMemOnly); 7141 F.removeFnAttr(Attribute::InaccessibleMemOrArgMemOnly); 7142 } 7143 return AAMemoryBehaviorImpl::manifest(A); 7144 } 7145 7146 /// See AbstractAttribute::trackStatistics() 7147 void trackStatistics() const override { 7148 if (isAssumedReadNone()) 7149 STATS_DECLTRACK_FN_ATTR(readnone) 7150 else if (isAssumedReadOnly()) 7151 STATS_DECLTRACK_FN_ATTR(readonly) 7152 else if (isAssumedWriteOnly()) 7153 STATS_DECLTRACK_FN_ATTR(writeonly) 7154 } 7155 }; 7156 7157 /// AAMemoryBehavior attribute for call sites. 7158 struct AAMemoryBehaviorCallSite final : AAMemoryBehaviorImpl { 7159 AAMemoryBehaviorCallSite(const IRPosition &IRP, Attributor &A) 7160 : AAMemoryBehaviorImpl(IRP, A) {} 7161 7162 /// See AbstractAttribute::initialize(...). 7163 void initialize(Attributor &A) override { 7164 AAMemoryBehaviorImpl::initialize(A); 7165 Function *F = getAssociatedFunction(); 7166 if (!F || F->isDeclaration()) 7167 indicatePessimisticFixpoint(); 7168 } 7169 7170 /// See AbstractAttribute::updateImpl(...). 7171 ChangeStatus updateImpl(Attributor &A) override { 7172 // TODO: Once we have call site specific value information we can provide 7173 // call site specific liveness liveness information and then it makes 7174 // sense to specialize attributes for call sites arguments instead of 7175 // redirecting requests to the callee argument. 7176 Function *F = getAssociatedFunction(); 7177 const IRPosition &FnPos = IRPosition::function(*F); 7178 auto &FnAA = 7179 A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::REQUIRED); 7180 return clampStateAndIndicateChange(getState(), FnAA.getState()); 7181 } 7182 7183 /// See AbstractAttribute::trackStatistics() 7184 void trackStatistics() const override { 7185 if (isAssumedReadNone()) 7186 STATS_DECLTRACK_CS_ATTR(readnone) 7187 else if (isAssumedReadOnly()) 7188 STATS_DECLTRACK_CS_ATTR(readonly) 7189 else if (isAssumedWriteOnly()) 7190 STATS_DECLTRACK_CS_ATTR(writeonly) 7191 } 7192 }; 7193 7194 ChangeStatus AAMemoryBehaviorFunction::updateImpl(Attributor &A) { 7195 7196 // The current assumed state used to determine a change. 7197 auto AssumedState = getAssumed(); 7198 7199 auto CheckRWInst = [&](Instruction &I) { 7200 // If the instruction has an own memory behavior state, use it to restrict 7201 // the local state. No further analysis is required as the other memory 7202 // state is as optimistic as it gets. 7203 if (const auto *CB = dyn_cast<CallBase>(&I)) { 7204 const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>( 7205 *this, IRPosition::callsite_function(*CB), DepClassTy::REQUIRED); 7206 intersectAssumedBits(MemBehaviorAA.getAssumed()); 7207 return !isAtFixpoint(); 7208 } 7209 7210 // Remove access kind modifiers if necessary. 7211 if (I.mayReadFromMemory()) 7212 removeAssumedBits(NO_READS); 7213 if (I.mayWriteToMemory()) 7214 removeAssumedBits(NO_WRITES); 7215 return !isAtFixpoint(); 7216 }; 7217 7218 bool UsedAssumedInformation = false; 7219 if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this, 7220 UsedAssumedInformation)) 7221 return indicatePessimisticFixpoint(); 7222 7223 return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED 7224 : ChangeStatus::UNCHANGED; 7225 } 7226 7227 ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) { 7228 7229 const IRPosition &IRP = getIRPosition(); 7230 const IRPosition &FnPos = IRPosition::function_scope(IRP); 7231 AAMemoryBehavior::StateType &S = getState(); 7232 7233 // First, check the function scope. We take the known information and we avoid 7234 // work if the assumed information implies the current assumed information for 7235 // this attribute. This is a valid for all but byval arguments. 7236 Argument *Arg = IRP.getAssociatedArgument(); 7237 AAMemoryBehavior::base_t FnMemAssumedState = 7238 AAMemoryBehavior::StateType::getWorstState(); 7239 if (!Arg || !Arg->hasByValAttr()) { 7240 const auto &FnMemAA = 7241 A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::OPTIONAL); 7242 FnMemAssumedState = FnMemAA.getAssumed(); 7243 S.addKnownBits(FnMemAA.getKnown()); 7244 if ((S.getAssumed() & FnMemAA.getAssumed()) == S.getAssumed()) 7245 return ChangeStatus::UNCHANGED; 7246 } 7247 7248 // The current assumed state used to determine a change. 7249 auto AssumedState = S.getAssumed(); 7250 7251 // Make sure the value is not captured (except through "return"), if 7252 // it is, any information derived would be irrelevant anyway as we cannot 7253 // check the potential aliases introduced by the capture. However, no need 7254 // to fall back to anythign less optimistic than the function state. 7255 const auto &ArgNoCaptureAA = 7256 A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::OPTIONAL); 7257 if (!ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) { 7258 S.intersectAssumedBits(FnMemAssumedState); 7259 return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED 7260 : ChangeStatus::UNCHANGED; 7261 } 7262 7263 // Visit and expand uses until all are analyzed or a fixpoint is reached. 7264 auto UsePred = [&](const Use &U, bool &Follow) -> bool { 7265 Instruction *UserI = cast<Instruction>(U.getUser()); 7266 LLVM_DEBUG(dbgs() << "[AAMemoryBehavior] Use: " << *U << " in " << *UserI 7267 << " \n"); 7268 7269 // Droppable users, e.g., llvm::assume does not actually perform any action. 7270 if (UserI->isDroppable()) 7271 return true; 7272 7273 // Check if the users of UserI should also be visited. 7274 Follow = followUsersOfUseIn(A, U, UserI); 7275 7276 // If UserI might touch memory we analyze the use in detail. 7277 if (UserI->mayReadOrWriteMemory()) 7278 analyzeUseIn(A, U, UserI); 7279 7280 return !isAtFixpoint(); 7281 }; 7282 7283 if (!A.checkForAllUses(UsePred, *this, getAssociatedValue())) 7284 return indicatePessimisticFixpoint(); 7285 7286 return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED 7287 : ChangeStatus::UNCHANGED; 7288 } 7289 7290 bool AAMemoryBehaviorFloating::followUsersOfUseIn(Attributor &A, const Use &U, 7291 const Instruction *UserI) { 7292 // The loaded value is unrelated to the pointer argument, no need to 7293 // follow the users of the load. 7294 if (isa<LoadInst>(UserI)) 7295 return false; 7296 7297 // By default we follow all uses assuming UserI might leak information on U, 7298 // we have special handling for call sites operands though. 7299 const auto *CB = dyn_cast<CallBase>(UserI); 7300 if (!CB || !CB->isArgOperand(&U)) 7301 return true; 7302 7303 // If the use is a call argument known not to be captured, the users of 7304 // the call do not need to be visited because they have to be unrelated to 7305 // the input. Note that this check is not trivial even though we disallow 7306 // general capturing of the underlying argument. The reason is that the 7307 // call might the argument "through return", which we allow and for which we 7308 // need to check call users. 7309 if (U.get()->getType()->isPointerTy()) { 7310 unsigned ArgNo = CB->getArgOperandNo(&U); 7311 const auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>( 7312 *this, IRPosition::callsite_argument(*CB, ArgNo), DepClassTy::OPTIONAL); 7313 return !ArgNoCaptureAA.isAssumedNoCapture(); 7314 } 7315 7316 return true; 7317 } 7318 7319 void AAMemoryBehaviorFloating::analyzeUseIn(Attributor &A, const Use &U, 7320 const Instruction *UserI) { 7321 assert(UserI->mayReadOrWriteMemory()); 7322 7323 switch (UserI->getOpcode()) { 7324 default: 7325 // TODO: Handle all atomics and other side-effect operations we know of. 7326 break; 7327 case Instruction::Load: 7328 // Loads cause the NO_READS property to disappear. 7329 removeAssumedBits(NO_READS); 7330 return; 7331 7332 case Instruction::Store: 7333 // Stores cause the NO_WRITES property to disappear if the use is the 7334 // pointer operand. Note that we do assume that capturing was taken care of 7335 // somewhere else. 7336 if (cast<StoreInst>(UserI)->getPointerOperand() == U.get()) 7337 removeAssumedBits(NO_WRITES); 7338 return; 7339 7340 case Instruction::Call: 7341 case Instruction::CallBr: 7342 case Instruction::Invoke: { 7343 // For call sites we look at the argument memory behavior attribute (this 7344 // could be recursive!) in order to restrict our own state. 7345 const auto *CB = cast<CallBase>(UserI); 7346 7347 // Give up on operand bundles. 7348 if (CB->isBundleOperand(&U)) { 7349 indicatePessimisticFixpoint(); 7350 return; 7351 } 7352 7353 // Calling a function does read the function pointer, maybe write it if the 7354 // function is self-modifying. 7355 if (CB->isCallee(&U)) { 7356 removeAssumedBits(NO_READS); 7357 break; 7358 } 7359 7360 // Adjust the possible access behavior based on the information on the 7361 // argument. 7362 IRPosition Pos; 7363 if (U.get()->getType()->isPointerTy()) 7364 Pos = IRPosition::callsite_argument(*CB, CB->getArgOperandNo(&U)); 7365 else 7366 Pos = IRPosition::callsite_function(*CB); 7367 const auto &MemBehaviorAA = 7368 A.getAAFor<AAMemoryBehavior>(*this, Pos, DepClassTy::OPTIONAL); 7369 // "assumed" has at most the same bits as the MemBehaviorAA assumed 7370 // and at least "known". 7371 intersectAssumedBits(MemBehaviorAA.getAssumed()); 7372 return; 7373 } 7374 }; 7375 7376 // Generally, look at the "may-properties" and adjust the assumed state if we 7377 // did not trigger special handling before. 7378 if (UserI->mayReadFromMemory()) 7379 removeAssumedBits(NO_READS); 7380 if (UserI->mayWriteToMemory()) 7381 removeAssumedBits(NO_WRITES); 7382 } 7383 7384 /// -------------------- Memory Locations Attributes --------------------------- 7385 /// Includes read-none, argmemonly, inaccessiblememonly, 7386 /// inaccessiblememorargmemonly 7387 /// ---------------------------------------------------------------------------- 7388 7389 std::string AAMemoryLocation::getMemoryLocationsAsStr( 7390 AAMemoryLocation::MemoryLocationsKind MLK) { 7391 if (0 == (MLK & AAMemoryLocation::NO_LOCATIONS)) 7392 return "all memory"; 7393 if (MLK == AAMemoryLocation::NO_LOCATIONS) 7394 return "no memory"; 7395 std::string S = "memory:"; 7396 if (0 == (MLK & AAMemoryLocation::NO_LOCAL_MEM)) 7397 S += "stack,"; 7398 if (0 == (MLK & AAMemoryLocation::NO_CONST_MEM)) 7399 S += "constant,"; 7400 if (0 == (MLK & AAMemoryLocation::NO_GLOBAL_INTERNAL_MEM)) 7401 S += "internal global,"; 7402 if (0 == (MLK & AAMemoryLocation::NO_GLOBAL_EXTERNAL_MEM)) 7403 S += "external global,"; 7404 if (0 == (MLK & AAMemoryLocation::NO_ARGUMENT_MEM)) 7405 S += "argument,"; 7406 if (0 == (MLK & AAMemoryLocation::NO_INACCESSIBLE_MEM)) 7407 S += "inaccessible,"; 7408 if (0 == (MLK & AAMemoryLocation::NO_MALLOCED_MEM)) 7409 S += "malloced,"; 7410 if (0 == (MLK & AAMemoryLocation::NO_UNKOWN_MEM)) 7411 S += "unknown,"; 7412 S.pop_back(); 7413 return S; 7414 } 7415 7416 namespace { 7417 struct AAMemoryLocationImpl : public AAMemoryLocation { 7418 7419 AAMemoryLocationImpl(const IRPosition &IRP, Attributor &A) 7420 : AAMemoryLocation(IRP, A), Allocator(A.Allocator) { 7421 for (unsigned u = 0; u < llvm::CTLog2<VALID_STATE>(); ++u) 7422 AccessKind2Accesses[u] = nullptr; 7423 } 7424 7425 ~AAMemoryLocationImpl() { 7426 // The AccessSets are allocated via a BumpPtrAllocator, we call 7427 // the destructor manually. 7428 for (unsigned u = 0; u < llvm::CTLog2<VALID_STATE>(); ++u) 7429 if (AccessKind2Accesses[u]) 7430 AccessKind2Accesses[u]->~AccessSet(); 7431 } 7432 7433 /// See AbstractAttribute::initialize(...). 7434 void initialize(Attributor &A) override { 7435 intersectAssumedBits(BEST_STATE); 7436 getKnownStateFromValue(A, getIRPosition(), getState()); 7437 AAMemoryLocation::initialize(A); 7438 } 7439 7440 /// Return the memory behavior information encoded in the IR for \p IRP. 7441 static void getKnownStateFromValue(Attributor &A, const IRPosition &IRP, 7442 BitIntegerState &State, 7443 bool IgnoreSubsumingPositions = false) { 7444 // For internal functions we ignore `argmemonly` and 7445 // `inaccessiblememorargmemonly` as we might break it via interprocedural 7446 // constant propagation. It is unclear if this is the best way but it is 7447 // unlikely this will cause real performance problems. If we are deriving 7448 // attributes for the anchor function we even remove the attribute in 7449 // addition to ignoring it. 7450 bool UseArgMemOnly = true; 7451 Function *AnchorFn = IRP.getAnchorScope(); 7452 if (AnchorFn && A.isRunOn(*AnchorFn)) 7453 UseArgMemOnly = !AnchorFn->hasLocalLinkage(); 7454 7455 SmallVector<Attribute, 2> Attrs; 7456 IRP.getAttrs(AttrKinds, Attrs, IgnoreSubsumingPositions); 7457 for (const Attribute &Attr : Attrs) { 7458 switch (Attr.getKindAsEnum()) { 7459 case Attribute::ReadNone: 7460 State.addKnownBits(NO_LOCAL_MEM | NO_CONST_MEM); 7461 break; 7462 case Attribute::InaccessibleMemOnly: 7463 State.addKnownBits(inverseLocation(NO_INACCESSIBLE_MEM, true, true)); 7464 break; 7465 case Attribute::ArgMemOnly: 7466 if (UseArgMemOnly) 7467 State.addKnownBits(inverseLocation(NO_ARGUMENT_MEM, true, true)); 7468 else 7469 IRP.removeAttrs({Attribute::ArgMemOnly}); 7470 break; 7471 case Attribute::InaccessibleMemOrArgMemOnly: 7472 if (UseArgMemOnly) 7473 State.addKnownBits(inverseLocation( 7474 NO_INACCESSIBLE_MEM | NO_ARGUMENT_MEM, true, true)); 7475 else 7476 IRP.removeAttrs({Attribute::InaccessibleMemOrArgMemOnly}); 7477 break; 7478 default: 7479 llvm_unreachable("Unexpected attribute!"); 7480 } 7481 } 7482 } 7483 7484 /// See AbstractAttribute::getDeducedAttributes(...). 7485 void getDeducedAttributes(LLVMContext &Ctx, 7486 SmallVectorImpl<Attribute> &Attrs) const override { 7487 assert(Attrs.size() == 0); 7488 if (isAssumedReadNone()) { 7489 Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone)); 7490 } else if (getIRPosition().getPositionKind() == IRPosition::IRP_FUNCTION) { 7491 if (isAssumedInaccessibleMemOnly()) 7492 Attrs.push_back(Attribute::get(Ctx, Attribute::InaccessibleMemOnly)); 7493 else if (isAssumedArgMemOnly()) 7494 Attrs.push_back(Attribute::get(Ctx, Attribute::ArgMemOnly)); 7495 else if (isAssumedInaccessibleOrArgMemOnly()) 7496 Attrs.push_back( 7497 Attribute::get(Ctx, Attribute::InaccessibleMemOrArgMemOnly)); 7498 } 7499 assert(Attrs.size() <= 1); 7500 } 7501 7502 /// See AbstractAttribute::manifest(...). 7503 ChangeStatus manifest(Attributor &A) override { 7504 const IRPosition &IRP = getIRPosition(); 7505 7506 // Check if we would improve the existing attributes first. 7507 SmallVector<Attribute, 4> DeducedAttrs; 7508 getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs); 7509 if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) { 7510 return IRP.hasAttr(Attr.getKindAsEnum(), 7511 /* IgnoreSubsumingPositions */ true); 7512 })) 7513 return ChangeStatus::UNCHANGED; 7514 7515 // Clear existing attributes. 7516 IRP.removeAttrs(AttrKinds); 7517 if (isAssumedReadNone()) 7518 IRP.removeAttrs(AAMemoryBehaviorImpl::AttrKinds); 7519 7520 // Use the generic manifest method. 7521 return IRAttribute::manifest(A); 7522 } 7523 7524 /// See AAMemoryLocation::checkForAllAccessesToMemoryKind(...). 7525 bool checkForAllAccessesToMemoryKind( 7526 function_ref<bool(const Instruction *, const Value *, AccessKind, 7527 MemoryLocationsKind)> 7528 Pred, 7529 MemoryLocationsKind RequestedMLK) const override { 7530 if (!isValidState()) 7531 return false; 7532 7533 MemoryLocationsKind AssumedMLK = getAssumedNotAccessedLocation(); 7534 if (AssumedMLK == NO_LOCATIONS) 7535 return true; 7536 7537 unsigned Idx = 0; 7538 for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; 7539 CurMLK *= 2, ++Idx) { 7540 if (CurMLK & RequestedMLK) 7541 continue; 7542 7543 if (const AccessSet *Accesses = AccessKind2Accesses[Idx]) 7544 for (const AccessInfo &AI : *Accesses) 7545 if (!Pred(AI.I, AI.Ptr, AI.Kind, CurMLK)) 7546 return false; 7547 } 7548 7549 return true; 7550 } 7551 7552 ChangeStatus indicatePessimisticFixpoint() override { 7553 // If we give up and indicate a pessimistic fixpoint this instruction will 7554 // become an access for all potential access kinds: 7555 // TODO: Add pointers for argmemonly and globals to improve the results of 7556 // checkForAllAccessesToMemoryKind. 7557 bool Changed = false; 7558 MemoryLocationsKind KnownMLK = getKnown(); 7559 Instruction *I = dyn_cast<Instruction>(&getAssociatedValue()); 7560 for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; CurMLK *= 2) 7561 if (!(CurMLK & KnownMLK)) 7562 updateStateAndAccessesMap(getState(), CurMLK, I, nullptr, Changed, 7563 getAccessKindFromInst(I)); 7564 return AAMemoryLocation::indicatePessimisticFixpoint(); 7565 } 7566 7567 protected: 7568 /// Helper struct to tie together an instruction that has a read or write 7569 /// effect with the pointer it accesses (if any). 7570 struct AccessInfo { 7571 7572 /// The instruction that caused the access. 7573 const Instruction *I; 7574 7575 /// The base pointer that is accessed, or null if unknown. 7576 const Value *Ptr; 7577 7578 /// The kind of access (read/write/read+write). 7579 AccessKind Kind; 7580 7581 bool operator==(const AccessInfo &RHS) const { 7582 return I == RHS.I && Ptr == RHS.Ptr && Kind == RHS.Kind; 7583 } 7584 bool operator()(const AccessInfo &LHS, const AccessInfo &RHS) const { 7585 if (LHS.I != RHS.I) 7586 return LHS.I < RHS.I; 7587 if (LHS.Ptr != RHS.Ptr) 7588 return LHS.Ptr < RHS.Ptr; 7589 if (LHS.Kind != RHS.Kind) 7590 return LHS.Kind < RHS.Kind; 7591 return false; 7592 } 7593 }; 7594 7595 /// Mapping from *single* memory location kinds, e.g., LOCAL_MEM with the 7596 /// value of NO_LOCAL_MEM, to the accesses encountered for this memory kind. 7597 using AccessSet = SmallSet<AccessInfo, 2, AccessInfo>; 7598 AccessSet *AccessKind2Accesses[llvm::CTLog2<VALID_STATE>()]; 7599 7600 /// Categorize the pointer arguments of CB that might access memory in 7601 /// AccessedLoc and update the state and access map accordingly. 7602 void 7603 categorizeArgumentPointerLocations(Attributor &A, CallBase &CB, 7604 AAMemoryLocation::StateType &AccessedLocs, 7605 bool &Changed); 7606 7607 /// Return the kind(s) of location that may be accessed by \p V. 7608 AAMemoryLocation::MemoryLocationsKind 7609 categorizeAccessedLocations(Attributor &A, Instruction &I, bool &Changed); 7610 7611 /// Return the access kind as determined by \p I. 7612 AccessKind getAccessKindFromInst(const Instruction *I) { 7613 AccessKind AK = READ_WRITE; 7614 if (I) { 7615 AK = I->mayReadFromMemory() ? READ : NONE; 7616 AK = AccessKind(AK | (I->mayWriteToMemory() ? WRITE : NONE)); 7617 } 7618 return AK; 7619 } 7620 7621 /// Update the state \p State and the AccessKind2Accesses given that \p I is 7622 /// an access of kind \p AK to a \p MLK memory location with the access 7623 /// pointer \p Ptr. 7624 void updateStateAndAccessesMap(AAMemoryLocation::StateType &State, 7625 MemoryLocationsKind MLK, const Instruction *I, 7626 const Value *Ptr, bool &Changed, 7627 AccessKind AK = READ_WRITE) { 7628 7629 assert(isPowerOf2_32(MLK) && "Expected a single location set!"); 7630 auto *&Accesses = AccessKind2Accesses[llvm::Log2_32(MLK)]; 7631 if (!Accesses) 7632 Accesses = new (Allocator) AccessSet(); 7633 Changed |= Accesses->insert(AccessInfo{I, Ptr, AK}).second; 7634 State.removeAssumedBits(MLK); 7635 } 7636 7637 /// Determine the underlying locations kinds for \p Ptr, e.g., globals or 7638 /// arguments, and update the state and access map accordingly. 7639 void categorizePtrValue(Attributor &A, const Instruction &I, const Value &Ptr, 7640 AAMemoryLocation::StateType &State, bool &Changed); 7641 7642 /// Used to allocate access sets. 7643 BumpPtrAllocator &Allocator; 7644 7645 /// The set of IR attributes AAMemoryLocation deals with. 7646 static const Attribute::AttrKind AttrKinds[4]; 7647 }; 7648 7649 const Attribute::AttrKind AAMemoryLocationImpl::AttrKinds[] = { 7650 Attribute::ReadNone, Attribute::InaccessibleMemOnly, Attribute::ArgMemOnly, 7651 Attribute::InaccessibleMemOrArgMemOnly}; 7652 7653 void AAMemoryLocationImpl::categorizePtrValue( 7654 Attributor &A, const Instruction &I, const Value &Ptr, 7655 AAMemoryLocation::StateType &State, bool &Changed) { 7656 LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize pointer locations for " 7657 << Ptr << " [" 7658 << getMemoryLocationsAsStr(State.getAssumed()) << "]\n"); 7659 7660 SmallVector<Value *, 8> Objects; 7661 if (!AA::getAssumedUnderlyingObjects(A, Ptr, Objects, *this, &I)) { 7662 LLVM_DEBUG( 7663 dbgs() << "[AAMemoryLocation] Pointer locations not categorized\n"); 7664 updateStateAndAccessesMap(State, NO_UNKOWN_MEM, &I, nullptr, Changed, 7665 getAccessKindFromInst(&I)); 7666 return; 7667 } 7668 7669 for (Value *Obj : Objects) { 7670 // TODO: recognize the TBAA used for constant accesses. 7671 MemoryLocationsKind MLK = NO_LOCATIONS; 7672 assert(!isa<GEPOperator>(Obj) && "GEPs should have been stripped."); 7673 if (isa<UndefValue>(Obj)) 7674 continue; 7675 if (auto *Arg = dyn_cast<Argument>(Obj)) { 7676 if (Arg->hasByValAttr()) 7677 MLK = NO_LOCAL_MEM; 7678 else 7679 MLK = NO_ARGUMENT_MEM; 7680 } else if (auto *GV = dyn_cast<GlobalValue>(Obj)) { 7681 // Reading constant memory is not treated as a read "effect" by the 7682 // function attr pass so we won't neither. Constants defined by TBAA are 7683 // similar. (We know we do not write it because it is constant.) 7684 if (auto *GVar = dyn_cast<GlobalVariable>(GV)) 7685 if (GVar->isConstant()) 7686 continue; 7687 7688 if (GV->hasLocalLinkage()) 7689 MLK = NO_GLOBAL_INTERNAL_MEM; 7690 else 7691 MLK = NO_GLOBAL_EXTERNAL_MEM; 7692 } else if (isa<ConstantPointerNull>(Obj) && 7693 !NullPointerIsDefined(getAssociatedFunction(), 7694 Ptr.getType()->getPointerAddressSpace())) { 7695 continue; 7696 } else if (isa<AllocaInst>(Obj)) { 7697 MLK = NO_LOCAL_MEM; 7698 } else if (const auto *CB = dyn_cast<CallBase>(Obj)) { 7699 const auto &NoAliasAA = A.getAAFor<AANoAlias>( 7700 *this, IRPosition::callsite_returned(*CB), DepClassTy::OPTIONAL); 7701 if (NoAliasAA.isAssumedNoAlias()) 7702 MLK = NO_MALLOCED_MEM; 7703 else 7704 MLK = NO_UNKOWN_MEM; 7705 } else { 7706 MLK = NO_UNKOWN_MEM; 7707 } 7708 7709 assert(MLK != NO_LOCATIONS && "No location specified!"); 7710 LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Ptr value can be categorized: " 7711 << *Obj << " -> " << getMemoryLocationsAsStr(MLK) 7712 << "\n"); 7713 updateStateAndAccessesMap(getState(), MLK, &I, Obj, Changed, 7714 getAccessKindFromInst(&I)); 7715 } 7716 7717 LLVM_DEBUG( 7718 dbgs() << "[AAMemoryLocation] Accessed locations with pointer locations: " 7719 << getMemoryLocationsAsStr(State.getAssumed()) << "\n"); 7720 } 7721 7722 void AAMemoryLocationImpl::categorizeArgumentPointerLocations( 7723 Attributor &A, CallBase &CB, AAMemoryLocation::StateType &AccessedLocs, 7724 bool &Changed) { 7725 for (unsigned ArgNo = 0, E = CB.getNumArgOperands(); ArgNo < E; ++ArgNo) { 7726 7727 // Skip non-pointer arguments. 7728 const Value *ArgOp = CB.getArgOperand(ArgNo); 7729 if (!ArgOp->getType()->isPtrOrPtrVectorTy()) 7730 continue; 7731 7732 // Skip readnone arguments. 7733 const IRPosition &ArgOpIRP = IRPosition::callsite_argument(CB, ArgNo); 7734 const auto &ArgOpMemLocationAA = 7735 A.getAAFor<AAMemoryBehavior>(*this, ArgOpIRP, DepClassTy::OPTIONAL); 7736 7737 if (ArgOpMemLocationAA.isAssumedReadNone()) 7738 continue; 7739 7740 // Categorize potentially accessed pointer arguments as if there was an 7741 // access instruction with them as pointer. 7742 categorizePtrValue(A, CB, *ArgOp, AccessedLocs, Changed); 7743 } 7744 } 7745 7746 AAMemoryLocation::MemoryLocationsKind 7747 AAMemoryLocationImpl::categorizeAccessedLocations(Attributor &A, Instruction &I, 7748 bool &Changed) { 7749 LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize accessed locations for " 7750 << I << "\n"); 7751 7752 AAMemoryLocation::StateType AccessedLocs; 7753 AccessedLocs.intersectAssumedBits(NO_LOCATIONS); 7754 7755 if (auto *CB = dyn_cast<CallBase>(&I)) { 7756 7757 // First check if we assume any memory is access is visible. 7758 const auto &CBMemLocationAA = A.getAAFor<AAMemoryLocation>( 7759 *this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL); 7760 LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Categorize call site: " << I 7761 << " [" << CBMemLocationAA << "]\n"); 7762 7763 if (CBMemLocationAA.isAssumedReadNone()) 7764 return NO_LOCATIONS; 7765 7766 if (CBMemLocationAA.isAssumedInaccessibleMemOnly()) { 7767 updateStateAndAccessesMap(AccessedLocs, NO_INACCESSIBLE_MEM, &I, nullptr, 7768 Changed, getAccessKindFromInst(&I)); 7769 return AccessedLocs.getAssumed(); 7770 } 7771 7772 uint32_t CBAssumedNotAccessedLocs = 7773 CBMemLocationAA.getAssumedNotAccessedLocation(); 7774 7775 // Set the argmemonly and global bit as we handle them separately below. 7776 uint32_t CBAssumedNotAccessedLocsNoArgMem = 7777 CBAssumedNotAccessedLocs | NO_ARGUMENT_MEM | NO_GLOBAL_MEM; 7778 7779 for (MemoryLocationsKind CurMLK = 1; CurMLK < NO_LOCATIONS; CurMLK *= 2) { 7780 if (CBAssumedNotAccessedLocsNoArgMem & CurMLK) 7781 continue; 7782 updateStateAndAccessesMap(AccessedLocs, CurMLK, &I, nullptr, Changed, 7783 getAccessKindFromInst(&I)); 7784 } 7785 7786 // Now handle global memory if it might be accessed. This is slightly tricky 7787 // as NO_GLOBAL_MEM has multiple bits set. 7788 bool HasGlobalAccesses = ((~CBAssumedNotAccessedLocs) & NO_GLOBAL_MEM); 7789 if (HasGlobalAccesses) { 7790 auto AccessPred = [&](const Instruction *, const Value *Ptr, 7791 AccessKind Kind, MemoryLocationsKind MLK) { 7792 updateStateAndAccessesMap(AccessedLocs, MLK, &I, Ptr, Changed, 7793 getAccessKindFromInst(&I)); 7794 return true; 7795 }; 7796 if (!CBMemLocationAA.checkForAllAccessesToMemoryKind( 7797 AccessPred, inverseLocation(NO_GLOBAL_MEM, false, false))) 7798 return AccessedLocs.getWorstState(); 7799 } 7800 7801 LLVM_DEBUG( 7802 dbgs() << "[AAMemoryLocation] Accessed state before argument handling: " 7803 << getMemoryLocationsAsStr(AccessedLocs.getAssumed()) << "\n"); 7804 7805 // Now handle argument memory if it might be accessed. 7806 bool HasArgAccesses = ((~CBAssumedNotAccessedLocs) & NO_ARGUMENT_MEM); 7807 if (HasArgAccesses) 7808 categorizeArgumentPointerLocations(A, *CB, AccessedLocs, Changed); 7809 7810 LLVM_DEBUG( 7811 dbgs() << "[AAMemoryLocation] Accessed state after argument handling: " 7812 << getMemoryLocationsAsStr(AccessedLocs.getAssumed()) << "\n"); 7813 7814 return AccessedLocs.getAssumed(); 7815 } 7816 7817 if (const Value *Ptr = getPointerOperand(&I, /* AllowVolatile */ true)) { 7818 LLVM_DEBUG( 7819 dbgs() << "[AAMemoryLocation] Categorize memory access with pointer: " 7820 << I << " [" << *Ptr << "]\n"); 7821 categorizePtrValue(A, I, *Ptr, AccessedLocs, Changed); 7822 return AccessedLocs.getAssumed(); 7823 } 7824 7825 LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Failed to categorize instruction: " 7826 << I << "\n"); 7827 updateStateAndAccessesMap(AccessedLocs, NO_UNKOWN_MEM, &I, nullptr, Changed, 7828 getAccessKindFromInst(&I)); 7829 return AccessedLocs.getAssumed(); 7830 } 7831 7832 /// An AA to represent the memory behavior function attributes. 7833 struct AAMemoryLocationFunction final : public AAMemoryLocationImpl { 7834 AAMemoryLocationFunction(const IRPosition &IRP, Attributor &A) 7835 : AAMemoryLocationImpl(IRP, A) {} 7836 7837 /// See AbstractAttribute::updateImpl(Attributor &A). 7838 virtual ChangeStatus updateImpl(Attributor &A) override { 7839 7840 const auto &MemBehaviorAA = 7841 A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE); 7842 if (MemBehaviorAA.isAssumedReadNone()) { 7843 if (MemBehaviorAA.isKnownReadNone()) 7844 return indicateOptimisticFixpoint(); 7845 assert(isAssumedReadNone() && 7846 "AAMemoryLocation was not read-none but AAMemoryBehavior was!"); 7847 A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL); 7848 return ChangeStatus::UNCHANGED; 7849 } 7850 7851 // The current assumed state used to determine a change. 7852 auto AssumedState = getAssumed(); 7853 bool Changed = false; 7854 7855 auto CheckRWInst = [&](Instruction &I) { 7856 MemoryLocationsKind MLK = categorizeAccessedLocations(A, I, Changed); 7857 LLVM_DEBUG(dbgs() << "[AAMemoryLocation] Accessed locations for " << I 7858 << ": " << getMemoryLocationsAsStr(MLK) << "\n"); 7859 removeAssumedBits(inverseLocation(MLK, false, false)); 7860 // Stop once only the valid bit set in the *not assumed location*, thus 7861 // once we don't actually exclude any memory locations in the state. 7862 return getAssumedNotAccessedLocation() != VALID_STATE; 7863 }; 7864 7865 bool UsedAssumedInformation = false; 7866 if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this, 7867 UsedAssumedInformation)) 7868 return indicatePessimisticFixpoint(); 7869 7870 Changed |= AssumedState != getAssumed(); 7871 return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED; 7872 } 7873 7874 /// See AbstractAttribute::trackStatistics() 7875 void trackStatistics() const override { 7876 if (isAssumedReadNone()) 7877 STATS_DECLTRACK_FN_ATTR(readnone) 7878 else if (isAssumedArgMemOnly()) 7879 STATS_DECLTRACK_FN_ATTR(argmemonly) 7880 else if (isAssumedInaccessibleMemOnly()) 7881 STATS_DECLTRACK_FN_ATTR(inaccessiblememonly) 7882 else if (isAssumedInaccessibleOrArgMemOnly()) 7883 STATS_DECLTRACK_FN_ATTR(inaccessiblememorargmemonly) 7884 } 7885 }; 7886 7887 /// AAMemoryLocation attribute for call sites. 7888 struct AAMemoryLocationCallSite final : AAMemoryLocationImpl { 7889 AAMemoryLocationCallSite(const IRPosition &IRP, Attributor &A) 7890 : AAMemoryLocationImpl(IRP, A) {} 7891 7892 /// See AbstractAttribute::initialize(...). 7893 void initialize(Attributor &A) override { 7894 AAMemoryLocationImpl::initialize(A); 7895 Function *F = getAssociatedFunction(); 7896 if (!F || F->isDeclaration()) 7897 indicatePessimisticFixpoint(); 7898 } 7899 7900 /// See AbstractAttribute::updateImpl(...). 7901 ChangeStatus updateImpl(Attributor &A) override { 7902 // TODO: Once we have call site specific value information we can provide 7903 // call site specific liveness liveness information and then it makes 7904 // sense to specialize attributes for call sites arguments instead of 7905 // redirecting requests to the callee argument. 7906 Function *F = getAssociatedFunction(); 7907 const IRPosition &FnPos = IRPosition::function(*F); 7908 auto &FnAA = 7909 A.getAAFor<AAMemoryLocation>(*this, FnPos, DepClassTy::REQUIRED); 7910 bool Changed = false; 7911 auto AccessPred = [&](const Instruction *I, const Value *Ptr, 7912 AccessKind Kind, MemoryLocationsKind MLK) { 7913 updateStateAndAccessesMap(getState(), MLK, I, Ptr, Changed, 7914 getAccessKindFromInst(I)); 7915 return true; 7916 }; 7917 if (!FnAA.checkForAllAccessesToMemoryKind(AccessPred, ALL_LOCATIONS)) 7918 return indicatePessimisticFixpoint(); 7919 return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED; 7920 } 7921 7922 /// See AbstractAttribute::trackStatistics() 7923 void trackStatistics() const override { 7924 if (isAssumedReadNone()) 7925 STATS_DECLTRACK_CS_ATTR(readnone) 7926 } 7927 }; 7928 7929 /// ------------------ Value Constant Range Attribute ------------------------- 7930 7931 struct AAValueConstantRangeImpl : AAValueConstantRange { 7932 using StateType = IntegerRangeState; 7933 AAValueConstantRangeImpl(const IRPosition &IRP, Attributor &A) 7934 : AAValueConstantRange(IRP, A) {} 7935 7936 /// See AbstractAttribute::initialize(..). 7937 void initialize(Attributor &A) override { 7938 if (A.hasSimplificationCallback(getIRPosition())) { 7939 indicatePessimisticFixpoint(); 7940 return; 7941 } 7942 7943 // Intersect a range given by SCEV. 7944 intersectKnown(getConstantRangeFromSCEV(A, getCtxI())); 7945 7946 // Intersect a range given by LVI. 7947 intersectKnown(getConstantRangeFromLVI(A, getCtxI())); 7948 } 7949 7950 /// See AbstractAttribute::getAsStr(). 7951 const std::string getAsStr() const override { 7952 std::string Str; 7953 llvm::raw_string_ostream OS(Str); 7954 OS << "range(" << getBitWidth() << ")<"; 7955 getKnown().print(OS); 7956 OS << " / "; 7957 getAssumed().print(OS); 7958 OS << ">"; 7959 return OS.str(); 7960 } 7961 7962 /// Helper function to get a SCEV expr for the associated value at program 7963 /// point \p I. 7964 const SCEV *getSCEV(Attributor &A, const Instruction *I = nullptr) const { 7965 if (!getAnchorScope()) 7966 return nullptr; 7967 7968 ScalarEvolution *SE = 7969 A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>( 7970 *getAnchorScope()); 7971 7972 LoopInfo *LI = A.getInfoCache().getAnalysisResultForFunction<LoopAnalysis>( 7973 *getAnchorScope()); 7974 7975 if (!SE || !LI) 7976 return nullptr; 7977 7978 const SCEV *S = SE->getSCEV(&getAssociatedValue()); 7979 if (!I) 7980 return S; 7981 7982 return SE->getSCEVAtScope(S, LI->getLoopFor(I->getParent())); 7983 } 7984 7985 /// Helper function to get a range from SCEV for the associated value at 7986 /// program point \p I. 7987 ConstantRange getConstantRangeFromSCEV(Attributor &A, 7988 const Instruction *I = nullptr) const { 7989 if (!getAnchorScope()) 7990 return getWorstState(getBitWidth()); 7991 7992 ScalarEvolution *SE = 7993 A.getInfoCache().getAnalysisResultForFunction<ScalarEvolutionAnalysis>( 7994 *getAnchorScope()); 7995 7996 const SCEV *S = getSCEV(A, I); 7997 if (!SE || !S) 7998 return getWorstState(getBitWidth()); 7999 8000 return SE->getUnsignedRange(S); 8001 } 8002 8003 /// Helper function to get a range from LVI for the associated value at 8004 /// program point \p I. 8005 ConstantRange 8006 getConstantRangeFromLVI(Attributor &A, 8007 const Instruction *CtxI = nullptr) const { 8008 if (!getAnchorScope()) 8009 return getWorstState(getBitWidth()); 8010 8011 LazyValueInfo *LVI = 8012 A.getInfoCache().getAnalysisResultForFunction<LazyValueAnalysis>( 8013 *getAnchorScope()); 8014 8015 if (!LVI || !CtxI) 8016 return getWorstState(getBitWidth()); 8017 return LVI->getConstantRange(&getAssociatedValue(), 8018 const_cast<Instruction *>(CtxI)); 8019 } 8020 8021 /// Return true if \p CtxI is valid for querying outside analyses. 8022 /// This basically makes sure we do not ask intra-procedural analysis 8023 /// about a context in the wrong function or a context that violates 8024 /// dominance assumptions they might have. The \p AllowAACtxI flag indicates 8025 /// if the original context of this AA is OK or should be considered invalid. 8026 bool isValidCtxInstructionForOutsideAnalysis(Attributor &A, 8027 const Instruction *CtxI, 8028 bool AllowAACtxI) const { 8029 if (!CtxI || (!AllowAACtxI && CtxI == getCtxI())) 8030 return false; 8031 8032 // Our context might be in a different function, neither intra-procedural 8033 // analysis (ScalarEvolution nor LazyValueInfo) can handle that. 8034 if (!AA::isValidInScope(getAssociatedValue(), CtxI->getFunction())) 8035 return false; 8036 8037 // If the context is not dominated by the value there are paths to the 8038 // context that do not define the value. This cannot be handled by 8039 // LazyValueInfo so we need to bail. 8040 if (auto *I = dyn_cast<Instruction>(&getAssociatedValue())) { 8041 InformationCache &InfoCache = A.getInfoCache(); 8042 const DominatorTree *DT = 8043 InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>( 8044 *I->getFunction()); 8045 return DT && DT->dominates(I, CtxI); 8046 } 8047 8048 return true; 8049 } 8050 8051 /// See AAValueConstantRange::getKnownConstantRange(..). 8052 ConstantRange 8053 getKnownConstantRange(Attributor &A, 8054 const Instruction *CtxI = nullptr) const override { 8055 if (!isValidCtxInstructionForOutsideAnalysis(A, CtxI, 8056 /* AllowAACtxI */ false)) 8057 return getKnown(); 8058 8059 ConstantRange LVIR = getConstantRangeFromLVI(A, CtxI); 8060 ConstantRange SCEVR = getConstantRangeFromSCEV(A, CtxI); 8061 return getKnown().intersectWith(SCEVR).intersectWith(LVIR); 8062 } 8063 8064 /// See AAValueConstantRange::getAssumedConstantRange(..). 8065 ConstantRange 8066 getAssumedConstantRange(Attributor &A, 8067 const Instruction *CtxI = nullptr) const override { 8068 // TODO: Make SCEV use Attributor assumption. 8069 // We may be able to bound a variable range via assumptions in 8070 // Attributor. ex.) If x is assumed to be in [1, 3] and y is known to 8071 // evolve to x^2 + x, then we can say that y is in [2, 12]. 8072 if (!isValidCtxInstructionForOutsideAnalysis(A, CtxI, 8073 /* AllowAACtxI */ false)) 8074 return getAssumed(); 8075 8076 ConstantRange LVIR = getConstantRangeFromLVI(A, CtxI); 8077 ConstantRange SCEVR = getConstantRangeFromSCEV(A, CtxI); 8078 return getAssumed().intersectWith(SCEVR).intersectWith(LVIR); 8079 } 8080 8081 /// Helper function to create MDNode for range metadata. 8082 static MDNode * 8083 getMDNodeForConstantRange(Type *Ty, LLVMContext &Ctx, 8084 const ConstantRange &AssumedConstantRange) { 8085 Metadata *LowAndHigh[] = {ConstantAsMetadata::get(ConstantInt::get( 8086 Ty, AssumedConstantRange.getLower())), 8087 ConstantAsMetadata::get(ConstantInt::get( 8088 Ty, AssumedConstantRange.getUpper()))}; 8089 return MDNode::get(Ctx, LowAndHigh); 8090 } 8091 8092 /// Return true if \p Assumed is included in \p KnownRanges. 8093 static bool isBetterRange(const ConstantRange &Assumed, MDNode *KnownRanges) { 8094 8095 if (Assumed.isFullSet()) 8096 return false; 8097 8098 if (!KnownRanges) 8099 return true; 8100 8101 // If multiple ranges are annotated in IR, we give up to annotate assumed 8102 // range for now. 8103 8104 // TODO: If there exists a known range which containts assumed range, we 8105 // can say assumed range is better. 8106 if (KnownRanges->getNumOperands() > 2) 8107 return false; 8108 8109 ConstantInt *Lower = 8110 mdconst::extract<ConstantInt>(KnownRanges->getOperand(0)); 8111 ConstantInt *Upper = 8112 mdconst::extract<ConstantInt>(KnownRanges->getOperand(1)); 8113 8114 ConstantRange Known(Lower->getValue(), Upper->getValue()); 8115 return Known.contains(Assumed) && Known != Assumed; 8116 } 8117 8118 /// Helper function to set range metadata. 8119 static bool 8120 setRangeMetadataIfisBetterRange(Instruction *I, 8121 const ConstantRange &AssumedConstantRange) { 8122 auto *OldRangeMD = I->getMetadata(LLVMContext::MD_range); 8123 if (isBetterRange(AssumedConstantRange, OldRangeMD)) { 8124 if (!AssumedConstantRange.isEmptySet()) { 8125 I->setMetadata(LLVMContext::MD_range, 8126 getMDNodeForConstantRange(I->getType(), I->getContext(), 8127 AssumedConstantRange)); 8128 return true; 8129 } 8130 } 8131 return false; 8132 } 8133 8134 /// See AbstractAttribute::manifest() 8135 ChangeStatus manifest(Attributor &A) override { 8136 ChangeStatus Changed = ChangeStatus::UNCHANGED; 8137 ConstantRange AssumedConstantRange = getAssumedConstantRange(A); 8138 assert(!AssumedConstantRange.isFullSet() && "Invalid state"); 8139 8140 auto &V = getAssociatedValue(); 8141 if (!AssumedConstantRange.isEmptySet() && 8142 !AssumedConstantRange.isSingleElement()) { 8143 if (Instruction *I = dyn_cast<Instruction>(&V)) { 8144 assert(I == getCtxI() && "Should not annotate an instruction which is " 8145 "not the context instruction"); 8146 if (isa<CallInst>(I) || isa<LoadInst>(I)) 8147 if (setRangeMetadataIfisBetterRange(I, AssumedConstantRange)) 8148 Changed = ChangeStatus::CHANGED; 8149 } 8150 } 8151 8152 return Changed; 8153 } 8154 }; 8155 8156 struct AAValueConstantRangeArgument final 8157 : AAArgumentFromCallSiteArguments< 8158 AAValueConstantRange, AAValueConstantRangeImpl, IntegerRangeState, 8159 true /* BridgeCallBaseContext */> { 8160 using Base = AAArgumentFromCallSiteArguments< 8161 AAValueConstantRange, AAValueConstantRangeImpl, IntegerRangeState, 8162 true /* BridgeCallBaseContext */>; 8163 AAValueConstantRangeArgument(const IRPosition &IRP, Attributor &A) 8164 : Base(IRP, A) {} 8165 8166 /// See AbstractAttribute::initialize(..). 8167 void initialize(Attributor &A) override { 8168 if (!getAnchorScope() || getAnchorScope()->isDeclaration()) { 8169 indicatePessimisticFixpoint(); 8170 } else { 8171 Base::initialize(A); 8172 } 8173 } 8174 8175 /// See AbstractAttribute::trackStatistics() 8176 void trackStatistics() const override { 8177 STATS_DECLTRACK_ARG_ATTR(value_range) 8178 } 8179 }; 8180 8181 struct AAValueConstantRangeReturned 8182 : AAReturnedFromReturnedValues<AAValueConstantRange, 8183 AAValueConstantRangeImpl, 8184 AAValueConstantRangeImpl::StateType, 8185 /* PropogateCallBaseContext */ true> { 8186 using Base = 8187 AAReturnedFromReturnedValues<AAValueConstantRange, 8188 AAValueConstantRangeImpl, 8189 AAValueConstantRangeImpl::StateType, 8190 /* PropogateCallBaseContext */ true>; 8191 AAValueConstantRangeReturned(const IRPosition &IRP, Attributor &A) 8192 : Base(IRP, A) {} 8193 8194 /// See AbstractAttribute::initialize(...). 8195 void initialize(Attributor &A) override {} 8196 8197 /// See AbstractAttribute::trackStatistics() 8198 void trackStatistics() const override { 8199 STATS_DECLTRACK_FNRET_ATTR(value_range) 8200 } 8201 }; 8202 8203 struct AAValueConstantRangeFloating : AAValueConstantRangeImpl { 8204 AAValueConstantRangeFloating(const IRPosition &IRP, Attributor &A) 8205 : AAValueConstantRangeImpl(IRP, A) {} 8206 8207 /// See AbstractAttribute::initialize(...). 8208 void initialize(Attributor &A) override { 8209 AAValueConstantRangeImpl::initialize(A); 8210 if (isAtFixpoint()) 8211 return; 8212 8213 Value &V = getAssociatedValue(); 8214 8215 if (auto *C = dyn_cast<ConstantInt>(&V)) { 8216 unionAssumed(ConstantRange(C->getValue())); 8217 indicateOptimisticFixpoint(); 8218 return; 8219 } 8220 8221 if (isa<UndefValue>(&V)) { 8222 // Collapse the undef state to 0. 8223 unionAssumed(ConstantRange(APInt(getBitWidth(), 0))); 8224 indicateOptimisticFixpoint(); 8225 return; 8226 } 8227 8228 if (isa<CallBase>(&V)) 8229 return; 8230 8231 if (isa<BinaryOperator>(&V) || isa<CmpInst>(&V) || isa<CastInst>(&V)) 8232 return; 8233 8234 // If it is a load instruction with range metadata, use it. 8235 if (LoadInst *LI = dyn_cast<LoadInst>(&V)) 8236 if (auto *RangeMD = LI->getMetadata(LLVMContext::MD_range)) { 8237 intersectKnown(getConstantRangeFromMetadata(*RangeMD)); 8238 return; 8239 } 8240 8241 // We can work with PHI and select instruction as we traverse their operands 8242 // during update. 8243 if (isa<SelectInst>(V) || isa<PHINode>(V)) 8244 return; 8245 8246 // Otherwise we give up. 8247 indicatePessimisticFixpoint(); 8248 8249 LLVM_DEBUG(dbgs() << "[AAValueConstantRange] We give up: " 8250 << getAssociatedValue() << "\n"); 8251 } 8252 8253 bool calculateBinaryOperator( 8254 Attributor &A, BinaryOperator *BinOp, IntegerRangeState &T, 8255 const Instruction *CtxI, 8256 SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) { 8257 Value *LHS = BinOp->getOperand(0); 8258 Value *RHS = BinOp->getOperand(1); 8259 8260 // Simplify the operands first. 8261 bool UsedAssumedInformation = false; 8262 const auto &SimplifiedLHS = 8263 A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()), 8264 *this, UsedAssumedInformation); 8265 if (!SimplifiedLHS.hasValue()) 8266 return true; 8267 if (!SimplifiedLHS.getValue()) 8268 return false; 8269 LHS = *SimplifiedLHS; 8270 8271 const auto &SimplifiedRHS = 8272 A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()), 8273 *this, UsedAssumedInformation); 8274 if (!SimplifiedRHS.hasValue()) 8275 return true; 8276 if (!SimplifiedRHS.getValue()) 8277 return false; 8278 RHS = *SimplifiedRHS; 8279 8280 // TODO: Allow non integers as well. 8281 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy()) 8282 return false; 8283 8284 auto &LHSAA = A.getAAFor<AAValueConstantRange>( 8285 *this, IRPosition::value(*LHS, getCallBaseContext()), 8286 DepClassTy::REQUIRED); 8287 QuerriedAAs.push_back(&LHSAA); 8288 auto LHSAARange = LHSAA.getAssumedConstantRange(A, CtxI); 8289 8290 auto &RHSAA = A.getAAFor<AAValueConstantRange>( 8291 *this, IRPosition::value(*RHS, getCallBaseContext()), 8292 DepClassTy::REQUIRED); 8293 QuerriedAAs.push_back(&RHSAA); 8294 auto RHSAARange = RHSAA.getAssumedConstantRange(A, CtxI); 8295 8296 auto AssumedRange = LHSAARange.binaryOp(BinOp->getOpcode(), RHSAARange); 8297 8298 T.unionAssumed(AssumedRange); 8299 8300 // TODO: Track a known state too. 8301 8302 return T.isValidState(); 8303 } 8304 8305 bool calculateCastInst( 8306 Attributor &A, CastInst *CastI, IntegerRangeState &T, 8307 const Instruction *CtxI, 8308 SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) { 8309 assert(CastI->getNumOperands() == 1 && "Expected cast to be unary!"); 8310 // TODO: Allow non integers as well. 8311 Value *OpV = CastI->getOperand(0); 8312 8313 // Simplify the operand first. 8314 bool UsedAssumedInformation = false; 8315 const auto &SimplifiedOpV = 8316 A.getAssumedSimplified(IRPosition::value(*OpV, getCallBaseContext()), 8317 *this, UsedAssumedInformation); 8318 if (!SimplifiedOpV.hasValue()) 8319 return true; 8320 if (!SimplifiedOpV.getValue()) 8321 return false; 8322 OpV = *SimplifiedOpV; 8323 8324 if (!OpV->getType()->isIntegerTy()) 8325 return false; 8326 8327 auto &OpAA = A.getAAFor<AAValueConstantRange>( 8328 *this, IRPosition::value(*OpV, getCallBaseContext()), 8329 DepClassTy::REQUIRED); 8330 QuerriedAAs.push_back(&OpAA); 8331 T.unionAssumed( 8332 OpAA.getAssumed().castOp(CastI->getOpcode(), getState().getBitWidth())); 8333 return T.isValidState(); 8334 } 8335 8336 bool 8337 calculateCmpInst(Attributor &A, CmpInst *CmpI, IntegerRangeState &T, 8338 const Instruction *CtxI, 8339 SmallVectorImpl<const AAValueConstantRange *> &QuerriedAAs) { 8340 Value *LHS = CmpI->getOperand(0); 8341 Value *RHS = CmpI->getOperand(1); 8342 8343 // Simplify the operands first. 8344 bool UsedAssumedInformation = false; 8345 const auto &SimplifiedLHS = 8346 A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()), 8347 *this, UsedAssumedInformation); 8348 if (!SimplifiedLHS.hasValue()) 8349 return true; 8350 if (!SimplifiedLHS.getValue()) 8351 return false; 8352 LHS = *SimplifiedLHS; 8353 8354 const auto &SimplifiedRHS = 8355 A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()), 8356 *this, UsedAssumedInformation); 8357 if (!SimplifiedRHS.hasValue()) 8358 return true; 8359 if (!SimplifiedRHS.getValue()) 8360 return false; 8361 RHS = *SimplifiedRHS; 8362 8363 // TODO: Allow non integers as well. 8364 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy()) 8365 return false; 8366 8367 auto &LHSAA = A.getAAFor<AAValueConstantRange>( 8368 *this, IRPosition::value(*LHS, getCallBaseContext()), 8369 DepClassTy::REQUIRED); 8370 QuerriedAAs.push_back(&LHSAA); 8371 auto &RHSAA = A.getAAFor<AAValueConstantRange>( 8372 *this, IRPosition::value(*RHS, getCallBaseContext()), 8373 DepClassTy::REQUIRED); 8374 QuerriedAAs.push_back(&RHSAA); 8375 auto LHSAARange = LHSAA.getAssumedConstantRange(A, CtxI); 8376 auto RHSAARange = RHSAA.getAssumedConstantRange(A, CtxI); 8377 8378 // If one of them is empty set, we can't decide. 8379 if (LHSAARange.isEmptySet() || RHSAARange.isEmptySet()) 8380 return true; 8381 8382 bool MustTrue = false, MustFalse = false; 8383 8384 auto AllowedRegion = 8385 ConstantRange::makeAllowedICmpRegion(CmpI->getPredicate(), RHSAARange); 8386 8387 if (AllowedRegion.intersectWith(LHSAARange).isEmptySet()) 8388 MustFalse = true; 8389 8390 if (LHSAARange.icmp(CmpI->getPredicate(), RHSAARange)) 8391 MustTrue = true; 8392 8393 assert((!MustTrue || !MustFalse) && 8394 "Either MustTrue or MustFalse should be false!"); 8395 8396 if (MustTrue) 8397 T.unionAssumed(ConstantRange(APInt(/* numBits */ 1, /* val */ 1))); 8398 else if (MustFalse) 8399 T.unionAssumed(ConstantRange(APInt(/* numBits */ 1, /* val */ 0))); 8400 else 8401 T.unionAssumed(ConstantRange(/* BitWidth */ 1, /* isFullSet */ true)); 8402 8403 LLVM_DEBUG(dbgs() << "[AAValueConstantRange] " << *CmpI << " " << LHSAA 8404 << " " << RHSAA << "\n"); 8405 8406 // TODO: Track a known state too. 8407 return T.isValidState(); 8408 } 8409 8410 /// See AbstractAttribute::updateImpl(...). 8411 ChangeStatus updateImpl(Attributor &A) override { 8412 auto VisitValueCB = [&](Value &V, const Instruction *CtxI, 8413 IntegerRangeState &T, bool Stripped) -> bool { 8414 Instruction *I = dyn_cast<Instruction>(&V); 8415 if (!I || isa<CallBase>(I)) { 8416 8417 // Simplify the operand first. 8418 bool UsedAssumedInformation = false; 8419 const auto &SimplifiedOpV = 8420 A.getAssumedSimplified(IRPosition::value(V, getCallBaseContext()), 8421 *this, UsedAssumedInformation); 8422 if (!SimplifiedOpV.hasValue()) 8423 return true; 8424 if (!SimplifiedOpV.getValue()) 8425 return false; 8426 Value *VPtr = *SimplifiedOpV; 8427 8428 // If the value is not instruction, we query AA to Attributor. 8429 const auto &AA = A.getAAFor<AAValueConstantRange>( 8430 *this, IRPosition::value(*VPtr, getCallBaseContext()), 8431 DepClassTy::REQUIRED); 8432 8433 // Clamp operator is not used to utilize a program point CtxI. 8434 T.unionAssumed(AA.getAssumedConstantRange(A, CtxI)); 8435 8436 return T.isValidState(); 8437 } 8438 8439 SmallVector<const AAValueConstantRange *, 4> QuerriedAAs; 8440 if (auto *BinOp = dyn_cast<BinaryOperator>(I)) { 8441 if (!calculateBinaryOperator(A, BinOp, T, CtxI, QuerriedAAs)) 8442 return false; 8443 } else if (auto *CmpI = dyn_cast<CmpInst>(I)) { 8444 if (!calculateCmpInst(A, CmpI, T, CtxI, QuerriedAAs)) 8445 return false; 8446 } else if (auto *CastI = dyn_cast<CastInst>(I)) { 8447 if (!calculateCastInst(A, CastI, T, CtxI, QuerriedAAs)) 8448 return false; 8449 } else { 8450 // Give up with other instructions. 8451 // TODO: Add other instructions 8452 8453 T.indicatePessimisticFixpoint(); 8454 return false; 8455 } 8456 8457 // Catch circular reasoning in a pessimistic way for now. 8458 // TODO: Check how the range evolves and if we stripped anything, see also 8459 // AADereferenceable or AAAlign for similar situations. 8460 for (const AAValueConstantRange *QueriedAA : QuerriedAAs) { 8461 if (QueriedAA != this) 8462 continue; 8463 // If we are in a stady state we do not need to worry. 8464 if (T.getAssumed() == getState().getAssumed()) 8465 continue; 8466 T.indicatePessimisticFixpoint(); 8467 } 8468 8469 return T.isValidState(); 8470 }; 8471 8472 IntegerRangeState T(getBitWidth()); 8473 8474 if (!genericValueTraversal<IntegerRangeState>(A, getIRPosition(), *this, T, 8475 VisitValueCB, getCtxI(), 8476 /* UseValueSimplify */ false)) 8477 return indicatePessimisticFixpoint(); 8478 8479 return clampStateAndIndicateChange(getState(), T); 8480 } 8481 8482 /// See AbstractAttribute::trackStatistics() 8483 void trackStatistics() const override { 8484 STATS_DECLTRACK_FLOATING_ATTR(value_range) 8485 } 8486 }; 8487 8488 struct AAValueConstantRangeFunction : AAValueConstantRangeImpl { 8489 AAValueConstantRangeFunction(const IRPosition &IRP, Attributor &A) 8490 : AAValueConstantRangeImpl(IRP, A) {} 8491 8492 /// See AbstractAttribute::initialize(...). 8493 ChangeStatus updateImpl(Attributor &A) override { 8494 llvm_unreachable("AAValueConstantRange(Function|CallSite)::updateImpl will " 8495 "not be called"); 8496 } 8497 8498 /// See AbstractAttribute::trackStatistics() 8499 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(value_range) } 8500 }; 8501 8502 struct AAValueConstantRangeCallSite : AAValueConstantRangeFunction { 8503 AAValueConstantRangeCallSite(const IRPosition &IRP, Attributor &A) 8504 : AAValueConstantRangeFunction(IRP, A) {} 8505 8506 /// See AbstractAttribute::trackStatistics() 8507 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(value_range) } 8508 }; 8509 8510 struct AAValueConstantRangeCallSiteReturned 8511 : AACallSiteReturnedFromReturned<AAValueConstantRange, 8512 AAValueConstantRangeImpl, 8513 AAValueConstantRangeImpl::StateType, 8514 /* IntroduceCallBaseContext */ true> { 8515 AAValueConstantRangeCallSiteReturned(const IRPosition &IRP, Attributor &A) 8516 : AACallSiteReturnedFromReturned<AAValueConstantRange, 8517 AAValueConstantRangeImpl, 8518 AAValueConstantRangeImpl::StateType, 8519 /* IntroduceCallBaseContext */ true>(IRP, 8520 A) { 8521 } 8522 8523 /// See AbstractAttribute::initialize(...). 8524 void initialize(Attributor &A) override { 8525 // If it is a load instruction with range metadata, use the metadata. 8526 if (CallInst *CI = dyn_cast<CallInst>(&getAssociatedValue())) 8527 if (auto *RangeMD = CI->getMetadata(LLVMContext::MD_range)) 8528 intersectKnown(getConstantRangeFromMetadata(*RangeMD)); 8529 8530 AAValueConstantRangeImpl::initialize(A); 8531 } 8532 8533 /// See AbstractAttribute::trackStatistics() 8534 void trackStatistics() const override { 8535 STATS_DECLTRACK_CSRET_ATTR(value_range) 8536 } 8537 }; 8538 struct AAValueConstantRangeCallSiteArgument : AAValueConstantRangeFloating { 8539 AAValueConstantRangeCallSiteArgument(const IRPosition &IRP, Attributor &A) 8540 : AAValueConstantRangeFloating(IRP, A) {} 8541 8542 /// See AbstractAttribute::manifest() 8543 ChangeStatus manifest(Attributor &A) override { 8544 return ChangeStatus::UNCHANGED; 8545 } 8546 8547 /// See AbstractAttribute::trackStatistics() 8548 void trackStatistics() const override { 8549 STATS_DECLTRACK_CSARG_ATTR(value_range) 8550 } 8551 }; 8552 8553 /// ------------------ Potential Values Attribute ------------------------- 8554 8555 struct AAPotentialValuesImpl : AAPotentialValues { 8556 using StateType = PotentialConstantIntValuesState; 8557 8558 AAPotentialValuesImpl(const IRPosition &IRP, Attributor &A) 8559 : AAPotentialValues(IRP, A) {} 8560 8561 /// See AbstractAttribute::initialize(..). 8562 void initialize(Attributor &A) override { 8563 if (A.hasSimplificationCallback(getIRPosition())) 8564 indicatePessimisticFixpoint(); 8565 else 8566 AAPotentialValues::initialize(A); 8567 } 8568 8569 /// See AbstractAttribute::getAsStr(). 8570 const std::string getAsStr() const override { 8571 std::string Str; 8572 llvm::raw_string_ostream OS(Str); 8573 OS << getState(); 8574 return OS.str(); 8575 } 8576 8577 /// See AbstractAttribute::updateImpl(...). 8578 ChangeStatus updateImpl(Attributor &A) override { 8579 return indicatePessimisticFixpoint(); 8580 } 8581 }; 8582 8583 struct AAPotentialValuesArgument final 8584 : AAArgumentFromCallSiteArguments<AAPotentialValues, AAPotentialValuesImpl, 8585 PotentialConstantIntValuesState> { 8586 using Base = 8587 AAArgumentFromCallSiteArguments<AAPotentialValues, AAPotentialValuesImpl, 8588 PotentialConstantIntValuesState>; 8589 AAPotentialValuesArgument(const IRPosition &IRP, Attributor &A) 8590 : Base(IRP, A) {} 8591 8592 /// See AbstractAttribute::initialize(..). 8593 void initialize(Attributor &A) override { 8594 if (!getAnchorScope() || getAnchorScope()->isDeclaration()) { 8595 indicatePessimisticFixpoint(); 8596 } else { 8597 Base::initialize(A); 8598 } 8599 } 8600 8601 /// See AbstractAttribute::trackStatistics() 8602 void trackStatistics() const override { 8603 STATS_DECLTRACK_ARG_ATTR(potential_values) 8604 } 8605 }; 8606 8607 struct AAPotentialValuesReturned 8608 : AAReturnedFromReturnedValues<AAPotentialValues, AAPotentialValuesImpl> { 8609 using Base = 8610 AAReturnedFromReturnedValues<AAPotentialValues, AAPotentialValuesImpl>; 8611 AAPotentialValuesReturned(const IRPosition &IRP, Attributor &A) 8612 : Base(IRP, A) {} 8613 8614 /// See AbstractAttribute::trackStatistics() 8615 void trackStatistics() const override { 8616 STATS_DECLTRACK_FNRET_ATTR(potential_values) 8617 } 8618 }; 8619 8620 struct AAPotentialValuesFloating : AAPotentialValuesImpl { 8621 AAPotentialValuesFloating(const IRPosition &IRP, Attributor &A) 8622 : AAPotentialValuesImpl(IRP, A) {} 8623 8624 /// See AbstractAttribute::initialize(..). 8625 void initialize(Attributor &A) override { 8626 AAPotentialValuesImpl::initialize(A); 8627 if (isAtFixpoint()) 8628 return; 8629 8630 Value &V = getAssociatedValue(); 8631 8632 if (auto *C = dyn_cast<ConstantInt>(&V)) { 8633 unionAssumed(C->getValue()); 8634 indicateOptimisticFixpoint(); 8635 return; 8636 } 8637 8638 if (isa<UndefValue>(&V)) { 8639 unionAssumedWithUndef(); 8640 indicateOptimisticFixpoint(); 8641 return; 8642 } 8643 8644 if (isa<BinaryOperator>(&V) || isa<ICmpInst>(&V) || isa<CastInst>(&V)) 8645 return; 8646 8647 if (isa<SelectInst>(V) || isa<PHINode>(V) || isa<LoadInst>(V)) 8648 return; 8649 8650 indicatePessimisticFixpoint(); 8651 8652 LLVM_DEBUG(dbgs() << "[AAPotentialValues] We give up: " 8653 << getAssociatedValue() << "\n"); 8654 } 8655 8656 static bool calculateICmpInst(const ICmpInst *ICI, const APInt &LHS, 8657 const APInt &RHS) { 8658 ICmpInst::Predicate Pred = ICI->getPredicate(); 8659 switch (Pred) { 8660 case ICmpInst::ICMP_UGT: 8661 return LHS.ugt(RHS); 8662 case ICmpInst::ICMP_SGT: 8663 return LHS.sgt(RHS); 8664 case ICmpInst::ICMP_EQ: 8665 return LHS.eq(RHS); 8666 case ICmpInst::ICMP_UGE: 8667 return LHS.uge(RHS); 8668 case ICmpInst::ICMP_SGE: 8669 return LHS.sge(RHS); 8670 case ICmpInst::ICMP_ULT: 8671 return LHS.ult(RHS); 8672 case ICmpInst::ICMP_SLT: 8673 return LHS.slt(RHS); 8674 case ICmpInst::ICMP_NE: 8675 return LHS.ne(RHS); 8676 case ICmpInst::ICMP_ULE: 8677 return LHS.ule(RHS); 8678 case ICmpInst::ICMP_SLE: 8679 return LHS.sle(RHS); 8680 default: 8681 llvm_unreachable("Invalid ICmp predicate!"); 8682 } 8683 } 8684 8685 static APInt calculateCastInst(const CastInst *CI, const APInt &Src, 8686 uint32_t ResultBitWidth) { 8687 Instruction::CastOps CastOp = CI->getOpcode(); 8688 switch (CastOp) { 8689 default: 8690 llvm_unreachable("unsupported or not integer cast"); 8691 case Instruction::Trunc: 8692 return Src.trunc(ResultBitWidth); 8693 case Instruction::SExt: 8694 return Src.sext(ResultBitWidth); 8695 case Instruction::ZExt: 8696 return Src.zext(ResultBitWidth); 8697 case Instruction::BitCast: 8698 return Src; 8699 } 8700 } 8701 8702 static APInt calculateBinaryOperator(const BinaryOperator *BinOp, 8703 const APInt &LHS, const APInt &RHS, 8704 bool &SkipOperation, bool &Unsupported) { 8705 Instruction::BinaryOps BinOpcode = BinOp->getOpcode(); 8706 // Unsupported is set to true when the binary operator is not supported. 8707 // SkipOperation is set to true when UB occur with the given operand pair 8708 // (LHS, RHS). 8709 // TODO: we should look at nsw and nuw keywords to handle operations 8710 // that create poison or undef value. 8711 switch (BinOpcode) { 8712 default: 8713 Unsupported = true; 8714 return LHS; 8715 case Instruction::Add: 8716 return LHS + RHS; 8717 case Instruction::Sub: 8718 return LHS - RHS; 8719 case Instruction::Mul: 8720 return LHS * RHS; 8721 case Instruction::UDiv: 8722 if (RHS.isNullValue()) { 8723 SkipOperation = true; 8724 return LHS; 8725 } 8726 return LHS.udiv(RHS); 8727 case Instruction::SDiv: 8728 if (RHS.isNullValue()) { 8729 SkipOperation = true; 8730 return LHS; 8731 } 8732 return LHS.sdiv(RHS); 8733 case Instruction::URem: 8734 if (RHS.isNullValue()) { 8735 SkipOperation = true; 8736 return LHS; 8737 } 8738 return LHS.urem(RHS); 8739 case Instruction::SRem: 8740 if (RHS.isNullValue()) { 8741 SkipOperation = true; 8742 return LHS; 8743 } 8744 return LHS.srem(RHS); 8745 case Instruction::Shl: 8746 return LHS.shl(RHS); 8747 case Instruction::LShr: 8748 return LHS.lshr(RHS); 8749 case Instruction::AShr: 8750 return LHS.ashr(RHS); 8751 case Instruction::And: 8752 return LHS & RHS; 8753 case Instruction::Or: 8754 return LHS | RHS; 8755 case Instruction::Xor: 8756 return LHS ^ RHS; 8757 } 8758 } 8759 8760 bool calculateBinaryOperatorAndTakeUnion(const BinaryOperator *BinOp, 8761 const APInt &LHS, const APInt &RHS) { 8762 bool SkipOperation = false; 8763 bool Unsupported = false; 8764 APInt Result = 8765 calculateBinaryOperator(BinOp, LHS, RHS, SkipOperation, Unsupported); 8766 if (Unsupported) 8767 return false; 8768 // If SkipOperation is true, we can ignore this operand pair (L, R). 8769 if (!SkipOperation) 8770 unionAssumed(Result); 8771 return isValidState(); 8772 } 8773 8774 ChangeStatus updateWithICmpInst(Attributor &A, ICmpInst *ICI) { 8775 auto AssumedBefore = getAssumed(); 8776 Value *LHS = ICI->getOperand(0); 8777 Value *RHS = ICI->getOperand(1); 8778 8779 // Simplify the operands first. 8780 bool UsedAssumedInformation = false; 8781 const auto &SimplifiedLHS = 8782 A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()), 8783 *this, UsedAssumedInformation); 8784 if (!SimplifiedLHS.hasValue()) 8785 return ChangeStatus::UNCHANGED; 8786 if (!SimplifiedLHS.getValue()) 8787 return indicatePessimisticFixpoint(); 8788 LHS = *SimplifiedLHS; 8789 8790 const auto &SimplifiedRHS = 8791 A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()), 8792 *this, UsedAssumedInformation); 8793 if (!SimplifiedRHS.hasValue()) 8794 return ChangeStatus::UNCHANGED; 8795 if (!SimplifiedRHS.getValue()) 8796 return indicatePessimisticFixpoint(); 8797 RHS = *SimplifiedRHS; 8798 8799 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy()) 8800 return indicatePessimisticFixpoint(); 8801 8802 auto &LHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*LHS), 8803 DepClassTy::REQUIRED); 8804 if (!LHSAA.isValidState()) 8805 return indicatePessimisticFixpoint(); 8806 8807 auto &RHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*RHS), 8808 DepClassTy::REQUIRED); 8809 if (!RHSAA.isValidState()) 8810 return indicatePessimisticFixpoint(); 8811 8812 const DenseSet<APInt> &LHSAAPVS = LHSAA.getAssumedSet(); 8813 const DenseSet<APInt> &RHSAAPVS = RHSAA.getAssumedSet(); 8814 8815 // TODO: make use of undef flag to limit potential values aggressively. 8816 bool MaybeTrue = false, MaybeFalse = false; 8817 const APInt Zero(RHS->getType()->getIntegerBitWidth(), 0); 8818 if (LHSAA.undefIsContained() && RHSAA.undefIsContained()) { 8819 // The result of any comparison between undefs can be soundly replaced 8820 // with undef. 8821 unionAssumedWithUndef(); 8822 } else if (LHSAA.undefIsContained()) { 8823 for (const APInt &R : RHSAAPVS) { 8824 bool CmpResult = calculateICmpInst(ICI, Zero, R); 8825 MaybeTrue |= CmpResult; 8826 MaybeFalse |= !CmpResult; 8827 if (MaybeTrue & MaybeFalse) 8828 return indicatePessimisticFixpoint(); 8829 } 8830 } else if (RHSAA.undefIsContained()) { 8831 for (const APInt &L : LHSAAPVS) { 8832 bool CmpResult = calculateICmpInst(ICI, L, Zero); 8833 MaybeTrue |= CmpResult; 8834 MaybeFalse |= !CmpResult; 8835 if (MaybeTrue & MaybeFalse) 8836 return indicatePessimisticFixpoint(); 8837 } 8838 } else { 8839 for (const APInt &L : LHSAAPVS) { 8840 for (const APInt &R : RHSAAPVS) { 8841 bool CmpResult = calculateICmpInst(ICI, L, R); 8842 MaybeTrue |= CmpResult; 8843 MaybeFalse |= !CmpResult; 8844 if (MaybeTrue & MaybeFalse) 8845 return indicatePessimisticFixpoint(); 8846 } 8847 } 8848 } 8849 if (MaybeTrue) 8850 unionAssumed(APInt(/* numBits */ 1, /* val */ 1)); 8851 if (MaybeFalse) 8852 unionAssumed(APInt(/* numBits */ 1, /* val */ 0)); 8853 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 8854 : ChangeStatus::CHANGED; 8855 } 8856 8857 ChangeStatus updateWithSelectInst(Attributor &A, SelectInst *SI) { 8858 auto AssumedBefore = getAssumed(); 8859 Value *LHS = SI->getTrueValue(); 8860 Value *RHS = SI->getFalseValue(); 8861 8862 // Simplify the operands first. 8863 bool UsedAssumedInformation = false; 8864 const auto &SimplifiedLHS = 8865 A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()), 8866 *this, UsedAssumedInformation); 8867 if (!SimplifiedLHS.hasValue()) 8868 return ChangeStatus::UNCHANGED; 8869 if (!SimplifiedLHS.getValue()) 8870 return indicatePessimisticFixpoint(); 8871 LHS = *SimplifiedLHS; 8872 8873 const auto &SimplifiedRHS = 8874 A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()), 8875 *this, UsedAssumedInformation); 8876 if (!SimplifiedRHS.hasValue()) 8877 return ChangeStatus::UNCHANGED; 8878 if (!SimplifiedRHS.getValue()) 8879 return indicatePessimisticFixpoint(); 8880 RHS = *SimplifiedRHS; 8881 8882 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy()) 8883 return indicatePessimisticFixpoint(); 8884 8885 Optional<Constant *> C = A.getAssumedConstant(*SI->getCondition(), *this, 8886 UsedAssumedInformation); 8887 8888 // Check if we only need one operand. 8889 bool OnlyLeft = false, OnlyRight = false; 8890 if (C.hasValue() && *C && (*C)->isOneValue()) 8891 OnlyLeft = true; 8892 else if (C.hasValue() && *C && (*C)->isZeroValue()) 8893 OnlyRight = true; 8894 8895 const AAPotentialValues *LHSAA = nullptr, *RHSAA = nullptr; 8896 if (!OnlyRight) { 8897 LHSAA = &A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*LHS), 8898 DepClassTy::REQUIRED); 8899 if (!LHSAA->isValidState()) 8900 return indicatePessimisticFixpoint(); 8901 } 8902 if (!OnlyLeft) { 8903 RHSAA = &A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*RHS), 8904 DepClassTy::REQUIRED); 8905 if (!RHSAA->isValidState()) 8906 return indicatePessimisticFixpoint(); 8907 } 8908 8909 if (!LHSAA || !RHSAA) { 8910 // select (true/false), lhs, rhs 8911 auto *OpAA = LHSAA ? LHSAA : RHSAA; 8912 8913 if (OpAA->undefIsContained()) 8914 unionAssumedWithUndef(); 8915 else 8916 unionAssumed(*OpAA); 8917 8918 } else if (LHSAA->undefIsContained() && RHSAA->undefIsContained()) { 8919 // select i1 *, undef , undef => undef 8920 unionAssumedWithUndef(); 8921 } else { 8922 unionAssumed(*LHSAA); 8923 unionAssumed(*RHSAA); 8924 } 8925 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 8926 : ChangeStatus::CHANGED; 8927 } 8928 8929 ChangeStatus updateWithCastInst(Attributor &A, CastInst *CI) { 8930 auto AssumedBefore = getAssumed(); 8931 if (!CI->isIntegerCast()) 8932 return indicatePessimisticFixpoint(); 8933 assert(CI->getNumOperands() == 1 && "Expected cast to be unary!"); 8934 uint32_t ResultBitWidth = CI->getDestTy()->getIntegerBitWidth(); 8935 Value *Src = CI->getOperand(0); 8936 8937 // Simplify the operand first. 8938 bool UsedAssumedInformation = false; 8939 const auto &SimplifiedSrc = 8940 A.getAssumedSimplified(IRPosition::value(*Src, getCallBaseContext()), 8941 *this, UsedAssumedInformation); 8942 if (!SimplifiedSrc.hasValue()) 8943 return ChangeStatus::UNCHANGED; 8944 if (!SimplifiedSrc.getValue()) 8945 return indicatePessimisticFixpoint(); 8946 Src = *SimplifiedSrc; 8947 8948 auto &SrcAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*Src), 8949 DepClassTy::REQUIRED); 8950 if (!SrcAA.isValidState()) 8951 return indicatePessimisticFixpoint(); 8952 const DenseSet<APInt> &SrcAAPVS = SrcAA.getAssumedSet(); 8953 if (SrcAA.undefIsContained()) 8954 unionAssumedWithUndef(); 8955 else { 8956 for (const APInt &S : SrcAAPVS) { 8957 APInt T = calculateCastInst(CI, S, ResultBitWidth); 8958 unionAssumed(T); 8959 } 8960 } 8961 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 8962 : ChangeStatus::CHANGED; 8963 } 8964 8965 ChangeStatus updateWithBinaryOperator(Attributor &A, BinaryOperator *BinOp) { 8966 auto AssumedBefore = getAssumed(); 8967 Value *LHS = BinOp->getOperand(0); 8968 Value *RHS = BinOp->getOperand(1); 8969 8970 // Simplify the operands first. 8971 bool UsedAssumedInformation = false; 8972 const auto &SimplifiedLHS = 8973 A.getAssumedSimplified(IRPosition::value(*LHS, getCallBaseContext()), 8974 *this, UsedAssumedInformation); 8975 if (!SimplifiedLHS.hasValue()) 8976 return ChangeStatus::UNCHANGED; 8977 if (!SimplifiedLHS.getValue()) 8978 return indicatePessimisticFixpoint(); 8979 LHS = *SimplifiedLHS; 8980 8981 const auto &SimplifiedRHS = 8982 A.getAssumedSimplified(IRPosition::value(*RHS, getCallBaseContext()), 8983 *this, UsedAssumedInformation); 8984 if (!SimplifiedRHS.hasValue()) 8985 return ChangeStatus::UNCHANGED; 8986 if (!SimplifiedRHS.getValue()) 8987 return indicatePessimisticFixpoint(); 8988 RHS = *SimplifiedRHS; 8989 8990 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy()) 8991 return indicatePessimisticFixpoint(); 8992 8993 auto &LHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*LHS), 8994 DepClassTy::REQUIRED); 8995 if (!LHSAA.isValidState()) 8996 return indicatePessimisticFixpoint(); 8997 8998 auto &RHSAA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(*RHS), 8999 DepClassTy::REQUIRED); 9000 if (!RHSAA.isValidState()) 9001 return indicatePessimisticFixpoint(); 9002 9003 const DenseSet<APInt> &LHSAAPVS = LHSAA.getAssumedSet(); 9004 const DenseSet<APInt> &RHSAAPVS = RHSAA.getAssumedSet(); 9005 const APInt Zero = APInt(LHS->getType()->getIntegerBitWidth(), 0); 9006 9007 // TODO: make use of undef flag to limit potential values aggressively. 9008 if (LHSAA.undefIsContained() && RHSAA.undefIsContained()) { 9009 if (!calculateBinaryOperatorAndTakeUnion(BinOp, Zero, Zero)) 9010 return indicatePessimisticFixpoint(); 9011 } else if (LHSAA.undefIsContained()) { 9012 for (const APInt &R : RHSAAPVS) { 9013 if (!calculateBinaryOperatorAndTakeUnion(BinOp, Zero, R)) 9014 return indicatePessimisticFixpoint(); 9015 } 9016 } else if (RHSAA.undefIsContained()) { 9017 for (const APInt &L : LHSAAPVS) { 9018 if (!calculateBinaryOperatorAndTakeUnion(BinOp, L, Zero)) 9019 return indicatePessimisticFixpoint(); 9020 } 9021 } else { 9022 for (const APInt &L : LHSAAPVS) { 9023 for (const APInt &R : RHSAAPVS) { 9024 if (!calculateBinaryOperatorAndTakeUnion(BinOp, L, R)) 9025 return indicatePessimisticFixpoint(); 9026 } 9027 } 9028 } 9029 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 9030 : ChangeStatus::CHANGED; 9031 } 9032 9033 ChangeStatus updateWithPHINode(Attributor &A, PHINode *PHI) { 9034 auto AssumedBefore = getAssumed(); 9035 for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) { 9036 Value *IncomingValue = PHI->getIncomingValue(u); 9037 9038 // Simplify the operand first. 9039 bool UsedAssumedInformation = false; 9040 const auto &SimplifiedIncomingValue = A.getAssumedSimplified( 9041 IRPosition::value(*IncomingValue, getCallBaseContext()), *this, 9042 UsedAssumedInformation); 9043 if (!SimplifiedIncomingValue.hasValue()) 9044 continue; 9045 if (!SimplifiedIncomingValue.getValue()) 9046 return indicatePessimisticFixpoint(); 9047 IncomingValue = *SimplifiedIncomingValue; 9048 9049 auto &PotentialValuesAA = A.getAAFor<AAPotentialValues>( 9050 *this, IRPosition::value(*IncomingValue), DepClassTy::REQUIRED); 9051 if (!PotentialValuesAA.isValidState()) 9052 return indicatePessimisticFixpoint(); 9053 if (PotentialValuesAA.undefIsContained()) 9054 unionAssumedWithUndef(); 9055 else 9056 unionAssumed(PotentialValuesAA.getAssumed()); 9057 } 9058 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 9059 : ChangeStatus::CHANGED; 9060 } 9061 9062 ChangeStatus updateWithLoad(Attributor &A, LoadInst &L) { 9063 if (!L.getType()->isIntegerTy()) 9064 return indicatePessimisticFixpoint(); 9065 9066 auto Union = [&](Value &V) { 9067 if (isa<UndefValue>(V)) { 9068 unionAssumedWithUndef(); 9069 return true; 9070 } 9071 if (ConstantInt *CI = dyn_cast<ConstantInt>(&V)) { 9072 unionAssumed(CI->getValue()); 9073 return true; 9074 } 9075 return false; 9076 }; 9077 auto AssumedBefore = getAssumed(); 9078 9079 if (!AAValueSimplifyImpl::handleLoad(A, *this, L, Union)) 9080 return indicatePessimisticFixpoint(); 9081 9082 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 9083 : ChangeStatus::CHANGED; 9084 } 9085 9086 /// See AbstractAttribute::updateImpl(...). 9087 ChangeStatus updateImpl(Attributor &A) override { 9088 Value &V = getAssociatedValue(); 9089 Instruction *I = dyn_cast<Instruction>(&V); 9090 9091 if (auto *ICI = dyn_cast<ICmpInst>(I)) 9092 return updateWithICmpInst(A, ICI); 9093 9094 if (auto *SI = dyn_cast<SelectInst>(I)) 9095 return updateWithSelectInst(A, SI); 9096 9097 if (auto *CI = dyn_cast<CastInst>(I)) 9098 return updateWithCastInst(A, CI); 9099 9100 if (auto *BinOp = dyn_cast<BinaryOperator>(I)) 9101 return updateWithBinaryOperator(A, BinOp); 9102 9103 if (auto *PHI = dyn_cast<PHINode>(I)) 9104 return updateWithPHINode(A, PHI); 9105 9106 if (auto *L = dyn_cast<LoadInst>(I)) 9107 return updateWithLoad(A, *L); 9108 9109 return indicatePessimisticFixpoint(); 9110 } 9111 9112 /// See AbstractAttribute::trackStatistics() 9113 void trackStatistics() const override { 9114 STATS_DECLTRACK_FLOATING_ATTR(potential_values) 9115 } 9116 }; 9117 9118 struct AAPotentialValuesFunction : AAPotentialValuesImpl { 9119 AAPotentialValuesFunction(const IRPosition &IRP, Attributor &A) 9120 : AAPotentialValuesImpl(IRP, A) {} 9121 9122 /// See AbstractAttribute::initialize(...). 9123 ChangeStatus updateImpl(Attributor &A) override { 9124 llvm_unreachable("AAPotentialValues(Function|CallSite)::updateImpl will " 9125 "not be called"); 9126 } 9127 9128 /// See AbstractAttribute::trackStatistics() 9129 void trackStatistics() const override { 9130 STATS_DECLTRACK_FN_ATTR(potential_values) 9131 } 9132 }; 9133 9134 struct AAPotentialValuesCallSite : AAPotentialValuesFunction { 9135 AAPotentialValuesCallSite(const IRPosition &IRP, Attributor &A) 9136 : AAPotentialValuesFunction(IRP, A) {} 9137 9138 /// See AbstractAttribute::trackStatistics() 9139 void trackStatistics() const override { 9140 STATS_DECLTRACK_CS_ATTR(potential_values) 9141 } 9142 }; 9143 9144 struct AAPotentialValuesCallSiteReturned 9145 : AACallSiteReturnedFromReturned<AAPotentialValues, AAPotentialValuesImpl> { 9146 AAPotentialValuesCallSiteReturned(const IRPosition &IRP, Attributor &A) 9147 : AACallSiteReturnedFromReturned<AAPotentialValues, 9148 AAPotentialValuesImpl>(IRP, A) {} 9149 9150 /// See AbstractAttribute::trackStatistics() 9151 void trackStatistics() const override { 9152 STATS_DECLTRACK_CSRET_ATTR(potential_values) 9153 } 9154 }; 9155 9156 struct AAPotentialValuesCallSiteArgument : AAPotentialValuesFloating { 9157 AAPotentialValuesCallSiteArgument(const IRPosition &IRP, Attributor &A) 9158 : AAPotentialValuesFloating(IRP, A) {} 9159 9160 /// See AbstractAttribute::initialize(..). 9161 void initialize(Attributor &A) override { 9162 AAPotentialValuesImpl::initialize(A); 9163 if (isAtFixpoint()) 9164 return; 9165 9166 Value &V = getAssociatedValue(); 9167 9168 if (auto *C = dyn_cast<ConstantInt>(&V)) { 9169 unionAssumed(C->getValue()); 9170 indicateOptimisticFixpoint(); 9171 return; 9172 } 9173 9174 if (isa<UndefValue>(&V)) { 9175 unionAssumedWithUndef(); 9176 indicateOptimisticFixpoint(); 9177 return; 9178 } 9179 } 9180 9181 /// See AbstractAttribute::updateImpl(...). 9182 ChangeStatus updateImpl(Attributor &A) override { 9183 Value &V = getAssociatedValue(); 9184 auto AssumedBefore = getAssumed(); 9185 auto &AA = A.getAAFor<AAPotentialValues>(*this, IRPosition::value(V), 9186 DepClassTy::REQUIRED); 9187 const auto &S = AA.getAssumed(); 9188 unionAssumed(S); 9189 return AssumedBefore == getAssumed() ? ChangeStatus::UNCHANGED 9190 : ChangeStatus::CHANGED; 9191 } 9192 9193 /// See AbstractAttribute::trackStatistics() 9194 void trackStatistics() const override { 9195 STATS_DECLTRACK_CSARG_ATTR(potential_values) 9196 } 9197 }; 9198 9199 /// ------------------------ NoUndef Attribute --------------------------------- 9200 struct AANoUndefImpl : AANoUndef { 9201 AANoUndefImpl(const IRPosition &IRP, Attributor &A) : AANoUndef(IRP, A) {} 9202 9203 /// See AbstractAttribute::initialize(...). 9204 void initialize(Attributor &A) override { 9205 if (getIRPosition().hasAttr({Attribute::NoUndef})) { 9206 indicateOptimisticFixpoint(); 9207 return; 9208 } 9209 Value &V = getAssociatedValue(); 9210 if (isa<UndefValue>(V)) 9211 indicatePessimisticFixpoint(); 9212 else if (isa<FreezeInst>(V)) 9213 indicateOptimisticFixpoint(); 9214 else if (getPositionKind() != IRPosition::IRP_RETURNED && 9215 isGuaranteedNotToBeUndefOrPoison(&V)) 9216 indicateOptimisticFixpoint(); 9217 else 9218 AANoUndef::initialize(A); 9219 } 9220 9221 /// See followUsesInMBEC 9222 bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I, 9223 AANoUndef::StateType &State) { 9224 const Value *UseV = U->get(); 9225 const DominatorTree *DT = nullptr; 9226 AssumptionCache *AC = nullptr; 9227 InformationCache &InfoCache = A.getInfoCache(); 9228 if (Function *F = getAnchorScope()) { 9229 DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*F); 9230 AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*F); 9231 } 9232 State.setKnown(isGuaranteedNotToBeUndefOrPoison(UseV, AC, I, DT)); 9233 bool TrackUse = false; 9234 // Track use for instructions which must produce undef or poison bits when 9235 // at least one operand contains such bits. 9236 if (isa<CastInst>(*I) || isa<GetElementPtrInst>(*I)) 9237 TrackUse = true; 9238 return TrackUse; 9239 } 9240 9241 /// See AbstractAttribute::getAsStr(). 9242 const std::string getAsStr() const override { 9243 return getAssumed() ? "noundef" : "may-undef-or-poison"; 9244 } 9245 9246 ChangeStatus manifest(Attributor &A) override { 9247 // We don't manifest noundef attribute for dead positions because the 9248 // associated values with dead positions would be replaced with undef 9249 // values. 9250 bool UsedAssumedInformation = false; 9251 if (A.isAssumedDead(getIRPosition(), nullptr, nullptr, 9252 UsedAssumedInformation)) 9253 return ChangeStatus::UNCHANGED; 9254 // A position whose simplified value does not have any value is 9255 // considered to be dead. We don't manifest noundef in such positions for 9256 // the same reason above. 9257 if (!A.getAssumedSimplified(getIRPosition(), *this, UsedAssumedInformation) 9258 .hasValue()) 9259 return ChangeStatus::UNCHANGED; 9260 return AANoUndef::manifest(A); 9261 } 9262 }; 9263 9264 struct AANoUndefFloating : public AANoUndefImpl { 9265 AANoUndefFloating(const IRPosition &IRP, Attributor &A) 9266 : AANoUndefImpl(IRP, A) {} 9267 9268 /// See AbstractAttribute::initialize(...). 9269 void initialize(Attributor &A) override { 9270 AANoUndefImpl::initialize(A); 9271 if (!getState().isAtFixpoint()) 9272 if (Instruction *CtxI = getCtxI()) 9273 followUsesInMBEC(*this, A, getState(), *CtxI); 9274 } 9275 9276 /// See AbstractAttribute::updateImpl(...). 9277 ChangeStatus updateImpl(Attributor &A) override { 9278 auto VisitValueCB = [&](Value &V, const Instruction *CtxI, 9279 AANoUndef::StateType &T, bool Stripped) -> bool { 9280 const auto &AA = A.getAAFor<AANoUndef>(*this, IRPosition::value(V), 9281 DepClassTy::REQUIRED); 9282 if (!Stripped && this == &AA) { 9283 T.indicatePessimisticFixpoint(); 9284 } else { 9285 const AANoUndef::StateType &S = 9286 static_cast<const AANoUndef::StateType &>(AA.getState()); 9287 T ^= S; 9288 } 9289 return T.isValidState(); 9290 }; 9291 9292 StateType T; 9293 if (!genericValueTraversal<StateType>(A, getIRPosition(), *this, T, 9294 VisitValueCB, getCtxI())) 9295 return indicatePessimisticFixpoint(); 9296 9297 return clampStateAndIndicateChange(getState(), T); 9298 } 9299 9300 /// See AbstractAttribute::trackStatistics() 9301 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noundef) } 9302 }; 9303 9304 struct AANoUndefReturned final 9305 : AAReturnedFromReturnedValues<AANoUndef, AANoUndefImpl> { 9306 AANoUndefReturned(const IRPosition &IRP, Attributor &A) 9307 : AAReturnedFromReturnedValues<AANoUndef, AANoUndefImpl>(IRP, A) {} 9308 9309 /// See AbstractAttribute::trackStatistics() 9310 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noundef) } 9311 }; 9312 9313 struct AANoUndefArgument final 9314 : AAArgumentFromCallSiteArguments<AANoUndef, AANoUndefImpl> { 9315 AANoUndefArgument(const IRPosition &IRP, Attributor &A) 9316 : AAArgumentFromCallSiteArguments<AANoUndef, AANoUndefImpl>(IRP, A) {} 9317 9318 /// See AbstractAttribute::trackStatistics() 9319 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noundef) } 9320 }; 9321 9322 struct AANoUndefCallSiteArgument final : AANoUndefFloating { 9323 AANoUndefCallSiteArgument(const IRPosition &IRP, Attributor &A) 9324 : AANoUndefFloating(IRP, A) {} 9325 9326 /// See AbstractAttribute::trackStatistics() 9327 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noundef) } 9328 }; 9329 9330 struct AANoUndefCallSiteReturned final 9331 : AACallSiteReturnedFromReturned<AANoUndef, AANoUndefImpl> { 9332 AANoUndefCallSiteReturned(const IRPosition &IRP, Attributor &A) 9333 : AACallSiteReturnedFromReturned<AANoUndef, AANoUndefImpl>(IRP, A) {} 9334 9335 /// See AbstractAttribute::trackStatistics() 9336 void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noundef) } 9337 }; 9338 9339 struct AACallEdgesFunction : public AACallEdges { 9340 AACallEdgesFunction(const IRPosition &IRP, Attributor &A) 9341 : AACallEdges(IRP, A) {} 9342 9343 /// See AbstractAttribute::updateImpl(...). 9344 ChangeStatus updateImpl(Attributor &A) override { 9345 ChangeStatus Change = ChangeStatus::UNCHANGED; 9346 bool OldHasUnknownCallee = HasUnknownCallee; 9347 bool OldHasUnknownCalleeNonAsm = HasUnknownCalleeNonAsm; 9348 9349 auto AddCalledFunction = [&](Function *Fn) { 9350 if (CalledFunctions.insert(Fn)) { 9351 Change = ChangeStatus::CHANGED; 9352 LLVM_DEBUG(dbgs() << "[AACallEdges] New call edge: " << Fn->getName() 9353 << "\n"); 9354 } 9355 }; 9356 9357 auto VisitValue = [&](Value &V, const Instruction *CtxI, bool &HasUnknown, 9358 bool Stripped) -> bool { 9359 if (Function *Fn = dyn_cast<Function>(&V)) { 9360 AddCalledFunction(Fn); 9361 } else { 9362 LLVM_DEBUG(dbgs() << "[AACallEdges] Unrecognized value: " << V << "\n"); 9363 HasUnknown = true; 9364 HasUnknownCalleeNonAsm = true; 9365 } 9366 9367 // Explore all values. 9368 return true; 9369 }; 9370 9371 // Process any value that we might call. 9372 auto ProcessCalledOperand = [&](Value *V, Instruction *Ctx) { 9373 if (!genericValueTraversal<bool>(A, IRPosition::value(*V), *this, 9374 HasUnknownCallee, VisitValue, nullptr, 9375 false)) { 9376 // If we haven't gone through all values, assume that there are unknown 9377 // callees. 9378 HasUnknownCallee = true; 9379 HasUnknownCalleeNonAsm = true; 9380 } 9381 }; 9382 9383 auto ProcessCallInst = [&](Instruction &Inst) { 9384 CallBase &CB = static_cast<CallBase &>(Inst); 9385 if (CB.isInlineAsm()) { 9386 HasUnknownCallee = true; 9387 return true; 9388 } 9389 9390 // Process callee metadata if available. 9391 if (auto *MD = Inst.getMetadata(LLVMContext::MD_callees)) { 9392 for (auto &Op : MD->operands()) { 9393 Function *Callee = mdconst::extract_or_null<Function>(Op); 9394 if (Callee) 9395 AddCalledFunction(Callee); 9396 } 9397 // Callees metadata grantees that the called function is one of its 9398 // operands, So we are done. 9399 return true; 9400 } 9401 9402 // The most simple case. 9403 ProcessCalledOperand(CB.getCalledOperand(), &Inst); 9404 9405 // Process callback functions. 9406 SmallVector<const Use *, 4u> CallbackUses; 9407 AbstractCallSite::getCallbackUses(CB, CallbackUses); 9408 for (const Use *U : CallbackUses) 9409 ProcessCalledOperand(U->get(), &Inst); 9410 9411 return true; 9412 }; 9413 9414 // Visit all callable instructions. 9415 bool UsedAssumedInformation = false; 9416 if (!A.checkForAllCallLikeInstructions(ProcessCallInst, *this, 9417 UsedAssumedInformation)) { 9418 // If we haven't looked at all call like instructions, assume that there 9419 // are unknown callees. 9420 HasUnknownCallee = true; 9421 HasUnknownCalleeNonAsm = true; 9422 } 9423 9424 // Track changes. 9425 if (OldHasUnknownCallee != HasUnknownCallee || 9426 OldHasUnknownCalleeNonAsm != HasUnknownCalleeNonAsm) 9427 Change = ChangeStatus::CHANGED; 9428 9429 return Change; 9430 } 9431 9432 virtual const SetVector<Function *> &getOptimisticEdges() const override { 9433 return CalledFunctions; 9434 }; 9435 9436 virtual bool hasUnknownCallee() const override { return HasUnknownCallee; } 9437 9438 virtual bool hasNonAsmUnknownCallee() const override { 9439 return HasUnknownCalleeNonAsm; 9440 } 9441 9442 const std::string getAsStr() const override { 9443 return "CallEdges[" + std::to_string(HasUnknownCallee) + "," + 9444 std::to_string(CalledFunctions.size()) + "]"; 9445 } 9446 9447 void trackStatistics() const override {} 9448 9449 /// Optimistic set of functions that might be called by this function. 9450 SetVector<Function *> CalledFunctions; 9451 9452 /// Is there any call with a unknown callee. 9453 bool HasUnknownCallee = false; 9454 9455 /// Is there any call with a unknown callee, excluding any inline asm. 9456 bool HasUnknownCalleeNonAsm = false; 9457 }; 9458 9459 struct AAFunctionReachabilityFunction : public AAFunctionReachability { 9460 AAFunctionReachabilityFunction(const IRPosition &IRP, Attributor &A) 9461 : AAFunctionReachability(IRP, A) {} 9462 9463 bool canReach(Attributor &A, Function *Fn) const override { 9464 // Assume that we can reach any function if we can reach a call with 9465 // unknown callee. 9466 if (CanReachUnknownCallee) 9467 return true; 9468 9469 if (ReachableQueries.count(Fn)) 9470 return true; 9471 9472 if (UnreachableQueries.count(Fn)) 9473 return false; 9474 9475 const AACallEdges &AAEdges = 9476 A.getAAFor<AACallEdges>(*this, getIRPosition(), DepClassTy::REQUIRED); 9477 9478 const SetVector<Function *> &Edges = AAEdges.getOptimisticEdges(); 9479 bool Result = checkIfReachable(A, Edges, Fn); 9480 9481 // Attributor returns attributes as const, so this function has to be 9482 // const for users of this attribute to use it without having to do 9483 // a const_cast. 9484 // This is a hack for us to be able to cache queries. 9485 auto *NonConstThis = const_cast<AAFunctionReachabilityFunction *>(this); 9486 9487 if (Result) 9488 NonConstThis->ReachableQueries.insert(Fn); 9489 else 9490 NonConstThis->UnreachableQueries.insert(Fn); 9491 9492 return Result; 9493 } 9494 9495 /// See AbstractAttribute::updateImpl(...). 9496 ChangeStatus updateImpl(Attributor &A) override { 9497 if (CanReachUnknownCallee) 9498 return ChangeStatus::UNCHANGED; 9499 9500 const AACallEdges &AAEdges = 9501 A.getAAFor<AACallEdges>(*this, getIRPosition(), DepClassTy::REQUIRED); 9502 const SetVector<Function *> &Edges = AAEdges.getOptimisticEdges(); 9503 ChangeStatus Change = ChangeStatus::UNCHANGED; 9504 9505 if (AAEdges.hasUnknownCallee()) { 9506 bool OldCanReachUnknown = CanReachUnknownCallee; 9507 CanReachUnknownCallee = true; 9508 return OldCanReachUnknown ? ChangeStatus::UNCHANGED 9509 : ChangeStatus::CHANGED; 9510 } 9511 9512 // Check if any of the unreachable functions become reachable. 9513 for (auto Current = UnreachableQueries.begin(); 9514 Current != UnreachableQueries.end();) { 9515 if (!checkIfReachable(A, Edges, *Current)) { 9516 Current++; 9517 continue; 9518 } 9519 ReachableQueries.insert(*Current); 9520 UnreachableQueries.erase(*Current++); 9521 Change = ChangeStatus::CHANGED; 9522 } 9523 9524 return Change; 9525 } 9526 9527 const std::string getAsStr() const override { 9528 size_t QueryCount = ReachableQueries.size() + UnreachableQueries.size(); 9529 9530 return "FunctionReachability [" + std::to_string(ReachableQueries.size()) + 9531 "," + std::to_string(QueryCount) + "]"; 9532 } 9533 9534 void trackStatistics() const override {} 9535 9536 private: 9537 bool canReachUnknownCallee() const override { return CanReachUnknownCallee; } 9538 9539 bool checkIfReachable(Attributor &A, const SetVector<Function *> &Edges, 9540 Function *Fn) const { 9541 if (Edges.count(Fn)) 9542 return true; 9543 9544 for (Function *Edge : Edges) { 9545 // We don't need a dependency if the result is reachable. 9546 const AAFunctionReachability &EdgeReachability = 9547 A.getAAFor<AAFunctionReachability>(*this, IRPosition::function(*Edge), 9548 DepClassTy::NONE); 9549 9550 if (EdgeReachability.canReach(A, Fn)) 9551 return true; 9552 } 9553 for (Function *Fn : Edges) 9554 A.getAAFor<AAFunctionReachability>(*this, IRPosition::function(*Fn), 9555 DepClassTy::REQUIRED); 9556 9557 return false; 9558 } 9559 9560 /// Set of functions that we know for sure is reachable. 9561 SmallPtrSet<Function *, 8> ReachableQueries; 9562 9563 /// Set of functions that are unreachable, but might become reachable. 9564 SmallPtrSet<Function *, 8> UnreachableQueries; 9565 9566 /// If we can reach a function with a call to a unknown function we assume 9567 /// that we can reach any function. 9568 bool CanReachUnknownCallee = false; 9569 }; 9570 9571 } // namespace 9572 9573 AACallGraphNode *AACallEdgeIterator::operator*() const { 9574 return static_cast<AACallGraphNode *>(const_cast<AACallEdges *>( 9575 &A.getOrCreateAAFor<AACallEdges>(IRPosition::function(**I)))); 9576 } 9577 9578 void AttributorCallGraph::print() { llvm::WriteGraph(outs(), this); } 9579 9580 const char AAReturnedValues::ID = 0; 9581 const char AANoUnwind::ID = 0; 9582 const char AANoSync::ID = 0; 9583 const char AANoFree::ID = 0; 9584 const char AANonNull::ID = 0; 9585 const char AANoRecurse::ID = 0; 9586 const char AAWillReturn::ID = 0; 9587 const char AAUndefinedBehavior::ID = 0; 9588 const char AANoAlias::ID = 0; 9589 const char AAReachability::ID = 0; 9590 const char AANoReturn::ID = 0; 9591 const char AAIsDead::ID = 0; 9592 const char AADereferenceable::ID = 0; 9593 const char AAAlign::ID = 0; 9594 const char AANoCapture::ID = 0; 9595 const char AAValueSimplify::ID = 0; 9596 const char AAHeapToStack::ID = 0; 9597 const char AAPrivatizablePtr::ID = 0; 9598 const char AAMemoryBehavior::ID = 0; 9599 const char AAMemoryLocation::ID = 0; 9600 const char AAValueConstantRange::ID = 0; 9601 const char AAPotentialValues::ID = 0; 9602 const char AANoUndef::ID = 0; 9603 const char AACallEdges::ID = 0; 9604 const char AAFunctionReachability::ID = 0; 9605 const char AAPointerInfo::ID = 0; 9606 9607 // Macro magic to create the static generator function for attributes that 9608 // follow the naming scheme. 9609 9610 #define SWITCH_PK_INV(CLASS, PK, POS_NAME) \ 9611 case IRPosition::PK: \ 9612 llvm_unreachable("Cannot create " #CLASS " for a " POS_NAME " position!"); 9613 9614 #define SWITCH_PK_CREATE(CLASS, IRP, PK, SUFFIX) \ 9615 case IRPosition::PK: \ 9616 AA = new (A.Allocator) CLASS##SUFFIX(IRP, A); \ 9617 ++NumAAs; \ 9618 break; 9619 9620 #define CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 9621 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 9622 CLASS *AA = nullptr; \ 9623 switch (IRP.getPositionKind()) { \ 9624 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 9625 SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating") \ 9626 SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument") \ 9627 SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned") \ 9628 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned") \ 9629 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument") \ 9630 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 9631 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite) \ 9632 } \ 9633 return *AA; \ 9634 } 9635 9636 #define CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 9637 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 9638 CLASS *AA = nullptr; \ 9639 switch (IRP.getPositionKind()) { \ 9640 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 9641 SWITCH_PK_INV(CLASS, IRP_FUNCTION, "function") \ 9642 SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site") \ 9643 SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating) \ 9644 SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument) \ 9645 SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned) \ 9646 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned) \ 9647 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument) \ 9648 } \ 9649 return *AA; \ 9650 } 9651 9652 #define CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 9653 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 9654 CLASS *AA = nullptr; \ 9655 switch (IRP.getPositionKind()) { \ 9656 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 9657 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 9658 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite) \ 9659 SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating) \ 9660 SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument) \ 9661 SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned) \ 9662 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned) \ 9663 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument) \ 9664 } \ 9665 return *AA; \ 9666 } 9667 9668 #define CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 9669 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 9670 CLASS *AA = nullptr; \ 9671 switch (IRP.getPositionKind()) { \ 9672 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 9673 SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument") \ 9674 SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating") \ 9675 SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned") \ 9676 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned") \ 9677 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument") \ 9678 SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site") \ 9679 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 9680 } \ 9681 return *AA; \ 9682 } 9683 9684 #define CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 9685 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 9686 CLASS *AA = nullptr; \ 9687 switch (IRP.getPositionKind()) { \ 9688 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 9689 SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned") \ 9690 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 9691 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite) \ 9692 SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating) \ 9693 SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument) \ 9694 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned) \ 9695 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument) \ 9696 } \ 9697 return *AA; \ 9698 } 9699 9700 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUnwind) 9701 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoSync) 9702 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoRecurse) 9703 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAWillReturn) 9704 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoReturn) 9705 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReturnedValues) 9706 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryLocation) 9707 9708 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANonNull) 9709 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoAlias) 9710 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPrivatizablePtr) 9711 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AADereferenceable) 9712 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAlign) 9713 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoCapture) 9714 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueConstantRange) 9715 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPotentialValues) 9716 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUndef) 9717 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAPointerInfo) 9718 9719 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueSimplify) 9720 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAIsDead) 9721 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoFree) 9722 9723 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAHeapToStack) 9724 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReachability) 9725 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAUndefinedBehavior) 9726 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AACallEdges) 9727 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAFunctionReachability) 9728 9729 CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryBehavior) 9730 9731 #undef CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION 9732 #undef CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION 9733 #undef CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION 9734 #undef CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION 9735 #undef CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION 9736 #undef SWITCH_PK_CREATE 9737 #undef SWITCH_PK_INV 9738