1 //===- Attributor.cpp - Module-wide attribute 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 // This file implements an inter procedural pass that deduces and/or propagating 10 // attributes. This is done in an abstract interpretation style fixpoint 11 // iteration. See the Attributor.h file comment and the class descriptions in 12 // that file for more information. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/Transforms/IPO/Attributor.h" 17 18 #include "llvm/ADT/DepthFirstIterator.h" 19 #include "llvm/ADT/STLExtras.h" 20 #include "llvm/ADT/SmallPtrSet.h" 21 #include "llvm/ADT/SmallVector.h" 22 #include "llvm/ADT/Statistic.h" 23 #include "llvm/Analysis/CaptureTracking.h" 24 #include "llvm/Analysis/EHPersonalities.h" 25 #include "llvm/Analysis/GlobalsModRef.h" 26 #include "llvm/Analysis/Loads.h" 27 #include "llvm/Analysis/MemoryBuiltins.h" 28 #include "llvm/Analysis/ValueTracking.h" 29 #include "llvm/IR/Argument.h" 30 #include "llvm/IR/Attributes.h" 31 #include "llvm/IR/CFG.h" 32 #include "llvm/IR/InstIterator.h" 33 #include "llvm/IR/IntrinsicInst.h" 34 #include "llvm/Support/CommandLine.h" 35 #include "llvm/Support/Debug.h" 36 #include "llvm/Support/raw_ostream.h" 37 #include "llvm/Transforms/Utils/BasicBlockUtils.h" 38 #include "llvm/Transforms/Utils/Local.h" 39 40 #include <cassert> 41 42 using namespace llvm; 43 44 #define DEBUG_TYPE "attributor" 45 46 STATISTIC(NumFnWithExactDefinition, 47 "Number of function with exact definitions"); 48 STATISTIC(NumFnWithoutExactDefinition, 49 "Number of function without exact definitions"); 50 STATISTIC(NumAttributesTimedOut, 51 "Number of abstract attributes timed out before fixpoint"); 52 STATISTIC(NumAttributesValidFixpoint, 53 "Number of abstract attributes in a valid fixpoint state"); 54 STATISTIC(NumAttributesManifested, 55 "Number of abstract attributes manifested in IR"); 56 57 // Some helper macros to deal with statistics tracking. 58 // 59 // Usage: 60 // For simple IR attribute tracking overload trackStatistics in the abstract 61 // attribute and choose the right STATS_DECLTRACK_********* macro, 62 // e.g.,: 63 // void trackStatistics() const override { 64 // STATS_DECLTRACK_ARG_ATTR(returned) 65 // } 66 // If there is a single "increment" side one can use the macro 67 // STATS_DECLTRACK with a custom message. If there are multiple increment 68 // sides, STATS_DECL and STATS_TRACK can also be used separatly. 69 // 70 #define BUILD_STAT_MSG_IR_ATTR(TYPE, NAME) \ 71 ("Number of " #TYPE " marked '" #NAME "'") 72 #define BUILD_STAT_NAME(NAME, TYPE) NumIR##TYPE##_##NAME 73 #define STATS_DECL_(NAME, MSG) STATISTIC(NAME, MSG); 74 #define STATS_DECL(NAME, TYPE, MSG) \ 75 STATS_DECL_(BUILD_STAT_NAME(NAME, TYPE), MSG); 76 #define STATS_TRACK(NAME, TYPE) ++(BUILD_STAT_NAME(NAME, TYPE)); 77 #define STATS_DECLTRACK(NAME, TYPE, MSG) \ 78 { \ 79 STATS_DECL(NAME, TYPE, MSG) \ 80 STATS_TRACK(NAME, TYPE) \ 81 } 82 #define STATS_DECLTRACK_ARG_ATTR(NAME) \ 83 STATS_DECLTRACK(NAME, Arguments, BUILD_STAT_MSG_IR_ATTR(arguments, NAME)) 84 #define STATS_DECLTRACK_CSARG_ATTR(NAME) \ 85 STATS_DECLTRACK(NAME, CSArguments, \ 86 BUILD_STAT_MSG_IR_ATTR(call site arguments, NAME)) 87 #define STATS_DECLTRACK_FN_ATTR(NAME) \ 88 STATS_DECLTRACK(NAME, Function, BUILD_STAT_MSG_IR_ATTR(functions, NAME)) 89 #define STATS_DECLTRACK_CS_ATTR(NAME) \ 90 STATS_DECLTRACK(NAME, CS, BUILD_STAT_MSG_IR_ATTR(call site, NAME)) 91 #define STATS_DECLTRACK_FNRET_ATTR(NAME) \ 92 STATS_DECLTRACK(NAME, FunctionReturn, \ 93 BUILD_STAT_MSG_IR_ATTR(function returns, NAME)) 94 #define STATS_DECLTRACK_CSRET_ATTR(NAME) \ 95 STATS_DECLTRACK(NAME, CSReturn, \ 96 BUILD_STAT_MSG_IR_ATTR(call site returns, NAME)) 97 #define STATS_DECLTRACK_FLOATING_ATTR(NAME) \ 98 STATS_DECLTRACK(NAME, Floating, \ 99 ("Number of floating values known to be '" #NAME "'")) 100 101 // TODO: Determine a good default value. 102 // 103 // In the LLVM-TS and SPEC2006, 32 seems to not induce compile time overheads 104 // (when run with the first 5 abstract attributes). The results also indicate 105 // that we never reach 32 iterations but always find a fixpoint sooner. 106 // 107 // This will become more evolved once we perform two interleaved fixpoint 108 // iterations: bottom-up and top-down. 109 static cl::opt<unsigned> 110 MaxFixpointIterations("attributor-max-iterations", cl::Hidden, 111 cl::desc("Maximal number of fixpoint iterations."), 112 cl::init(32)); 113 static cl::opt<bool> VerifyMaxFixpointIterations( 114 "attributor-max-iterations-verify", cl::Hidden, 115 cl::desc("Verify that max-iterations is a tight bound for a fixpoint"), 116 cl::init(false)); 117 118 static cl::opt<bool> DisableAttributor( 119 "attributor-disable", cl::Hidden, 120 cl::desc("Disable the attributor inter-procedural deduction pass."), 121 cl::init(true)); 122 123 static cl::opt<bool> ManifestInternal( 124 "attributor-manifest-internal", cl::Hidden, 125 cl::desc("Manifest Attributor internal string attributes."), 126 cl::init(false)); 127 128 static cl::opt<unsigned> DepRecInterval( 129 "attributor-dependence-recompute-interval", cl::Hidden, 130 cl::desc("Number of iterations until dependences are recomputed."), 131 cl::init(4)); 132 133 static cl::opt<bool> EnableHeapToStack("enable-heap-to-stack-conversion", 134 cl::init(true), cl::Hidden); 135 136 static cl::opt<int> MaxHeapToStackSize("max-heap-to-stack-size", cl::init(128), 137 cl::Hidden); 138 139 /// Logic operators for the change status enum class. 140 /// 141 ///{ 142 ChangeStatus llvm::operator|(ChangeStatus l, ChangeStatus r) { 143 return l == ChangeStatus::CHANGED ? l : r; 144 } 145 ChangeStatus llvm::operator&(ChangeStatus l, ChangeStatus r) { 146 return l == ChangeStatus::UNCHANGED ? l : r; 147 } 148 ///} 149 150 /// Recursively visit all values that might become \p IRP at some point. This 151 /// will be done by looking through cast instructions, selects, phis, and calls 152 /// with the "returned" attribute. Once we cannot look through the value any 153 /// further, the callback \p VisitValueCB is invoked and passed the current 154 /// value, the \p State, and a flag to indicate if we stripped anything. To 155 /// limit how much effort is invested, we will never visit more values than 156 /// specified by \p MaxValues. 157 template <typename AAType, typename StateTy> 158 static bool genericValueTraversal( 159 Attributor &A, IRPosition IRP, const AAType &QueryingAA, StateTy &State, 160 const function_ref<bool(Value &, StateTy &, bool)> &VisitValueCB, 161 int MaxValues = 8) { 162 163 const AAIsDead *LivenessAA = nullptr; 164 if (IRP.getAnchorScope()) 165 LivenessAA = &A.getAAFor<AAIsDead>( 166 QueryingAA, IRPosition::function(*IRP.getAnchorScope()), 167 /* TrackDependence */ false); 168 bool AnyDead = false; 169 170 // TODO: Use Positions here to allow context sensitivity in VisitValueCB 171 SmallPtrSet<Value *, 16> Visited; 172 SmallVector<Value *, 16> Worklist; 173 Worklist.push_back(&IRP.getAssociatedValue()); 174 175 int Iteration = 0; 176 do { 177 Value *V = Worklist.pop_back_val(); 178 179 // Check if we should process the current value. To prevent endless 180 // recursion keep a record of the values we followed! 181 if (!Visited.insert(V).second) 182 continue; 183 184 // Make sure we limit the compile time for complex expressions. 185 if (Iteration++ >= MaxValues) 186 return false; 187 188 // Explicitly look through calls with a "returned" attribute if we do 189 // not have a pointer as stripPointerCasts only works on them. 190 Value *NewV = nullptr; 191 if (V->getType()->isPointerTy()) { 192 NewV = V->stripPointerCasts(); 193 } else { 194 CallSite CS(V); 195 if (CS && CS.getCalledFunction()) { 196 for (Argument &Arg : CS.getCalledFunction()->args()) 197 if (Arg.hasReturnedAttr()) { 198 NewV = CS.getArgOperand(Arg.getArgNo()); 199 break; 200 } 201 } 202 } 203 if (NewV && NewV != V) { 204 Worklist.push_back(NewV); 205 continue; 206 } 207 208 // Look through select instructions, visit both potential values. 209 if (auto *SI = dyn_cast<SelectInst>(V)) { 210 Worklist.push_back(SI->getTrueValue()); 211 Worklist.push_back(SI->getFalseValue()); 212 continue; 213 } 214 215 // Look through phi nodes, visit all live operands. 216 if (auto *PHI = dyn_cast<PHINode>(V)) { 217 assert(LivenessAA && 218 "Expected liveness in the presence of instructions!"); 219 for (unsigned u = 0, e = PHI->getNumIncomingValues(); u < e; u++) { 220 const BasicBlock *IncomingBB = PHI->getIncomingBlock(u); 221 if (LivenessAA->isAssumedDead(IncomingBB->getTerminator())) { 222 AnyDead = true; 223 continue; 224 } 225 Worklist.push_back(PHI->getIncomingValue(u)); 226 } 227 continue; 228 } 229 230 // Once a leaf is reached we inform the user through the callback. 231 if (!VisitValueCB(*V, State, Iteration > 1)) 232 return false; 233 } while (!Worklist.empty()); 234 235 // If we actually used liveness information so we have to record a dependence. 236 if (AnyDead) 237 A.recordDependence(*LivenessAA, QueryingAA); 238 239 // All values have been visited. 240 return true; 241 } 242 243 /// Return true if \p New is equal or worse than \p Old. 244 static bool isEqualOrWorse(const Attribute &New, const Attribute &Old) { 245 if (!Old.isIntAttribute()) 246 return true; 247 248 return Old.getValueAsInt() >= New.getValueAsInt(); 249 } 250 251 /// Return true if the information provided by \p Attr was added to the 252 /// attribute list \p Attrs. This is only the case if it was not already present 253 /// in \p Attrs at the position describe by \p PK and \p AttrIdx. 254 static bool addIfNotExistent(LLVMContext &Ctx, const Attribute &Attr, 255 AttributeList &Attrs, int AttrIdx) { 256 257 if (Attr.isEnumAttribute()) { 258 Attribute::AttrKind Kind = Attr.getKindAsEnum(); 259 if (Attrs.hasAttribute(AttrIdx, Kind)) 260 if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind))) 261 return false; 262 Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr); 263 return true; 264 } 265 if (Attr.isStringAttribute()) { 266 StringRef Kind = Attr.getKindAsString(); 267 if (Attrs.hasAttribute(AttrIdx, Kind)) 268 if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind))) 269 return false; 270 Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr); 271 return true; 272 } 273 if (Attr.isIntAttribute()) { 274 Attribute::AttrKind Kind = Attr.getKindAsEnum(); 275 if (Attrs.hasAttribute(AttrIdx, Kind)) 276 if (isEqualOrWorse(Attr, Attrs.getAttribute(AttrIdx, Kind))) 277 return false; 278 Attrs = Attrs.removeAttribute(Ctx, AttrIdx, Kind); 279 Attrs = Attrs.addAttribute(Ctx, AttrIdx, Attr); 280 return true; 281 } 282 283 llvm_unreachable("Expected enum or string attribute!"); 284 } 285 static const Value *getPointerOperand(const Instruction *I) { 286 if (auto *LI = dyn_cast<LoadInst>(I)) 287 if (!LI->isVolatile()) 288 return LI->getPointerOperand(); 289 290 if (auto *SI = dyn_cast<StoreInst>(I)) 291 if (!SI->isVolatile()) 292 return SI->getPointerOperand(); 293 294 if (auto *CXI = dyn_cast<AtomicCmpXchgInst>(I)) 295 if (!CXI->isVolatile()) 296 return CXI->getPointerOperand(); 297 298 if (auto *RMWI = dyn_cast<AtomicRMWInst>(I)) 299 if (!RMWI->isVolatile()) 300 return RMWI->getPointerOperand(); 301 302 return nullptr; 303 } 304 static const Value *getBasePointerOfAccessPointerOperand(const Instruction *I, 305 int64_t &BytesOffset, 306 const DataLayout &DL) { 307 const Value *Ptr = getPointerOperand(I); 308 if (!Ptr) 309 return nullptr; 310 311 return GetPointerBaseWithConstantOffset(Ptr, BytesOffset, DL, 312 /*AllowNonInbounds*/ false); 313 } 314 315 ChangeStatus AbstractAttribute::update(Attributor &A) { 316 ChangeStatus HasChanged = ChangeStatus::UNCHANGED; 317 if (getState().isAtFixpoint()) 318 return HasChanged; 319 320 LLVM_DEBUG(dbgs() << "[Attributor] Update: " << *this << "\n"); 321 322 HasChanged = updateImpl(A); 323 324 LLVM_DEBUG(dbgs() << "[Attributor] Update " << HasChanged << " " << *this 325 << "\n"); 326 327 return HasChanged; 328 } 329 330 ChangeStatus 331 IRAttributeManifest::manifestAttrs(Attributor &A, IRPosition &IRP, 332 const ArrayRef<Attribute> &DeducedAttrs) { 333 Function *ScopeFn = IRP.getAssociatedFunction(); 334 IRPosition::Kind PK = IRP.getPositionKind(); 335 336 // In the following some generic code that will manifest attributes in 337 // DeducedAttrs if they improve the current IR. Due to the different 338 // annotation positions we use the underlying AttributeList interface. 339 340 AttributeList Attrs; 341 switch (PK) { 342 case IRPosition::IRP_INVALID: 343 case IRPosition::IRP_FLOAT: 344 return ChangeStatus::UNCHANGED; 345 case IRPosition::IRP_ARGUMENT: 346 case IRPosition::IRP_FUNCTION: 347 case IRPosition::IRP_RETURNED: 348 Attrs = ScopeFn->getAttributes(); 349 break; 350 case IRPosition::IRP_CALL_SITE: 351 case IRPosition::IRP_CALL_SITE_RETURNED: 352 case IRPosition::IRP_CALL_SITE_ARGUMENT: 353 Attrs = ImmutableCallSite(&IRP.getAnchorValue()).getAttributes(); 354 break; 355 } 356 357 ChangeStatus HasChanged = ChangeStatus::UNCHANGED; 358 LLVMContext &Ctx = IRP.getAnchorValue().getContext(); 359 for (const Attribute &Attr : DeducedAttrs) { 360 if (!addIfNotExistent(Ctx, Attr, Attrs, IRP.getAttrIdx())) 361 continue; 362 363 HasChanged = ChangeStatus::CHANGED; 364 } 365 366 if (HasChanged == ChangeStatus::UNCHANGED) 367 return HasChanged; 368 369 switch (PK) { 370 case IRPosition::IRP_ARGUMENT: 371 case IRPosition::IRP_FUNCTION: 372 case IRPosition::IRP_RETURNED: 373 ScopeFn->setAttributes(Attrs); 374 break; 375 case IRPosition::IRP_CALL_SITE: 376 case IRPosition::IRP_CALL_SITE_RETURNED: 377 case IRPosition::IRP_CALL_SITE_ARGUMENT: 378 CallSite(&IRP.getAnchorValue()).setAttributes(Attrs); 379 break; 380 case IRPosition::IRP_INVALID: 381 case IRPosition::IRP_FLOAT: 382 break; 383 } 384 385 return HasChanged; 386 } 387 388 const IRPosition IRPosition::EmptyKey(255); 389 const IRPosition IRPosition::TombstoneKey(256); 390 391 SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) { 392 IRPositions.emplace_back(IRP); 393 394 ImmutableCallSite ICS(&IRP.getAnchorValue()); 395 switch (IRP.getPositionKind()) { 396 case IRPosition::IRP_INVALID: 397 case IRPosition::IRP_FLOAT: 398 case IRPosition::IRP_FUNCTION: 399 return; 400 case IRPosition::IRP_ARGUMENT: 401 case IRPosition::IRP_RETURNED: 402 IRPositions.emplace_back( 403 IRPosition::function(*IRP.getAssociatedFunction())); 404 return; 405 case IRPosition::IRP_CALL_SITE: 406 assert(ICS && "Expected call site!"); 407 // TODO: We need to look at the operand bundles similar to the redirection 408 // in CallBase. 409 if (!ICS.hasOperandBundles()) 410 if (const Function *Callee = ICS.getCalledFunction()) 411 IRPositions.emplace_back(IRPosition::function(*Callee)); 412 return; 413 case IRPosition::IRP_CALL_SITE_RETURNED: 414 assert(ICS && "Expected call site!"); 415 // TODO: We need to look at the operand bundles similar to the redirection 416 // in CallBase. 417 if (!ICS.hasOperandBundles()) { 418 if (const Function *Callee = ICS.getCalledFunction()) { 419 IRPositions.emplace_back(IRPosition::returned(*Callee)); 420 IRPositions.emplace_back(IRPosition::function(*Callee)); 421 } 422 } 423 IRPositions.emplace_back( 424 IRPosition::callsite_function(cast<CallBase>(*ICS.getInstruction()))); 425 return; 426 case IRPosition::IRP_CALL_SITE_ARGUMENT: { 427 int ArgNo = IRP.getArgNo(); 428 assert(ICS && ArgNo >= 0 && "Expected call site!"); 429 // TODO: We need to look at the operand bundles similar to the redirection 430 // in CallBase. 431 if (!ICS.hasOperandBundles()) { 432 const Function *Callee = ICS.getCalledFunction(); 433 if (Callee && Callee->arg_size() > unsigned(ArgNo)) 434 IRPositions.emplace_back(IRPosition::argument(*Callee->getArg(ArgNo))); 435 if (Callee) 436 IRPositions.emplace_back(IRPosition::function(*Callee)); 437 } 438 IRPositions.emplace_back(IRPosition::value(IRP.getAssociatedValue())); 439 return; 440 } 441 } 442 } 443 444 bool IRPosition::hasAttr(ArrayRef<Attribute::AttrKind> AKs, 445 bool IgnoreSubsumingPositions) const { 446 for (const IRPosition &EquivIRP : SubsumingPositionIterator(*this)) { 447 for (Attribute::AttrKind AK : AKs) 448 if (EquivIRP.getAttr(AK).getKindAsEnum() == AK) 449 return true; 450 // The first position returned by the SubsumingPositionIterator is 451 // always the position itself. If we ignore subsuming positions we 452 // are done after the first iteration. 453 if (IgnoreSubsumingPositions) 454 break; 455 } 456 return false; 457 } 458 459 void IRPosition::getAttrs(ArrayRef<Attribute::AttrKind> AKs, 460 SmallVectorImpl<Attribute> &Attrs) const { 461 for (const IRPosition &EquivIRP : SubsumingPositionIterator(*this)) 462 for (Attribute::AttrKind AK : AKs) { 463 const Attribute &Attr = EquivIRP.getAttr(AK); 464 if (Attr.getKindAsEnum() == AK) 465 Attrs.push_back(Attr); 466 } 467 } 468 469 void IRPosition::verify() { 470 switch (KindOrArgNo) { 471 default: 472 assert(KindOrArgNo >= 0 && "Expected argument or call site argument!"); 473 assert((isa<CallBase>(AnchorVal) || isa<Argument>(AnchorVal)) && 474 "Expected call base or argument for positive attribute index!"); 475 if (isa<Argument>(AnchorVal)) { 476 assert(cast<Argument>(AnchorVal)->getArgNo() == unsigned(getArgNo()) && 477 "Argument number mismatch!"); 478 assert(cast<Argument>(AnchorVal) == &getAssociatedValue() && 479 "Associated value mismatch!"); 480 } else { 481 assert(cast<CallBase>(*AnchorVal).arg_size() > unsigned(getArgNo()) && 482 "Call site argument number mismatch!"); 483 assert(cast<CallBase>(*AnchorVal).getArgOperand(getArgNo()) == 484 &getAssociatedValue() && 485 "Associated value mismatch!"); 486 } 487 break; 488 case IRP_INVALID: 489 assert(!AnchorVal && "Expected no value for an invalid position!"); 490 break; 491 case IRP_FLOAT: 492 assert((!isa<CallBase>(&getAssociatedValue()) && 493 !isa<Argument>(&getAssociatedValue())) && 494 "Expected specialized kind for call base and argument values!"); 495 break; 496 case IRP_RETURNED: 497 assert(isa<Function>(AnchorVal) && 498 "Expected function for a 'returned' position!"); 499 assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!"); 500 break; 501 case IRP_CALL_SITE_RETURNED: 502 assert((isa<CallBase>(AnchorVal)) && 503 "Expected call base for 'call site returned' position!"); 504 assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!"); 505 break; 506 case IRP_CALL_SITE: 507 assert((isa<CallBase>(AnchorVal)) && 508 "Expected call base for 'call site function' position!"); 509 assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!"); 510 break; 511 case IRP_FUNCTION: 512 assert(isa<Function>(AnchorVal) && 513 "Expected function for a 'function' position!"); 514 assert(AnchorVal == &getAssociatedValue() && "Associated value mismatch!"); 515 break; 516 } 517 } 518 519 namespace { 520 /// Helper functions to clamp a state \p S of type \p StateType with the 521 /// information in \p R and indicate/return if \p S did change (as-in update is 522 /// required to be run again). 523 /// 524 ///{ 525 template <typename StateType> 526 ChangeStatus clampStateAndIndicateChange(StateType &S, const StateType &R); 527 528 template <> 529 ChangeStatus clampStateAndIndicateChange<IntegerState>(IntegerState &S, 530 const IntegerState &R) { 531 auto Assumed = S.getAssumed(); 532 S ^= R; 533 return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED 534 : ChangeStatus::CHANGED; 535 } 536 537 template <> 538 ChangeStatus clampStateAndIndicateChange<BooleanState>(BooleanState &S, 539 const BooleanState &R) { 540 return clampStateAndIndicateChange<IntegerState>(S, R); 541 } 542 ///} 543 544 /// Clamp the information known for all returned values of a function 545 /// (identified by \p QueryingAA) into \p S. 546 template <typename AAType, typename StateType = typename AAType::StateType> 547 static void clampReturnedValueStates(Attributor &A, const AAType &QueryingAA, 548 StateType &S) { 549 LLVM_DEBUG(dbgs() << "[Attributor] Clamp return value states for " 550 << static_cast<const AbstractAttribute &>(QueryingAA) 551 << " into " << S << "\n"); 552 553 assert((QueryingAA.getIRPosition().getPositionKind() == 554 IRPosition::IRP_RETURNED || 555 QueryingAA.getIRPosition().getPositionKind() == 556 IRPosition::IRP_CALL_SITE_RETURNED) && 557 "Can only clamp returned value states for a function returned or call " 558 "site returned position!"); 559 560 // Use an optional state as there might not be any return values and we want 561 // to join (IntegerState::operator&) the state of all there are. 562 Optional<StateType> T; 563 564 // Callback for each possibly returned value. 565 auto CheckReturnValue = [&](Value &RV) -> bool { 566 const IRPosition &RVPos = IRPosition::value(RV); 567 const AAType &AA = A.getAAFor<AAType>(QueryingAA, RVPos); 568 LLVM_DEBUG(dbgs() << "[Attributor] RV: " << RV << " AA: " << AA.getAsStr() 569 << " @ " << RVPos << "\n"); 570 const StateType &AAS = static_cast<const StateType &>(AA.getState()); 571 if (T.hasValue()) 572 *T &= AAS; 573 else 574 T = AAS; 575 LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " RV State: " << T 576 << "\n"); 577 return T->isValidState(); 578 }; 579 580 if (!A.checkForAllReturnedValues(CheckReturnValue, QueryingAA)) 581 S.indicatePessimisticFixpoint(); 582 else if (T.hasValue()) 583 S ^= *T; 584 } 585 586 /// Helper class to compose two generic deduction 587 template <typename AAType, typename Base, typename StateType, 588 template <typename...> class F, template <typename...> class G> 589 struct AAComposeTwoGenericDeduction 590 : public F<AAType, G<AAType, Base, StateType>, StateType> { 591 AAComposeTwoGenericDeduction(const IRPosition &IRP) 592 : F<AAType, G<AAType, Base, StateType>, StateType>(IRP) {} 593 594 /// See AbstractAttribute::updateImpl(...). 595 ChangeStatus updateImpl(Attributor &A) override { 596 ChangeStatus ChangedF = F<AAType, G<AAType, Base, StateType>, StateType>::updateImpl(A); 597 ChangeStatus ChangedG = G<AAType, Base, StateType>::updateImpl(A); 598 return ChangedF | ChangedG; 599 } 600 }; 601 602 /// Helper class for generic deduction: return value -> returned position. 603 template <typename AAType, typename Base, 604 typename StateType = typename AAType::StateType> 605 struct AAReturnedFromReturnedValues : public Base { 606 AAReturnedFromReturnedValues(const IRPosition &IRP) : Base(IRP) {} 607 608 /// See AbstractAttribute::updateImpl(...). 609 ChangeStatus updateImpl(Attributor &A) override { 610 StateType S; 611 clampReturnedValueStates<AAType, StateType>(A, *this, S); 612 // TODO: If we know we visited all returned values, thus no are assumed 613 // dead, we can take the known information from the state T. 614 return clampStateAndIndicateChange<StateType>(this->getState(), S); 615 } 616 }; 617 618 /// Clamp the information known at all call sites for a given argument 619 /// (identified by \p QueryingAA) into \p S. 620 template <typename AAType, typename StateType = typename AAType::StateType> 621 static void clampCallSiteArgumentStates(Attributor &A, const AAType &QueryingAA, 622 StateType &S) { 623 LLVM_DEBUG(dbgs() << "[Attributor] Clamp call site argument states for " 624 << static_cast<const AbstractAttribute &>(QueryingAA) 625 << " into " << S << "\n"); 626 627 assert(QueryingAA.getIRPosition().getPositionKind() == 628 IRPosition::IRP_ARGUMENT && 629 "Can only clamp call site argument states for an argument position!"); 630 631 // Use an optional state as there might not be any return values and we want 632 // to join (IntegerState::operator&) the state of all there are. 633 Optional<StateType> T; 634 635 // The argument number which is also the call site argument number. 636 unsigned ArgNo = QueryingAA.getIRPosition().getArgNo(); 637 638 auto CallSiteCheck = [&](AbstractCallSite ACS) { 639 const IRPosition &ACSArgPos = IRPosition::callsite_argument(ACS, ArgNo); 640 // Check if a coresponding argument was found or if it is on not associated 641 // (which can happen for callback calls). 642 if (ACSArgPos.getPositionKind() == IRPosition::IRP_INVALID) 643 return false; 644 645 const AAType &AA = A.getAAFor<AAType>(QueryingAA, ACSArgPos); 646 LLVM_DEBUG(dbgs() << "[Attributor] ACS: " << *ACS.getInstruction() 647 << " AA: " << AA.getAsStr() << " @" << ACSArgPos << "\n"); 648 const StateType &AAS = static_cast<const StateType &>(AA.getState()); 649 if (T.hasValue()) 650 *T &= AAS; 651 else 652 T = AAS; 653 LLVM_DEBUG(dbgs() << "[Attributor] AA State: " << AAS << " CSA State: " << T 654 << "\n"); 655 return T->isValidState(); 656 }; 657 658 if (!A.checkForAllCallSites(CallSiteCheck, QueryingAA, true)) 659 S.indicatePessimisticFixpoint(); 660 else if (T.hasValue()) 661 S ^= *T; 662 } 663 664 /// Helper class for generic deduction: call site argument -> argument position. 665 template <typename AAType, typename Base, 666 typename StateType = typename AAType::StateType> 667 struct AAArgumentFromCallSiteArguments : public Base { 668 AAArgumentFromCallSiteArguments(const IRPosition &IRP) : Base(IRP) {} 669 670 /// See AbstractAttribute::updateImpl(...). 671 ChangeStatus updateImpl(Attributor &A) override { 672 StateType S; 673 clampCallSiteArgumentStates<AAType, StateType>(A, *this, S); 674 // TODO: If we know we visited all incoming values, thus no are assumed 675 // dead, we can take the known information from the state T. 676 return clampStateAndIndicateChange<StateType>(this->getState(), S); 677 } 678 }; 679 680 /// Helper class for generic replication: function returned -> cs returned. 681 template <typename AAType, typename Base, 682 typename StateType = typename AAType::StateType> 683 struct AACallSiteReturnedFromReturned : public Base { 684 AACallSiteReturnedFromReturned(const IRPosition &IRP) : Base(IRP) {} 685 686 /// See AbstractAttribute::updateImpl(...). 687 ChangeStatus updateImpl(Attributor &A) override { 688 assert(this->getIRPosition().getPositionKind() == 689 IRPosition::IRP_CALL_SITE_RETURNED && 690 "Can only wrap function returned positions for call site returned " 691 "positions!"); 692 auto &S = this->getState(); 693 694 const Function *AssociatedFunction = 695 this->getIRPosition().getAssociatedFunction(); 696 if (!AssociatedFunction) 697 return S.indicatePessimisticFixpoint(); 698 699 IRPosition FnPos = IRPosition::returned(*AssociatedFunction); 700 const AAType &AA = A.getAAFor<AAType>(*this, FnPos); 701 return clampStateAndIndicateChange( 702 S, static_cast<const typename AAType::StateType &>(AA.getState())); 703 } 704 }; 705 706 /// Helper class for generic deduction using must-be-executed-context 707 /// Base class is required to have `followUse` method. 708 709 /// bool followUse(Attributor &A, const Use *U, const Instruction *I) 710 /// U - Underlying use. 711 /// I - The user of the \p U. 712 /// `followUse` returns true if the value should be tracked transitively. 713 714 template <typename AAType, typename Base, 715 typename StateType = typename AAType::StateType> 716 struct AAFromMustBeExecutedContext : public Base { 717 AAFromMustBeExecutedContext(const IRPosition &IRP) : Base(IRP) {} 718 719 void initialize(Attributor &A) override { 720 Base::initialize(A); 721 IRPosition &IRP = this->getIRPosition(); 722 Instruction *CtxI = IRP.getCtxI(); 723 724 if (!CtxI) 725 return; 726 727 for (const Use &U : IRP.getAssociatedValue().uses()) 728 Uses.insert(&U); 729 } 730 731 /// See AbstractAttribute::updateImpl(...). 732 ChangeStatus updateImpl(Attributor &A) override { 733 auto BeforeState = this->getState(); 734 auto &S = this->getState(); 735 Instruction *CtxI = this->getIRPosition().getCtxI(); 736 if (!CtxI) 737 return ChangeStatus::UNCHANGED; 738 739 MustBeExecutedContextExplorer &Explorer = 740 A.getInfoCache().getMustBeExecutedContextExplorer(); 741 742 SetVector<const Use *> NextUses; 743 744 for (const Use *U : Uses) { 745 if (const Instruction *UserI = dyn_cast<Instruction>(U->getUser())) { 746 auto EIt = Explorer.begin(CtxI), EEnd = Explorer.end(CtxI); 747 bool Found = EIt.count(UserI); 748 while (!Found && ++EIt != EEnd) 749 Found = EIt.getCurrentInst() == UserI; 750 if (Found && Base::followUse(A, U, UserI)) 751 for (const Use &Us : UserI->uses()) 752 NextUses.insert(&Us); 753 } 754 } 755 for (const Use *U : NextUses) 756 Uses.insert(U); 757 758 return BeforeState == S ? ChangeStatus::UNCHANGED : ChangeStatus::CHANGED; 759 } 760 761 private: 762 /// Container for (transitive) uses of the associated value. 763 SetVector<const Use *> Uses; 764 }; 765 766 template <typename AAType, typename Base, 767 typename StateType = typename AAType::StateType> 768 using AAArgumentFromCallSiteArgumentsAndMustBeExecutedContext = 769 AAComposeTwoGenericDeduction<AAType, Base, StateType, 770 AAFromMustBeExecutedContext, 771 AAArgumentFromCallSiteArguments>; 772 773 template <typename AAType, typename Base, 774 typename StateType = typename AAType::StateType> 775 using AACallSiteReturnedFromReturnedAndMustBeExecutedContext = 776 AAComposeTwoGenericDeduction<AAType, Base, StateType, 777 AAFromMustBeExecutedContext, 778 AACallSiteReturnedFromReturned>; 779 780 /// -----------------------NoUnwind Function Attribute-------------------------- 781 782 struct AANoUnwindImpl : AANoUnwind { 783 AANoUnwindImpl(const IRPosition &IRP) : AANoUnwind(IRP) {} 784 785 const std::string getAsStr() const override { 786 return getAssumed() ? "nounwind" : "may-unwind"; 787 } 788 789 /// See AbstractAttribute::updateImpl(...). 790 ChangeStatus updateImpl(Attributor &A) override { 791 auto Opcodes = { 792 (unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr, 793 (unsigned)Instruction::Call, (unsigned)Instruction::CleanupRet, 794 (unsigned)Instruction::CatchSwitch, (unsigned)Instruction::Resume}; 795 796 auto CheckForNoUnwind = [&](Instruction &I) { 797 if (!I.mayThrow()) 798 return true; 799 800 if (ImmutableCallSite ICS = ImmutableCallSite(&I)) { 801 const auto &NoUnwindAA = 802 A.getAAFor<AANoUnwind>(*this, IRPosition::callsite_function(ICS)); 803 return NoUnwindAA.isAssumedNoUnwind(); 804 } 805 return false; 806 }; 807 808 if (!A.checkForAllInstructions(CheckForNoUnwind, *this, Opcodes)) 809 return indicatePessimisticFixpoint(); 810 811 return ChangeStatus::UNCHANGED; 812 } 813 }; 814 815 struct AANoUnwindFunction final : public AANoUnwindImpl { 816 AANoUnwindFunction(const IRPosition &IRP) : AANoUnwindImpl(IRP) {} 817 818 /// See AbstractAttribute::trackStatistics() 819 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nounwind) } 820 }; 821 822 /// NoUnwind attribute deduction for a call sites. 823 struct AANoUnwindCallSite final : AANoUnwindImpl { 824 AANoUnwindCallSite(const IRPosition &IRP) : AANoUnwindImpl(IRP) {} 825 826 /// See AbstractAttribute::initialize(...). 827 void initialize(Attributor &A) override { 828 AANoUnwindImpl::initialize(A); 829 Function *F = getAssociatedFunction(); 830 if (!F) 831 indicatePessimisticFixpoint(); 832 } 833 834 /// See AbstractAttribute::updateImpl(...). 835 ChangeStatus updateImpl(Attributor &A) override { 836 // TODO: Once we have call site specific value information we can provide 837 // call site specific liveness information and then it makes 838 // sense to specialize attributes for call sites arguments instead of 839 // redirecting requests to the callee argument. 840 Function *F = getAssociatedFunction(); 841 const IRPosition &FnPos = IRPosition::function(*F); 842 auto &FnAA = A.getAAFor<AANoUnwind>(*this, FnPos); 843 return clampStateAndIndicateChange( 844 getState(), 845 static_cast<const AANoUnwind::StateType &>(FnAA.getState())); 846 } 847 848 /// See AbstractAttribute::trackStatistics() 849 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nounwind); } 850 }; 851 852 /// --------------------- Function Return Values ------------------------------- 853 854 /// "Attribute" that collects all potential returned values and the return 855 /// instructions that they arise from. 856 /// 857 /// If there is a unique returned value R, the manifest method will: 858 /// - mark R with the "returned" attribute, if R is an argument. 859 class AAReturnedValuesImpl : public AAReturnedValues, public AbstractState { 860 861 /// Mapping of values potentially returned by the associated function to the 862 /// return instructions that might return them. 863 MapVector<Value *, SmallSetVector<ReturnInst *, 4>> ReturnedValues; 864 865 /// Mapping to remember the number of returned values for a call site such 866 /// that we can avoid updates if nothing changed. 867 DenseMap<const CallBase *, unsigned> NumReturnedValuesPerKnownAA; 868 869 /// Set of unresolved calls returned by the associated function. 870 SmallSetVector<CallBase *, 4> UnresolvedCalls; 871 872 /// State flags 873 /// 874 ///{ 875 bool IsFixed = false; 876 bool IsValidState = true; 877 ///} 878 879 public: 880 AAReturnedValuesImpl(const IRPosition &IRP) : AAReturnedValues(IRP) {} 881 882 /// See AbstractAttribute::initialize(...). 883 void initialize(Attributor &A) override { 884 // Reset the state. 885 IsFixed = false; 886 IsValidState = true; 887 ReturnedValues.clear(); 888 889 Function *F = getAssociatedFunction(); 890 if (!F) { 891 indicatePessimisticFixpoint(); 892 return; 893 } 894 895 // The map from instruction opcodes to those instructions in the function. 896 auto &OpcodeInstMap = A.getInfoCache().getOpcodeInstMapForFunction(*F); 897 898 // Look through all arguments, if one is marked as returned we are done. 899 for (Argument &Arg : F->args()) { 900 if (Arg.hasReturnedAttr()) { 901 auto &ReturnInstSet = ReturnedValues[&Arg]; 902 for (Instruction *RI : OpcodeInstMap[Instruction::Ret]) 903 ReturnInstSet.insert(cast<ReturnInst>(RI)); 904 905 indicateOptimisticFixpoint(); 906 return; 907 } 908 } 909 910 if (!F->hasExactDefinition()) 911 indicatePessimisticFixpoint(); 912 } 913 914 /// See AbstractAttribute::manifest(...). 915 ChangeStatus manifest(Attributor &A) override; 916 917 /// See AbstractAttribute::getState(...). 918 AbstractState &getState() override { return *this; } 919 920 /// See AbstractAttribute::getState(...). 921 const AbstractState &getState() const override { return *this; } 922 923 /// See AbstractAttribute::updateImpl(Attributor &A). 924 ChangeStatus updateImpl(Attributor &A) override; 925 926 llvm::iterator_range<iterator> returned_values() override { 927 return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end()); 928 } 929 930 llvm::iterator_range<const_iterator> returned_values() const override { 931 return llvm::make_range(ReturnedValues.begin(), ReturnedValues.end()); 932 } 933 934 const SmallSetVector<CallBase *, 4> &getUnresolvedCalls() const override { 935 return UnresolvedCalls; 936 } 937 938 /// Return the number of potential return values, -1 if unknown. 939 size_t getNumReturnValues() const override { 940 return isValidState() ? ReturnedValues.size() : -1; 941 } 942 943 /// Return an assumed unique return value if a single candidate is found. If 944 /// there cannot be one, return a nullptr. If it is not clear yet, return the 945 /// Optional::NoneType. 946 Optional<Value *> getAssumedUniqueReturnValue(Attributor &A) const; 947 948 /// See AbstractState::checkForAllReturnedValues(...). 949 bool checkForAllReturnedValuesAndReturnInsts( 950 const function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> 951 &Pred) const override; 952 953 /// Pretty print the attribute similar to the IR representation. 954 const std::string getAsStr() const override; 955 956 /// See AbstractState::isAtFixpoint(). 957 bool isAtFixpoint() const override { return IsFixed; } 958 959 /// See AbstractState::isValidState(). 960 bool isValidState() const override { return IsValidState; } 961 962 /// See AbstractState::indicateOptimisticFixpoint(...). 963 ChangeStatus indicateOptimisticFixpoint() override { 964 IsFixed = true; 965 return ChangeStatus::UNCHANGED; 966 } 967 968 ChangeStatus indicatePessimisticFixpoint() override { 969 IsFixed = true; 970 IsValidState = false; 971 return ChangeStatus::CHANGED; 972 } 973 }; 974 975 ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) { 976 ChangeStatus Changed = ChangeStatus::UNCHANGED; 977 978 // Bookkeeping. 979 assert(isValidState()); 980 STATS_DECLTRACK(KnownReturnValues, FunctionReturn, 981 "Number of function with known return values"); 982 983 // Check if we have an assumed unique return value that we could manifest. 984 Optional<Value *> UniqueRV = getAssumedUniqueReturnValue(A); 985 986 if (!UniqueRV.hasValue() || !UniqueRV.getValue()) 987 return Changed; 988 989 // Bookkeeping. 990 STATS_DECLTRACK(UniqueReturnValue, FunctionReturn, 991 "Number of function with unique return"); 992 993 // Callback to replace the uses of CB with the constant C. 994 auto ReplaceCallSiteUsersWith = [](CallBase &CB, Constant &C) { 995 if (CB.getNumUses() == 0 || CB.isMustTailCall()) 996 return ChangeStatus::UNCHANGED; 997 CB.replaceAllUsesWith(&C); 998 return ChangeStatus::CHANGED; 999 }; 1000 1001 // If the assumed unique return value is an argument, annotate it. 1002 if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) { 1003 getIRPosition() = IRPosition::argument(*UniqueRVArg); 1004 Changed = IRAttribute::manifest(A); 1005 } else if (auto *RVC = dyn_cast<Constant>(UniqueRV.getValue())) { 1006 // We can replace the returned value with the unique returned constant. 1007 Value &AnchorValue = getAnchorValue(); 1008 if (Function *F = dyn_cast<Function>(&AnchorValue)) { 1009 for (const Use &U : F->uses()) 1010 if (CallBase *CB = dyn_cast<CallBase>(U.getUser())) 1011 if (CB->isCallee(&U)) { 1012 Constant *RVCCast = 1013 ConstantExpr::getTruncOrBitCast(RVC, CB->getType()); 1014 Changed = ReplaceCallSiteUsersWith(*CB, *RVCCast) | Changed; 1015 } 1016 } else { 1017 assert(isa<CallBase>(AnchorValue) && 1018 "Expcected a function or call base anchor!"); 1019 Constant *RVCCast = 1020 ConstantExpr::getTruncOrBitCast(RVC, AnchorValue.getType()); 1021 Changed = ReplaceCallSiteUsersWith(cast<CallBase>(AnchorValue), *RVCCast); 1022 } 1023 if (Changed == ChangeStatus::CHANGED) 1024 STATS_DECLTRACK(UniqueConstantReturnValue, FunctionReturn, 1025 "Number of function returns replaced by constant return"); 1026 } 1027 1028 return Changed; 1029 } 1030 1031 const std::string AAReturnedValuesImpl::getAsStr() const { 1032 return (isAtFixpoint() ? "returns(#" : "may-return(#") + 1033 (isValidState() ? std::to_string(getNumReturnValues()) : "?") + 1034 ")[#UC: " + std::to_string(UnresolvedCalls.size()) + "]"; 1035 } 1036 1037 Optional<Value *> 1038 AAReturnedValuesImpl::getAssumedUniqueReturnValue(Attributor &A) const { 1039 // If checkForAllReturnedValues provides a unique value, ignoring potential 1040 // undef values that can also be present, it is assumed to be the actual 1041 // return value and forwarded to the caller of this method. If there are 1042 // multiple, a nullptr is returned indicating there cannot be a unique 1043 // returned value. 1044 Optional<Value *> UniqueRV; 1045 1046 auto Pred = [&](Value &RV) -> bool { 1047 // If we found a second returned value and neither the current nor the saved 1048 // one is an undef, there is no unique returned value. Undefs are special 1049 // since we can pretend they have any value. 1050 if (UniqueRV.hasValue() && UniqueRV != &RV && 1051 !(isa<UndefValue>(RV) || isa<UndefValue>(UniqueRV.getValue()))) { 1052 UniqueRV = nullptr; 1053 return false; 1054 } 1055 1056 // Do not overwrite a value with an undef. 1057 if (!UniqueRV.hasValue() || !isa<UndefValue>(RV)) 1058 UniqueRV = &RV; 1059 1060 return true; 1061 }; 1062 1063 if (!A.checkForAllReturnedValues(Pred, *this)) 1064 UniqueRV = nullptr; 1065 1066 return UniqueRV; 1067 } 1068 1069 bool AAReturnedValuesImpl::checkForAllReturnedValuesAndReturnInsts( 1070 const function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> 1071 &Pred) const { 1072 if (!isValidState()) 1073 return false; 1074 1075 // Check all returned values but ignore call sites as long as we have not 1076 // encountered an overdefined one during an update. 1077 for (auto &It : ReturnedValues) { 1078 Value *RV = It.first; 1079 1080 CallBase *CB = dyn_cast<CallBase>(RV); 1081 if (CB && !UnresolvedCalls.count(CB)) 1082 continue; 1083 1084 if (!Pred(*RV, It.second)) 1085 return false; 1086 } 1087 1088 return true; 1089 } 1090 1091 ChangeStatus AAReturnedValuesImpl::updateImpl(Attributor &A) { 1092 size_t NumUnresolvedCalls = UnresolvedCalls.size(); 1093 bool Changed = false; 1094 1095 // State used in the value traversals starting in returned values. 1096 struct RVState { 1097 // The map in which we collect return values -> return instrs. 1098 decltype(ReturnedValues) &RetValsMap; 1099 // The flag to indicate a change. 1100 bool &Changed; 1101 // The return instrs we come from. 1102 SmallSetVector<ReturnInst *, 4> RetInsts; 1103 }; 1104 1105 // Callback for a leaf value returned by the associated function. 1106 auto VisitValueCB = [](Value &Val, RVState &RVS, bool) -> bool { 1107 auto Size = RVS.RetValsMap[&Val].size(); 1108 RVS.RetValsMap[&Val].insert(RVS.RetInsts.begin(), RVS.RetInsts.end()); 1109 bool Inserted = RVS.RetValsMap[&Val].size() != Size; 1110 RVS.Changed |= Inserted; 1111 LLVM_DEBUG({ 1112 if (Inserted) 1113 dbgs() << "[AAReturnedValues] 1 Add new returned value " << Val 1114 << " => " << RVS.RetInsts.size() << "\n"; 1115 }); 1116 return true; 1117 }; 1118 1119 // Helper method to invoke the generic value traversal. 1120 auto VisitReturnedValue = [&](Value &RV, RVState &RVS) { 1121 IRPosition RetValPos = IRPosition::value(RV); 1122 return genericValueTraversal<AAReturnedValues, RVState>(A, RetValPos, *this, 1123 RVS, VisitValueCB); 1124 }; 1125 1126 // Callback for all "return intructions" live in the associated function. 1127 auto CheckReturnInst = [this, &VisitReturnedValue, &Changed](Instruction &I) { 1128 ReturnInst &Ret = cast<ReturnInst>(I); 1129 RVState RVS({ReturnedValues, Changed, {}}); 1130 RVS.RetInsts.insert(&Ret); 1131 return VisitReturnedValue(*Ret.getReturnValue(), RVS); 1132 }; 1133 1134 // Start by discovering returned values from all live returned instructions in 1135 // the associated function. 1136 if (!A.checkForAllInstructions(CheckReturnInst, *this, {Instruction::Ret})) 1137 return indicatePessimisticFixpoint(); 1138 1139 // Once returned values "directly" present in the code are handled we try to 1140 // resolve returned calls. 1141 decltype(ReturnedValues) NewRVsMap; 1142 for (auto &It : ReturnedValues) { 1143 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Returned value: " << *It.first 1144 << " by #" << It.second.size() << " RIs\n"); 1145 CallBase *CB = dyn_cast<CallBase>(It.first); 1146 if (!CB || UnresolvedCalls.count(CB)) 1147 continue; 1148 1149 if (!CB->getCalledFunction()) { 1150 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Unresolved call: " << *CB 1151 << "\n"); 1152 UnresolvedCalls.insert(CB); 1153 continue; 1154 } 1155 1156 // TODO: use the function scope once we have call site AAReturnedValues. 1157 const auto &RetValAA = A.getAAFor<AAReturnedValues>( 1158 *this, IRPosition::function(*CB->getCalledFunction())); 1159 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Found another AAReturnedValues: " 1160 << static_cast<const AbstractAttribute &>(RetValAA) 1161 << "\n"); 1162 1163 // Skip dead ends, thus if we do not know anything about the returned 1164 // call we mark it as unresolved and it will stay that way. 1165 if (!RetValAA.getState().isValidState()) { 1166 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Unresolved call: " << *CB 1167 << "\n"); 1168 UnresolvedCalls.insert(CB); 1169 continue; 1170 } 1171 1172 // Do not try to learn partial information. If the callee has unresolved 1173 // return values we will treat the call as unresolved/opaque. 1174 auto &RetValAAUnresolvedCalls = RetValAA.getUnresolvedCalls(); 1175 if (!RetValAAUnresolvedCalls.empty()) { 1176 UnresolvedCalls.insert(CB); 1177 continue; 1178 } 1179 1180 // Now check if we can track transitively returned values. If possible, thus 1181 // if all return value can be represented in the current scope, do so. 1182 bool Unresolved = false; 1183 for (auto &RetValAAIt : RetValAA.returned_values()) { 1184 Value *RetVal = RetValAAIt.first; 1185 if (isa<Argument>(RetVal) || isa<CallBase>(RetVal) || 1186 isa<Constant>(RetVal)) 1187 continue; 1188 // Anything that did not fit in the above categories cannot be resolved, 1189 // mark the call as unresolved. 1190 LLVM_DEBUG(dbgs() << "[AAReturnedValues] transitively returned value " 1191 "cannot be translated: " 1192 << *RetVal << "\n"); 1193 UnresolvedCalls.insert(CB); 1194 Unresolved = true; 1195 break; 1196 } 1197 1198 if (Unresolved) 1199 continue; 1200 1201 // Now track transitively returned values. 1202 unsigned &NumRetAA = NumReturnedValuesPerKnownAA[CB]; 1203 if (NumRetAA == RetValAA.getNumReturnValues()) { 1204 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Skip call as it has not " 1205 "changed since it was seen last\n"); 1206 continue; 1207 } 1208 NumRetAA = RetValAA.getNumReturnValues(); 1209 1210 for (auto &RetValAAIt : RetValAA.returned_values()) { 1211 Value *RetVal = RetValAAIt.first; 1212 if (Argument *Arg = dyn_cast<Argument>(RetVal)) { 1213 // Arguments are mapped to call site operands and we begin the traversal 1214 // again. 1215 bool Unused = false; 1216 RVState RVS({NewRVsMap, Unused, RetValAAIt.second}); 1217 VisitReturnedValue(*CB->getArgOperand(Arg->getArgNo()), RVS); 1218 continue; 1219 } else if (isa<CallBase>(RetVal)) { 1220 // Call sites are resolved by the callee attribute over time, no need to 1221 // do anything for us. 1222 continue; 1223 } else if (isa<Constant>(RetVal)) { 1224 // Constants are valid everywhere, we can simply take them. 1225 NewRVsMap[RetVal].insert(It.second.begin(), It.second.end()); 1226 continue; 1227 } 1228 } 1229 } 1230 1231 // To avoid modifications to the ReturnedValues map while we iterate over it 1232 // we kept record of potential new entries in a copy map, NewRVsMap. 1233 for (auto &It : NewRVsMap) { 1234 assert(!It.second.empty() && "Entry does not add anything."); 1235 auto &ReturnInsts = ReturnedValues[It.first]; 1236 for (ReturnInst *RI : It.second) 1237 if (ReturnInsts.insert(RI)) { 1238 LLVM_DEBUG(dbgs() << "[AAReturnedValues] Add new returned value " 1239 << *It.first << " => " << *RI << "\n"); 1240 Changed = true; 1241 } 1242 } 1243 1244 Changed |= (NumUnresolvedCalls != UnresolvedCalls.size()); 1245 return Changed ? ChangeStatus::CHANGED : ChangeStatus::UNCHANGED; 1246 } 1247 1248 struct AAReturnedValuesFunction final : public AAReturnedValuesImpl { 1249 AAReturnedValuesFunction(const IRPosition &IRP) : AAReturnedValuesImpl(IRP) {} 1250 1251 /// See AbstractAttribute::trackStatistics() 1252 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(returned) } 1253 }; 1254 1255 /// Returned values information for a call sites. 1256 struct AAReturnedValuesCallSite final : AAReturnedValuesImpl { 1257 AAReturnedValuesCallSite(const IRPosition &IRP) : AAReturnedValuesImpl(IRP) {} 1258 1259 /// See AbstractAttribute::initialize(...). 1260 void initialize(Attributor &A) override { 1261 // TODO: Once we have call site specific value information we can provide 1262 // call site specific liveness information and then it makes 1263 // sense to specialize attributes for call sites instead of 1264 // redirecting requests to the callee. 1265 llvm_unreachable("Abstract attributes for returned values are not " 1266 "supported for call sites yet!"); 1267 } 1268 1269 /// See AbstractAttribute::updateImpl(...). 1270 ChangeStatus updateImpl(Attributor &A) override { 1271 return indicatePessimisticFixpoint(); 1272 } 1273 1274 /// See AbstractAttribute::trackStatistics() 1275 void trackStatistics() const override {} 1276 }; 1277 1278 /// ------------------------ NoSync Function Attribute ------------------------- 1279 1280 struct AANoSyncImpl : AANoSync { 1281 AANoSyncImpl(const IRPosition &IRP) : AANoSync(IRP) {} 1282 1283 const std::string getAsStr() const override { 1284 return getAssumed() ? "nosync" : "may-sync"; 1285 } 1286 1287 /// See AbstractAttribute::updateImpl(...). 1288 ChangeStatus updateImpl(Attributor &A) override; 1289 1290 /// Helper function used to determine whether an instruction is non-relaxed 1291 /// atomic. In other words, if an atomic instruction does not have unordered 1292 /// or monotonic ordering 1293 static bool isNonRelaxedAtomic(Instruction *I); 1294 1295 /// Helper function used to determine whether an instruction is volatile. 1296 static bool isVolatile(Instruction *I); 1297 1298 /// Helper function uset to check if intrinsic is volatile (memcpy, memmove, 1299 /// memset). 1300 static bool isNoSyncIntrinsic(Instruction *I); 1301 }; 1302 1303 bool AANoSyncImpl::isNonRelaxedAtomic(Instruction *I) { 1304 if (!I->isAtomic()) 1305 return false; 1306 1307 AtomicOrdering Ordering; 1308 switch (I->getOpcode()) { 1309 case Instruction::AtomicRMW: 1310 Ordering = cast<AtomicRMWInst>(I)->getOrdering(); 1311 break; 1312 case Instruction::Store: 1313 Ordering = cast<StoreInst>(I)->getOrdering(); 1314 break; 1315 case Instruction::Load: 1316 Ordering = cast<LoadInst>(I)->getOrdering(); 1317 break; 1318 case Instruction::Fence: { 1319 auto *FI = cast<FenceInst>(I); 1320 if (FI->getSyncScopeID() == SyncScope::SingleThread) 1321 return false; 1322 Ordering = FI->getOrdering(); 1323 break; 1324 } 1325 case Instruction::AtomicCmpXchg: { 1326 AtomicOrdering Success = cast<AtomicCmpXchgInst>(I)->getSuccessOrdering(); 1327 AtomicOrdering Failure = cast<AtomicCmpXchgInst>(I)->getFailureOrdering(); 1328 // Only if both are relaxed, than it can be treated as relaxed. 1329 // Otherwise it is non-relaxed. 1330 if (Success != AtomicOrdering::Unordered && 1331 Success != AtomicOrdering::Monotonic) 1332 return true; 1333 if (Failure != AtomicOrdering::Unordered && 1334 Failure != AtomicOrdering::Monotonic) 1335 return true; 1336 return false; 1337 } 1338 default: 1339 llvm_unreachable( 1340 "New atomic operations need to be known in the attributor."); 1341 } 1342 1343 // Relaxed. 1344 if (Ordering == AtomicOrdering::Unordered || 1345 Ordering == AtomicOrdering::Monotonic) 1346 return false; 1347 return true; 1348 } 1349 1350 /// Checks if an intrinsic is nosync. Currently only checks mem* intrinsics. 1351 /// FIXME: We should ipmrove the handling of intrinsics. 1352 bool AANoSyncImpl::isNoSyncIntrinsic(Instruction *I) { 1353 if (auto *II = dyn_cast<IntrinsicInst>(I)) { 1354 switch (II->getIntrinsicID()) { 1355 /// Element wise atomic memory intrinsics are can only be unordered, 1356 /// therefore nosync. 1357 case Intrinsic::memset_element_unordered_atomic: 1358 case Intrinsic::memmove_element_unordered_atomic: 1359 case Intrinsic::memcpy_element_unordered_atomic: 1360 return true; 1361 case Intrinsic::memset: 1362 case Intrinsic::memmove: 1363 case Intrinsic::memcpy: 1364 if (!cast<MemIntrinsic>(II)->isVolatile()) 1365 return true; 1366 return false; 1367 default: 1368 return false; 1369 } 1370 } 1371 return false; 1372 } 1373 1374 bool AANoSyncImpl::isVolatile(Instruction *I) { 1375 assert(!ImmutableCallSite(I) && !isa<CallBase>(I) && 1376 "Calls should not be checked here"); 1377 1378 switch (I->getOpcode()) { 1379 case Instruction::AtomicRMW: 1380 return cast<AtomicRMWInst>(I)->isVolatile(); 1381 case Instruction::Store: 1382 return cast<StoreInst>(I)->isVolatile(); 1383 case Instruction::Load: 1384 return cast<LoadInst>(I)->isVolatile(); 1385 case Instruction::AtomicCmpXchg: 1386 return cast<AtomicCmpXchgInst>(I)->isVolatile(); 1387 default: 1388 return false; 1389 } 1390 } 1391 1392 ChangeStatus AANoSyncImpl::updateImpl(Attributor &A) { 1393 1394 auto CheckRWInstForNoSync = [&](Instruction &I) { 1395 /// We are looking for volatile instructions or Non-Relaxed atomics. 1396 /// FIXME: We should ipmrove the handling of intrinsics. 1397 1398 if (isa<IntrinsicInst>(&I) && isNoSyncIntrinsic(&I)) 1399 return true; 1400 1401 if (ImmutableCallSite ICS = ImmutableCallSite(&I)) { 1402 if (ICS.hasFnAttr(Attribute::NoSync)) 1403 return true; 1404 1405 const auto &NoSyncAA = 1406 A.getAAFor<AANoSync>(*this, IRPosition::callsite_function(ICS)); 1407 if (NoSyncAA.isAssumedNoSync()) 1408 return true; 1409 return false; 1410 } 1411 1412 if (!isVolatile(&I) && !isNonRelaxedAtomic(&I)) 1413 return true; 1414 1415 return false; 1416 }; 1417 1418 auto CheckForNoSync = [&](Instruction &I) { 1419 // At this point we handled all read/write effects and they are all 1420 // nosync, so they can be skipped. 1421 if (I.mayReadOrWriteMemory()) 1422 return true; 1423 1424 // non-convergent and readnone imply nosync. 1425 return !ImmutableCallSite(&I).isConvergent(); 1426 }; 1427 1428 if (!A.checkForAllReadWriteInstructions(CheckRWInstForNoSync, *this) || 1429 !A.checkForAllCallLikeInstructions(CheckForNoSync, *this)) 1430 return indicatePessimisticFixpoint(); 1431 1432 return ChangeStatus::UNCHANGED; 1433 } 1434 1435 struct AANoSyncFunction final : public AANoSyncImpl { 1436 AANoSyncFunction(const IRPosition &IRP) : AANoSyncImpl(IRP) {} 1437 1438 /// See AbstractAttribute::trackStatistics() 1439 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nosync) } 1440 }; 1441 1442 /// NoSync attribute deduction for a call sites. 1443 struct AANoSyncCallSite final : AANoSyncImpl { 1444 AANoSyncCallSite(const IRPosition &IRP) : AANoSyncImpl(IRP) {} 1445 1446 /// See AbstractAttribute::initialize(...). 1447 void initialize(Attributor &A) override { 1448 AANoSyncImpl::initialize(A); 1449 Function *F = getAssociatedFunction(); 1450 if (!F) 1451 indicatePessimisticFixpoint(); 1452 } 1453 1454 /// See AbstractAttribute::updateImpl(...). 1455 ChangeStatus updateImpl(Attributor &A) override { 1456 // TODO: Once we have call site specific value information we can provide 1457 // call site specific liveness information and then it makes 1458 // sense to specialize attributes for call sites arguments instead of 1459 // redirecting requests to the callee argument. 1460 Function *F = getAssociatedFunction(); 1461 const IRPosition &FnPos = IRPosition::function(*F); 1462 auto &FnAA = A.getAAFor<AANoSync>(*this, FnPos); 1463 return clampStateAndIndicateChange( 1464 getState(), static_cast<const AANoSync::StateType &>(FnAA.getState())); 1465 } 1466 1467 /// See AbstractAttribute::trackStatistics() 1468 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nosync); } 1469 }; 1470 1471 /// ------------------------ No-Free Attributes ---------------------------- 1472 1473 struct AANoFreeImpl : public AANoFree { 1474 AANoFreeImpl(const IRPosition &IRP) : AANoFree(IRP) {} 1475 1476 /// See AbstractAttribute::updateImpl(...). 1477 ChangeStatus updateImpl(Attributor &A) override { 1478 auto CheckForNoFree = [&](Instruction &I) { 1479 ImmutableCallSite ICS(&I); 1480 if (ICS.hasFnAttr(Attribute::NoFree)) 1481 return true; 1482 1483 const auto &NoFreeAA = 1484 A.getAAFor<AANoFree>(*this, IRPosition::callsite_function(ICS)); 1485 return NoFreeAA.isAssumedNoFree(); 1486 }; 1487 1488 if (!A.checkForAllCallLikeInstructions(CheckForNoFree, *this)) 1489 return indicatePessimisticFixpoint(); 1490 return ChangeStatus::UNCHANGED; 1491 } 1492 1493 /// See AbstractAttribute::getAsStr(). 1494 const std::string getAsStr() const override { 1495 return getAssumed() ? "nofree" : "may-free"; 1496 } 1497 }; 1498 1499 struct AANoFreeFunction final : public AANoFreeImpl { 1500 AANoFreeFunction(const IRPosition &IRP) : AANoFreeImpl(IRP) {} 1501 1502 /// See AbstractAttribute::trackStatistics() 1503 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(nofree) } 1504 }; 1505 1506 /// NoFree attribute deduction for a call sites. 1507 struct AANoFreeCallSite final : AANoFreeImpl { 1508 AANoFreeCallSite(const IRPosition &IRP) : AANoFreeImpl(IRP) {} 1509 1510 /// See AbstractAttribute::initialize(...). 1511 void initialize(Attributor &A) override { 1512 AANoFreeImpl::initialize(A); 1513 Function *F = getAssociatedFunction(); 1514 if (!F) 1515 indicatePessimisticFixpoint(); 1516 } 1517 1518 /// See AbstractAttribute::updateImpl(...). 1519 ChangeStatus updateImpl(Attributor &A) override { 1520 // TODO: Once we have call site specific value information we can provide 1521 // call site specific liveness information and then it makes 1522 // sense to specialize attributes for call sites arguments instead of 1523 // redirecting requests to the callee argument. 1524 Function *F = getAssociatedFunction(); 1525 const IRPosition &FnPos = IRPosition::function(*F); 1526 auto &FnAA = A.getAAFor<AANoFree>(*this, FnPos); 1527 return clampStateAndIndicateChange( 1528 getState(), static_cast<const AANoFree::StateType &>(FnAA.getState())); 1529 } 1530 1531 /// See AbstractAttribute::trackStatistics() 1532 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(nofree); } 1533 }; 1534 1535 /// ------------------------ NonNull Argument Attribute ------------------------ 1536 static int64_t getKnownNonNullAndDerefBytesForUse( 1537 Attributor &A, AbstractAttribute &QueryingAA, Value &AssociatedValue, 1538 const Use *U, const Instruction *I, bool &IsNonNull, bool &TrackUse) { 1539 TrackUse = false; 1540 1541 const Value *UseV = U->get(); 1542 if (!UseV->getType()->isPointerTy()) 1543 return 0; 1544 1545 Type *PtrTy = UseV->getType(); 1546 const Function *F = I->getFunction(); 1547 bool NullPointerIsDefined = 1548 F ? llvm::NullPointerIsDefined(F, PtrTy->getPointerAddressSpace()) : true; 1549 const DataLayout &DL = A.getInfoCache().getDL(); 1550 if (ImmutableCallSite ICS = ImmutableCallSite(I)) { 1551 if (ICS.isBundleOperand(U)) 1552 return 0; 1553 1554 if (ICS.isCallee(U)) { 1555 IsNonNull |= !NullPointerIsDefined; 1556 return 0; 1557 } 1558 1559 unsigned ArgNo = ICS.getArgumentNo(U); 1560 IRPosition IRP = IRPosition::callsite_argument(ICS, ArgNo); 1561 auto &DerefAA = A.getAAFor<AADereferenceable>(QueryingAA, IRP); 1562 IsNonNull |= DerefAA.isKnownNonNull(); 1563 return DerefAA.getKnownDereferenceableBytes(); 1564 } 1565 1566 int64_t Offset; 1567 if (const Value *Base = getBasePointerOfAccessPointerOperand(I, Offset, DL)) { 1568 if (Base == &AssociatedValue && getPointerOperand(I) == UseV) { 1569 int64_t DerefBytes = 1570 Offset + (int64_t)DL.getTypeStoreSize(PtrTy->getPointerElementType()); 1571 1572 IsNonNull |= !NullPointerIsDefined; 1573 return DerefBytes; 1574 } 1575 } 1576 if (const Value *Base = 1577 GetPointerBaseWithConstantOffset(UseV, Offset, DL, 1578 /*AllowNonInbounds*/ false)) { 1579 auto &DerefAA = 1580 A.getAAFor<AADereferenceable>(QueryingAA, IRPosition::value(*Base)); 1581 IsNonNull |= (!NullPointerIsDefined && DerefAA.isKnownNonNull()); 1582 IsNonNull |= (!NullPointerIsDefined && (Offset != 0)); 1583 int64_t DerefBytes = DerefAA.getKnownDereferenceableBytes(); 1584 return std::max(int64_t(0), DerefBytes - Offset); 1585 } 1586 1587 return 0; 1588 } 1589 1590 struct AANonNullImpl : AANonNull { 1591 AANonNullImpl(const IRPosition &IRP) 1592 : AANonNull(IRP), 1593 NullIsDefined(NullPointerIsDefined( 1594 getAnchorScope(), 1595 getAssociatedValue().getType()->getPointerAddressSpace())) {} 1596 1597 /// See AbstractAttribute::initialize(...). 1598 void initialize(Attributor &A) override { 1599 if (!NullIsDefined && 1600 hasAttr({Attribute::NonNull, Attribute::Dereferenceable})) 1601 indicateOptimisticFixpoint(); 1602 else 1603 AANonNull::initialize(A); 1604 } 1605 1606 /// See AAFromMustBeExecutedContext 1607 bool followUse(Attributor &A, const Use *U, const Instruction *I) { 1608 bool IsNonNull = false; 1609 bool TrackUse = false; 1610 getKnownNonNullAndDerefBytesForUse(A, *this, getAssociatedValue(), U, I, 1611 IsNonNull, TrackUse); 1612 takeKnownMaximum(IsNonNull); 1613 return TrackUse; 1614 } 1615 1616 /// See AbstractAttribute::getAsStr(). 1617 const std::string getAsStr() const override { 1618 return getAssumed() ? "nonnull" : "may-null"; 1619 } 1620 1621 /// Flag to determine if the underlying value can be null and still allow 1622 /// valid accesses. 1623 const bool NullIsDefined; 1624 }; 1625 1626 /// NonNull attribute for a floating value. 1627 struct AANonNullFloating 1628 : AAFromMustBeExecutedContext<AANonNull, AANonNullImpl> { 1629 using Base = AAFromMustBeExecutedContext<AANonNull, AANonNullImpl>; 1630 AANonNullFloating(const IRPosition &IRP) : Base(IRP) {} 1631 1632 /// See AbstractAttribute::initialize(...). 1633 void initialize(Attributor &A) override { 1634 Base::initialize(A); 1635 1636 if (isAtFixpoint()) 1637 return; 1638 1639 const IRPosition &IRP = getIRPosition(); 1640 const Value &V = IRP.getAssociatedValue(); 1641 const DataLayout &DL = A.getDataLayout(); 1642 1643 // TODO: This context sensitive query should be removed once we can do 1644 // context sensitive queries in the genericValueTraversal below. 1645 if (isKnownNonZero(&V, DL, 0, /* TODO: AC */ nullptr, IRP.getCtxI(), 1646 /* TODO: DT */ nullptr)) 1647 indicateOptimisticFixpoint(); 1648 } 1649 1650 /// See AbstractAttribute::updateImpl(...). 1651 ChangeStatus updateImpl(Attributor &A) override { 1652 ChangeStatus Change = Base::updateImpl(A); 1653 if (isKnownNonNull()) 1654 return Change; 1655 1656 if (!NullIsDefined) { 1657 const auto &DerefAA = A.getAAFor<AADereferenceable>(*this, getIRPosition()); 1658 if (DerefAA.getAssumedDereferenceableBytes()) 1659 return Change; 1660 } 1661 1662 const DataLayout &DL = A.getDataLayout(); 1663 1664 auto VisitValueCB = [&](Value &V, AAAlign::StateType &T, 1665 bool Stripped) -> bool { 1666 const auto &AA = A.getAAFor<AANonNull>(*this, IRPosition::value(V)); 1667 if (!Stripped && this == &AA) { 1668 if (!isKnownNonZero(&V, DL, 0, /* TODO: AC */ nullptr, 1669 /* CtxI */ getCtxI(), 1670 /* TODO: DT */ nullptr)) 1671 T.indicatePessimisticFixpoint(); 1672 } else { 1673 // Use abstract attribute information. 1674 const AANonNull::StateType &NS = 1675 static_cast<const AANonNull::StateType &>(AA.getState()); 1676 T ^= NS; 1677 } 1678 return T.isValidState(); 1679 }; 1680 1681 StateType T; 1682 if (!genericValueTraversal<AANonNull, StateType>(A, getIRPosition(), *this, 1683 T, VisitValueCB)) 1684 return indicatePessimisticFixpoint(); 1685 1686 return clampStateAndIndicateChange(getState(), T); 1687 } 1688 1689 /// See AbstractAttribute::trackStatistics() 1690 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) } 1691 }; 1692 1693 /// NonNull attribute for function return value. 1694 struct AANonNullReturned final 1695 : AAReturnedFromReturnedValues<AANonNull, AANonNullImpl> { 1696 AANonNullReturned(const IRPosition &IRP) 1697 : AAReturnedFromReturnedValues<AANonNull, AANonNullImpl>(IRP) {} 1698 1699 /// See AbstractAttribute::trackStatistics() 1700 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(nonnull) } 1701 }; 1702 1703 /// NonNull attribute for function argument. 1704 struct AANonNullArgument final 1705 : AAArgumentFromCallSiteArgumentsAndMustBeExecutedContext<AANonNull, 1706 AANonNullImpl> { 1707 AANonNullArgument(const IRPosition &IRP) 1708 : AAArgumentFromCallSiteArgumentsAndMustBeExecutedContext<AANonNull, 1709 AANonNullImpl>( 1710 IRP) {} 1711 1712 /// See AbstractAttribute::trackStatistics() 1713 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nonnull) } 1714 }; 1715 1716 struct AANonNullCallSiteArgument final : AANonNullFloating { 1717 AANonNullCallSiteArgument(const IRPosition &IRP) : AANonNullFloating(IRP) {} 1718 1719 /// See AbstractAttribute::trackStatistics() 1720 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(nonnull) } 1721 }; 1722 1723 /// NonNull attribute for a call site return position. 1724 struct AANonNullCallSiteReturned final 1725 : AACallSiteReturnedFromReturnedAndMustBeExecutedContext<AANonNull, 1726 AANonNullImpl> { 1727 AANonNullCallSiteReturned(const IRPosition &IRP) 1728 : AACallSiteReturnedFromReturnedAndMustBeExecutedContext<AANonNull, 1729 AANonNullImpl>( 1730 IRP) {} 1731 1732 /// See AbstractAttribute::trackStatistics() 1733 void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(nonnull) } 1734 }; 1735 1736 /// ------------------------ No-Recurse Attributes ---------------------------- 1737 1738 struct AANoRecurseImpl : public AANoRecurse { 1739 AANoRecurseImpl(const IRPosition &IRP) : AANoRecurse(IRP) {} 1740 1741 /// See AbstractAttribute::getAsStr() 1742 const std::string getAsStr() const override { 1743 return getAssumed() ? "norecurse" : "may-recurse"; 1744 } 1745 }; 1746 1747 struct AANoRecurseFunction final : AANoRecurseImpl { 1748 AANoRecurseFunction(const IRPosition &IRP) : AANoRecurseImpl(IRP) {} 1749 1750 /// See AbstractAttribute::initialize(...). 1751 void initialize(Attributor &A) override { 1752 AANoRecurseImpl::initialize(A); 1753 if (const Function *F = getAnchorScope()) 1754 if (A.getInfoCache().getSccSize(*F) == 1) 1755 return; 1756 indicatePessimisticFixpoint(); 1757 } 1758 1759 /// See AbstractAttribute::updateImpl(...). 1760 ChangeStatus updateImpl(Attributor &A) override { 1761 1762 auto CheckForNoRecurse = [&](Instruction &I) { 1763 ImmutableCallSite ICS(&I); 1764 if (ICS.hasFnAttr(Attribute::NoRecurse)) 1765 return true; 1766 1767 const auto &NoRecurseAA = 1768 A.getAAFor<AANoRecurse>(*this, IRPosition::callsite_function(ICS)); 1769 if (!NoRecurseAA.isAssumedNoRecurse()) 1770 return false; 1771 1772 // Recursion to the same function 1773 if (ICS.getCalledFunction() == getAnchorScope()) 1774 return false; 1775 1776 return true; 1777 }; 1778 1779 if (!A.checkForAllCallLikeInstructions(CheckForNoRecurse, *this)) 1780 return indicatePessimisticFixpoint(); 1781 return ChangeStatus::UNCHANGED; 1782 } 1783 1784 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(norecurse) } 1785 }; 1786 1787 /// NoRecurse attribute deduction for a call sites. 1788 struct AANoRecurseCallSite final : AANoRecurseImpl { 1789 AANoRecurseCallSite(const IRPosition &IRP) : AANoRecurseImpl(IRP) {} 1790 1791 /// See AbstractAttribute::initialize(...). 1792 void initialize(Attributor &A) override { 1793 AANoRecurseImpl::initialize(A); 1794 Function *F = getAssociatedFunction(); 1795 if (!F) 1796 indicatePessimisticFixpoint(); 1797 } 1798 1799 /// See AbstractAttribute::updateImpl(...). 1800 ChangeStatus updateImpl(Attributor &A) override { 1801 // TODO: Once we have call site specific value information we can provide 1802 // call site specific liveness information and then it makes 1803 // sense to specialize attributes for call sites arguments instead of 1804 // redirecting requests to the callee argument. 1805 Function *F = getAssociatedFunction(); 1806 const IRPosition &FnPos = IRPosition::function(*F); 1807 auto &FnAA = A.getAAFor<AANoRecurse>(*this, FnPos); 1808 return clampStateAndIndicateChange( 1809 getState(), 1810 static_cast<const AANoRecurse::StateType &>(FnAA.getState())); 1811 } 1812 1813 /// See AbstractAttribute::trackStatistics() 1814 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(norecurse); } 1815 }; 1816 1817 /// ------------------------ Will-Return Attributes ---------------------------- 1818 1819 // Helper function that checks whether a function has any cycle. 1820 // TODO: Replace with more efficent code 1821 static bool containsCycle(Function &F) { 1822 SmallPtrSet<BasicBlock *, 32> Visited; 1823 1824 // Traverse BB by dfs and check whether successor is already visited. 1825 for (BasicBlock *BB : depth_first(&F)) { 1826 Visited.insert(BB); 1827 for (auto *SuccBB : successors(BB)) { 1828 if (Visited.count(SuccBB)) 1829 return true; 1830 } 1831 } 1832 return false; 1833 } 1834 1835 // Helper function that checks the function have a loop which might become an 1836 // endless loop 1837 // FIXME: Any cycle is regarded as endless loop for now. 1838 // We have to allow some patterns. 1839 static bool containsPossiblyEndlessLoop(Function *F) { 1840 return !F || !F->hasExactDefinition() || containsCycle(*F); 1841 } 1842 1843 struct AAWillReturnImpl : public AAWillReturn { 1844 AAWillReturnImpl(const IRPosition &IRP) : AAWillReturn(IRP) {} 1845 1846 /// See AbstractAttribute::initialize(...). 1847 void initialize(Attributor &A) override { 1848 AAWillReturn::initialize(A); 1849 1850 Function *F = getAssociatedFunction(); 1851 if (containsPossiblyEndlessLoop(F)) 1852 indicatePessimisticFixpoint(); 1853 } 1854 1855 /// See AbstractAttribute::updateImpl(...). 1856 ChangeStatus updateImpl(Attributor &A) override { 1857 auto CheckForWillReturn = [&](Instruction &I) { 1858 IRPosition IPos = IRPosition::callsite_function(ImmutableCallSite(&I)); 1859 const auto &WillReturnAA = A.getAAFor<AAWillReturn>(*this, IPos); 1860 if (WillReturnAA.isKnownWillReturn()) 1861 return true; 1862 if (!WillReturnAA.isAssumedWillReturn()) 1863 return false; 1864 const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(*this, IPos); 1865 return NoRecurseAA.isAssumedNoRecurse(); 1866 }; 1867 1868 if (!A.checkForAllCallLikeInstructions(CheckForWillReturn, *this)) 1869 return indicatePessimisticFixpoint(); 1870 1871 return ChangeStatus::UNCHANGED; 1872 } 1873 1874 /// See AbstractAttribute::getAsStr() 1875 const std::string getAsStr() const override { 1876 return getAssumed() ? "willreturn" : "may-noreturn"; 1877 } 1878 }; 1879 1880 struct AAWillReturnFunction final : AAWillReturnImpl { 1881 AAWillReturnFunction(const IRPosition &IRP) : AAWillReturnImpl(IRP) {} 1882 1883 /// See AbstractAttribute::trackStatistics() 1884 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(willreturn) } 1885 }; 1886 1887 /// WillReturn attribute deduction for a call sites. 1888 struct AAWillReturnCallSite final : AAWillReturnImpl { 1889 AAWillReturnCallSite(const IRPosition &IRP) : AAWillReturnImpl(IRP) {} 1890 1891 /// See AbstractAttribute::initialize(...). 1892 void initialize(Attributor &A) override { 1893 AAWillReturnImpl::initialize(A); 1894 Function *F = getAssociatedFunction(); 1895 if (!F) 1896 indicatePessimisticFixpoint(); 1897 } 1898 1899 /// See AbstractAttribute::updateImpl(...). 1900 ChangeStatus updateImpl(Attributor &A) override { 1901 // TODO: Once we have call site specific value information we can provide 1902 // call site specific liveness information and then it makes 1903 // sense to specialize attributes for call sites arguments instead of 1904 // redirecting requests to the callee argument. 1905 Function *F = getAssociatedFunction(); 1906 const IRPosition &FnPos = IRPosition::function(*F); 1907 auto &FnAA = A.getAAFor<AAWillReturn>(*this, FnPos); 1908 return clampStateAndIndicateChange( 1909 getState(), 1910 static_cast<const AAWillReturn::StateType &>(FnAA.getState())); 1911 } 1912 1913 /// See AbstractAttribute::trackStatistics() 1914 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(willreturn); } 1915 }; 1916 1917 /// ------------------------ NoAlias Argument Attribute ------------------------ 1918 1919 struct AANoAliasImpl : AANoAlias { 1920 AANoAliasImpl(const IRPosition &IRP) : AANoAlias(IRP) {} 1921 1922 const std::string getAsStr() const override { 1923 return getAssumed() ? "noalias" : "may-alias"; 1924 } 1925 }; 1926 1927 /// NoAlias attribute for a floating value. 1928 struct AANoAliasFloating final : AANoAliasImpl { 1929 AANoAliasFloating(const IRPosition &IRP) : AANoAliasImpl(IRP) {} 1930 1931 /// See AbstractAttribute::initialize(...). 1932 void initialize(Attributor &A) override { 1933 AANoAliasImpl::initialize(A); 1934 Value &Val = getAssociatedValue(); 1935 if (isa<AllocaInst>(Val)) 1936 indicateOptimisticFixpoint(); 1937 if (isa<ConstantPointerNull>(Val) && 1938 Val.getType()->getPointerAddressSpace() == 0) 1939 indicateOptimisticFixpoint(); 1940 } 1941 1942 /// See AbstractAttribute::updateImpl(...). 1943 ChangeStatus updateImpl(Attributor &A) override { 1944 // TODO: Implement this. 1945 return indicatePessimisticFixpoint(); 1946 } 1947 1948 /// See AbstractAttribute::trackStatistics() 1949 void trackStatistics() const override { 1950 STATS_DECLTRACK_FLOATING_ATTR(noalias) 1951 } 1952 }; 1953 1954 /// NoAlias attribute for an argument. 1955 struct AANoAliasArgument final 1956 : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl> { 1957 AANoAliasArgument(const IRPosition &IRP) 1958 : AAArgumentFromCallSiteArguments<AANoAlias, AANoAliasImpl>(IRP) {} 1959 1960 /// See AbstractAttribute::trackStatistics() 1961 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(noalias) } 1962 }; 1963 1964 struct AANoAliasCallSiteArgument final : AANoAliasImpl { 1965 AANoAliasCallSiteArgument(const IRPosition &IRP) : AANoAliasImpl(IRP) {} 1966 1967 /// See AbstractAttribute::initialize(...). 1968 void initialize(Attributor &A) override { 1969 // See callsite argument attribute and callee argument attribute. 1970 ImmutableCallSite ICS(&getAnchorValue()); 1971 if (ICS.paramHasAttr(getArgNo(), Attribute::NoAlias)) 1972 indicateOptimisticFixpoint(); 1973 } 1974 1975 /// See AbstractAttribute::updateImpl(...). 1976 ChangeStatus updateImpl(Attributor &A) override { 1977 // We can deduce "noalias" if the following conditions hold. 1978 // (i) Associated value is assumed to be noalias in the definition. 1979 // (ii) Associated value is assumed to be no-capture in all the uses 1980 // possibly executed before this callsite. 1981 // (iii) There is no other pointer argument which could alias with the 1982 // value. 1983 1984 const Value &V = getAssociatedValue(); 1985 const IRPosition IRP = IRPosition::value(V); 1986 1987 // (i) Check whether noalias holds in the definition. 1988 1989 auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, IRP); 1990 1991 if (!NoAliasAA.isAssumedNoAlias()) 1992 return indicatePessimisticFixpoint(); 1993 1994 LLVM_DEBUG(dbgs() << "[Attributor][AANoAliasCSArg] " << V 1995 << " is assumed NoAlias in the definition\n"); 1996 1997 // (ii) Check whether the value is captured in the scope using AANoCapture. 1998 // FIXME: This is conservative though, it is better to look at CFG and 1999 // check only uses possibly executed before this callsite. 2000 2001 auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, IRP); 2002 if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned()) { 2003 LLVM_DEBUG( 2004 dbgs() << "[Attributor][AANoAliasCSArg] " << V 2005 << " cannot be noalias as it is potentially captured\n"); 2006 return indicatePessimisticFixpoint(); 2007 } 2008 2009 // (iii) Check there is no other pointer argument which could alias with the 2010 // value. 2011 ImmutableCallSite ICS(&getAnchorValue()); 2012 for (unsigned i = 0; i < ICS.getNumArgOperands(); i++) { 2013 if (getArgNo() == (int)i) 2014 continue; 2015 const Value *ArgOp = ICS.getArgOperand(i); 2016 if (!ArgOp->getType()->isPointerTy()) 2017 continue; 2018 2019 if (const Function *F = getAnchorScope()) { 2020 if (AAResults *AAR = A.getInfoCache().getAAResultsForFunction(*F)) { 2021 bool IsAliasing = AAR->isNoAlias(&getAssociatedValue(), ArgOp); 2022 LLVM_DEBUG(dbgs() 2023 << "[Attributor][NoAliasCSArg] Check alias between " 2024 "callsite arguments " 2025 << AAR->isNoAlias(&getAssociatedValue(), ArgOp) << " " 2026 << getAssociatedValue() << " " << *ArgOp << " => " 2027 << (IsAliasing ? "" : "no-") << "alias \n"); 2028 2029 if (IsAliasing) 2030 continue; 2031 } 2032 } 2033 return indicatePessimisticFixpoint(); 2034 } 2035 2036 return ChangeStatus::UNCHANGED; 2037 } 2038 2039 /// See AbstractAttribute::trackStatistics() 2040 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(noalias) } 2041 }; 2042 2043 /// NoAlias attribute for function return value. 2044 struct AANoAliasReturned final : AANoAliasImpl { 2045 AANoAliasReturned(const IRPosition &IRP) : AANoAliasImpl(IRP) {} 2046 2047 /// See AbstractAttribute::updateImpl(...). 2048 virtual ChangeStatus updateImpl(Attributor &A) override { 2049 2050 auto CheckReturnValue = [&](Value &RV) -> bool { 2051 if (Constant *C = dyn_cast<Constant>(&RV)) 2052 if (C->isNullValue() || isa<UndefValue>(C)) 2053 return true; 2054 2055 /// For now, we can only deduce noalias if we have call sites. 2056 /// FIXME: add more support. 2057 ImmutableCallSite ICS(&RV); 2058 if (!ICS) 2059 return false; 2060 2061 const IRPosition &RVPos = IRPosition::value(RV); 2062 const auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, RVPos); 2063 if (!NoAliasAA.isAssumedNoAlias()) 2064 return false; 2065 2066 const auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, RVPos); 2067 return NoCaptureAA.isAssumedNoCaptureMaybeReturned(); 2068 }; 2069 2070 if (!A.checkForAllReturnedValues(CheckReturnValue, *this)) 2071 return indicatePessimisticFixpoint(); 2072 2073 return ChangeStatus::UNCHANGED; 2074 } 2075 2076 /// See AbstractAttribute::trackStatistics() 2077 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(noalias) } 2078 }; 2079 2080 /// NoAlias attribute deduction for a call site return value. 2081 struct AANoAliasCallSiteReturned final : AANoAliasImpl { 2082 AANoAliasCallSiteReturned(const IRPosition &IRP) : AANoAliasImpl(IRP) {} 2083 2084 /// See AbstractAttribute::initialize(...). 2085 void initialize(Attributor &A) override { 2086 AANoAliasImpl::initialize(A); 2087 Function *F = getAssociatedFunction(); 2088 if (!F) 2089 indicatePessimisticFixpoint(); 2090 } 2091 2092 /// See AbstractAttribute::updateImpl(...). 2093 ChangeStatus updateImpl(Attributor &A) override { 2094 // TODO: Once we have call site specific value information we can provide 2095 // call site specific liveness information and then it makes 2096 // sense to specialize attributes for call sites arguments instead of 2097 // redirecting requests to the callee argument. 2098 Function *F = getAssociatedFunction(); 2099 const IRPosition &FnPos = IRPosition::returned(*F); 2100 auto &FnAA = A.getAAFor<AANoAlias>(*this, FnPos); 2101 return clampStateAndIndicateChange( 2102 getState(), static_cast<const AANoAlias::StateType &>(FnAA.getState())); 2103 } 2104 2105 /// See AbstractAttribute::trackStatistics() 2106 void trackStatistics() const override { STATS_DECLTRACK_CSRET_ATTR(noalias); } 2107 }; 2108 2109 /// -------------------AAIsDead Function Attribute----------------------- 2110 2111 struct AAIsDeadImpl : public AAIsDead { 2112 AAIsDeadImpl(const IRPosition &IRP) : AAIsDead(IRP) {} 2113 2114 void initialize(Attributor &A) override { 2115 const Function *F = getAssociatedFunction(); 2116 if (F && !F->isDeclaration()) 2117 exploreFromEntry(A, F); 2118 } 2119 2120 void exploreFromEntry(Attributor &A, const Function *F) { 2121 ToBeExploredPaths.insert(&(F->getEntryBlock().front())); 2122 2123 for (size_t i = 0; i < ToBeExploredPaths.size(); ++i) 2124 if (const Instruction *NextNoReturnI = 2125 findNextNoReturn(A, ToBeExploredPaths[i])) 2126 NoReturnCalls.insert(NextNoReturnI); 2127 2128 // Mark the block live after we looked for no-return instructions. 2129 assumeLive(A, F->getEntryBlock()); 2130 } 2131 2132 /// Find the next assumed noreturn instruction in the block of \p I starting 2133 /// from, thus including, \p I. 2134 /// 2135 /// The caller is responsible to monitor the ToBeExploredPaths set as new 2136 /// instructions discovered in other basic block will be placed in there. 2137 /// 2138 /// \returns The next assumed noreturn instructions in the block of \p I 2139 /// starting from, thus including, \p I. 2140 const Instruction *findNextNoReturn(Attributor &A, const Instruction *I); 2141 2142 /// See AbstractAttribute::getAsStr(). 2143 const std::string getAsStr() const override { 2144 return "Live[#BB " + std::to_string(AssumedLiveBlocks.size()) + "/" + 2145 std::to_string(getAssociatedFunction()->size()) + "][#NRI " + 2146 std::to_string(NoReturnCalls.size()) + "]"; 2147 } 2148 2149 /// See AbstractAttribute::manifest(...). 2150 ChangeStatus manifest(Attributor &A) override { 2151 assert(getState().isValidState() && 2152 "Attempted to manifest an invalid state!"); 2153 2154 ChangeStatus HasChanged = ChangeStatus::UNCHANGED; 2155 Function &F = *getAssociatedFunction(); 2156 2157 if (AssumedLiveBlocks.empty()) { 2158 A.deleteAfterManifest(F); 2159 return ChangeStatus::CHANGED; 2160 } 2161 2162 // Flag to determine if we can change an invoke to a call assuming the 2163 // callee is nounwind. This is not possible if the personality of the 2164 // function allows to catch asynchronous exceptions. 2165 bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F); 2166 2167 for (const Instruction *NRC : NoReturnCalls) { 2168 Instruction *I = const_cast<Instruction *>(NRC); 2169 BasicBlock *BB = I->getParent(); 2170 Instruction *SplitPos = I->getNextNode(); 2171 // TODO: mark stuff before unreachable instructions as dead. 2172 2173 if (auto *II = dyn_cast<InvokeInst>(I)) { 2174 // If we keep the invoke the split position is at the beginning of the 2175 // normal desitination block (it invokes a noreturn function after all). 2176 BasicBlock *NormalDestBB = II->getNormalDest(); 2177 SplitPos = &NormalDestBB->front(); 2178 2179 /// Invoke is replaced with a call and unreachable is placed after it if 2180 /// the callee is nounwind and noreturn. Otherwise, we keep the invoke 2181 /// and only place an unreachable in the normal successor. 2182 if (Invoke2CallAllowed) { 2183 if (II->getCalledFunction()) { 2184 const IRPosition &IPos = IRPosition::callsite_function(*II); 2185 const auto &AANoUnw = A.getAAFor<AANoUnwind>(*this, IPos); 2186 if (AANoUnw.isAssumedNoUnwind()) { 2187 LLVM_DEBUG(dbgs() 2188 << "[AAIsDead] Replace invoke with call inst\n"); 2189 // We do not need an invoke (II) but instead want a call followed 2190 // by an unreachable. However, we do not remove II as other 2191 // abstract attributes might have it cached as part of their 2192 // results. Given that we modify the CFG anyway, we simply keep II 2193 // around but in a new dead block. To avoid II being live through 2194 // a different edge we have to ensure the block we place it in is 2195 // only reached from the current block of II and then not reached 2196 // at all when we insert the unreachable. 2197 SplitBlockPredecessors(NormalDestBB, {BB}, ".i2c"); 2198 CallInst *CI = createCallMatchingInvoke(II); 2199 CI->insertBefore(II); 2200 CI->takeName(II); 2201 II->replaceAllUsesWith(CI); 2202 SplitPos = CI->getNextNode(); 2203 } 2204 } 2205 } 2206 2207 if (SplitPos == &NormalDestBB->front()) { 2208 // If this is an invoke of a noreturn function the edge to the normal 2209 // destination block is dead but not necessarily the block itself. 2210 // TODO: We need to move to an edge based system during deduction and 2211 // also manifest. 2212 assert(!NormalDestBB->isLandingPad() && 2213 "Expected the normal destination not to be a landingpad!"); 2214 if (NormalDestBB->getUniquePredecessor() == BB) { 2215 assumeLive(A, *NormalDestBB); 2216 } else { 2217 BasicBlock *SplitBB = 2218 SplitBlockPredecessors(NormalDestBB, {BB}, ".dead"); 2219 // The split block is live even if it contains only an unreachable 2220 // instruction at the end. 2221 assumeLive(A, *SplitBB); 2222 SplitPos = SplitBB->getTerminator(); 2223 HasChanged = ChangeStatus::CHANGED; 2224 } 2225 } 2226 } 2227 2228 if (isa_and_nonnull<UnreachableInst>(SplitPos)) 2229 continue; 2230 2231 BB = SplitPos->getParent(); 2232 SplitBlock(BB, SplitPos); 2233 changeToUnreachable(BB->getTerminator(), /* UseLLVMTrap */ false); 2234 HasChanged = ChangeStatus::CHANGED; 2235 } 2236 2237 for (BasicBlock &BB : F) 2238 if (!AssumedLiveBlocks.count(&BB)) 2239 A.deleteAfterManifest(BB); 2240 2241 return HasChanged; 2242 } 2243 2244 /// See AbstractAttribute::updateImpl(...). 2245 ChangeStatus updateImpl(Attributor &A) override; 2246 2247 /// See AAIsDead::isAssumedDead(BasicBlock *). 2248 bool isAssumedDead(const BasicBlock *BB) const override { 2249 assert(BB->getParent() == getAssociatedFunction() && 2250 "BB must be in the same anchor scope function."); 2251 2252 if (!getAssumed()) 2253 return false; 2254 return !AssumedLiveBlocks.count(BB); 2255 } 2256 2257 /// See AAIsDead::isKnownDead(BasicBlock *). 2258 bool isKnownDead(const BasicBlock *BB) const override { 2259 return getKnown() && isAssumedDead(BB); 2260 } 2261 2262 /// See AAIsDead::isAssumed(Instruction *I). 2263 bool isAssumedDead(const Instruction *I) const override { 2264 assert(I->getParent()->getParent() == getAssociatedFunction() && 2265 "Instruction must be in the same anchor scope function."); 2266 2267 if (!getAssumed()) 2268 return false; 2269 2270 // If it is not in AssumedLiveBlocks then it for sure dead. 2271 // Otherwise, it can still be after noreturn call in a live block. 2272 if (!AssumedLiveBlocks.count(I->getParent())) 2273 return true; 2274 2275 // If it is not after a noreturn call, than it is live. 2276 return isAfterNoReturn(I); 2277 } 2278 2279 /// See AAIsDead::isKnownDead(Instruction *I). 2280 bool isKnownDead(const Instruction *I) const override { 2281 return getKnown() && isAssumedDead(I); 2282 } 2283 2284 /// Check if instruction is after noreturn call, in other words, assumed dead. 2285 bool isAfterNoReturn(const Instruction *I) const; 2286 2287 /// Determine if \p F might catch asynchronous exceptions. 2288 static bool mayCatchAsynchronousExceptions(const Function &F) { 2289 return F.hasPersonalityFn() && !canSimplifyInvokeNoUnwind(&F); 2290 } 2291 2292 /// Assume \p BB is (partially) live now and indicate to the Attributor \p A 2293 /// that internal function called from \p BB should now be looked at. 2294 void assumeLive(Attributor &A, const BasicBlock &BB) { 2295 if (!AssumedLiveBlocks.insert(&BB).second) 2296 return; 2297 2298 // We assume that all of BB is (probably) live now and if there are calls to 2299 // internal functions we will assume that those are now live as well. This 2300 // is a performance optimization for blocks with calls to a lot of internal 2301 // functions. It can however cause dead functions to be treated as live. 2302 for (const Instruction &I : BB) 2303 if (ImmutableCallSite ICS = ImmutableCallSite(&I)) 2304 if (const Function *F = ICS.getCalledFunction()) 2305 if (F->hasLocalLinkage()) 2306 A.markLiveInternalFunction(*F); 2307 } 2308 2309 /// Collection of to be explored paths. 2310 SmallSetVector<const Instruction *, 8> ToBeExploredPaths; 2311 2312 /// Collection of all assumed live BasicBlocks. 2313 DenseSet<const BasicBlock *> AssumedLiveBlocks; 2314 2315 /// Collection of calls with noreturn attribute, assumed or knwon. 2316 SmallSetVector<const Instruction *, 4> NoReturnCalls; 2317 }; 2318 2319 struct AAIsDeadFunction final : public AAIsDeadImpl { 2320 AAIsDeadFunction(const IRPosition &IRP) : AAIsDeadImpl(IRP) {} 2321 2322 /// See AbstractAttribute::trackStatistics() 2323 void trackStatistics() const override { 2324 STATS_DECL(PartiallyDeadBlocks, Function, 2325 "Number of basic blocks classified as partially dead"); 2326 BUILD_STAT_NAME(PartiallyDeadBlocks, Function) += NoReturnCalls.size(); 2327 } 2328 }; 2329 2330 bool AAIsDeadImpl::isAfterNoReturn(const Instruction *I) const { 2331 const Instruction *PrevI = I->getPrevNode(); 2332 while (PrevI) { 2333 if (NoReturnCalls.count(PrevI)) 2334 return true; 2335 PrevI = PrevI->getPrevNode(); 2336 } 2337 return false; 2338 } 2339 2340 const Instruction *AAIsDeadImpl::findNextNoReturn(Attributor &A, 2341 const Instruction *I) { 2342 const BasicBlock *BB = I->getParent(); 2343 const Function &F = *BB->getParent(); 2344 2345 // Flag to determine if we can change an invoke to a call assuming the callee 2346 // is nounwind. This is not possible if the personality of the function allows 2347 // to catch asynchronous exceptions. 2348 bool Invoke2CallAllowed = !mayCatchAsynchronousExceptions(F); 2349 2350 // TODO: We should have a function that determines if an "edge" is dead. 2351 // Edges could be from an instruction to the next or from a terminator 2352 // to the successor. For now, we need to special case the unwind block 2353 // of InvokeInst below. 2354 2355 while (I) { 2356 ImmutableCallSite ICS(I); 2357 2358 if (ICS) { 2359 const IRPosition &IPos = IRPosition::callsite_function(ICS); 2360 // Regarless of the no-return property of an invoke instruction we only 2361 // learn that the regular successor is not reachable through this 2362 // instruction but the unwind block might still be. 2363 if (auto *Invoke = dyn_cast<InvokeInst>(I)) { 2364 // Use nounwind to justify the unwind block is dead as well. 2365 const auto &AANoUnw = A.getAAFor<AANoUnwind>(*this, IPos); 2366 if (!Invoke2CallAllowed || !AANoUnw.isAssumedNoUnwind()) { 2367 assumeLive(A, *Invoke->getUnwindDest()); 2368 ToBeExploredPaths.insert(&Invoke->getUnwindDest()->front()); 2369 } 2370 } 2371 2372 const auto &NoReturnAA = A.getAAFor<AANoReturn>(*this, IPos); 2373 if (NoReturnAA.isAssumedNoReturn()) 2374 return I; 2375 } 2376 2377 I = I->getNextNode(); 2378 } 2379 2380 // get new paths (reachable blocks). 2381 for (const BasicBlock *SuccBB : successors(BB)) { 2382 assumeLive(A, *SuccBB); 2383 ToBeExploredPaths.insert(&SuccBB->front()); 2384 } 2385 2386 // No noreturn instruction found. 2387 return nullptr; 2388 } 2389 2390 ChangeStatus AAIsDeadImpl::updateImpl(Attributor &A) { 2391 ChangeStatus Status = ChangeStatus::UNCHANGED; 2392 2393 // Temporary collection to iterate over existing noreturn instructions. This 2394 // will alow easier modification of NoReturnCalls collection 2395 SmallVector<const Instruction *, 8> NoReturnChanged; 2396 2397 for (const Instruction *I : NoReturnCalls) 2398 NoReturnChanged.push_back(I); 2399 2400 for (const Instruction *I : NoReturnChanged) { 2401 size_t Size = ToBeExploredPaths.size(); 2402 2403 const Instruction *NextNoReturnI = findNextNoReturn(A, I); 2404 if (NextNoReturnI != I) { 2405 Status = ChangeStatus::CHANGED; 2406 NoReturnCalls.remove(I); 2407 if (NextNoReturnI) 2408 NoReturnCalls.insert(NextNoReturnI); 2409 } 2410 2411 // Explore new paths. 2412 while (Size != ToBeExploredPaths.size()) { 2413 Status = ChangeStatus::CHANGED; 2414 if (const Instruction *NextNoReturnI = 2415 findNextNoReturn(A, ToBeExploredPaths[Size++])) 2416 NoReturnCalls.insert(NextNoReturnI); 2417 } 2418 } 2419 2420 LLVM_DEBUG(dbgs() << "[AAIsDead] AssumedLiveBlocks: " 2421 << AssumedLiveBlocks.size() << " Total number of blocks: " 2422 << getAssociatedFunction()->size() << "\n"); 2423 2424 // If we know everything is live there is no need to query for liveness. 2425 if (NoReturnCalls.empty() && 2426 getAssociatedFunction()->size() == AssumedLiveBlocks.size()) { 2427 // Indicating a pessimistic fixpoint will cause the state to be "invalid" 2428 // which will cause the Attributor to not return the AAIsDead on request, 2429 // which will prevent us from querying isAssumedDead(). 2430 indicatePessimisticFixpoint(); 2431 assert(!isValidState() && "Expected an invalid state!"); 2432 Status = ChangeStatus::CHANGED; 2433 } 2434 2435 return Status; 2436 } 2437 2438 /// Liveness information for a call sites. 2439 struct AAIsDeadCallSite final : AAIsDeadImpl { 2440 AAIsDeadCallSite(const IRPosition &IRP) : AAIsDeadImpl(IRP) {} 2441 2442 /// See AbstractAttribute::initialize(...). 2443 void initialize(Attributor &A) override { 2444 // TODO: Once we have call site specific value information we can provide 2445 // call site specific liveness information and then it makes 2446 // sense to specialize attributes for call sites instead of 2447 // redirecting requests to the callee. 2448 llvm_unreachable("Abstract attributes for liveness are not " 2449 "supported for call sites yet!"); 2450 } 2451 2452 /// See AbstractAttribute::updateImpl(...). 2453 ChangeStatus updateImpl(Attributor &A) override { 2454 return indicatePessimisticFixpoint(); 2455 } 2456 2457 /// See AbstractAttribute::trackStatistics() 2458 void trackStatistics() const override {} 2459 }; 2460 2461 /// -------------------- Dereferenceable Argument Attribute -------------------- 2462 2463 template <> 2464 ChangeStatus clampStateAndIndicateChange<DerefState>(DerefState &S, 2465 const DerefState &R) { 2466 ChangeStatus CS0 = clampStateAndIndicateChange<IntegerState>( 2467 S.DerefBytesState, R.DerefBytesState); 2468 ChangeStatus CS1 = 2469 clampStateAndIndicateChange<IntegerState>(S.GlobalState, R.GlobalState); 2470 return CS0 | CS1; 2471 } 2472 2473 struct AADereferenceableImpl : AADereferenceable { 2474 AADereferenceableImpl(const IRPosition &IRP) : AADereferenceable(IRP) {} 2475 using StateType = DerefState; 2476 2477 void initialize(Attributor &A) override { 2478 SmallVector<Attribute, 4> Attrs; 2479 getAttrs({Attribute::Dereferenceable, Attribute::DereferenceableOrNull}, 2480 Attrs); 2481 for (const Attribute &Attr : Attrs) 2482 takeKnownDerefBytesMaximum(Attr.getValueAsInt()); 2483 2484 NonNullAA = &A.getAAFor<AANonNull>(*this, getIRPosition()); 2485 2486 const IRPosition &IRP = this->getIRPosition(); 2487 bool IsFnInterface = IRP.isFnInterfaceKind(); 2488 const Function *FnScope = IRP.getAnchorScope(); 2489 if (IsFnInterface && (!FnScope || !FnScope->hasExactDefinition())) 2490 indicatePessimisticFixpoint(); 2491 } 2492 2493 /// See AbstractAttribute::getState() 2494 /// { 2495 StateType &getState() override { return *this; } 2496 const StateType &getState() const override { return *this; } 2497 /// } 2498 2499 /// See AAFromMustBeExecutedContext 2500 bool followUse(Attributor &A, const Use *U, const Instruction *I) { 2501 bool IsNonNull = false; 2502 bool TrackUse = false; 2503 int64_t DerefBytes = getKnownNonNullAndDerefBytesForUse( 2504 A, *this, getAssociatedValue(), U, I, IsNonNull, TrackUse); 2505 takeKnownDerefBytesMaximum(DerefBytes); 2506 return TrackUse; 2507 } 2508 2509 void getDeducedAttributes(LLVMContext &Ctx, 2510 SmallVectorImpl<Attribute> &Attrs) const override { 2511 // TODO: Add *_globally support 2512 if (isAssumedNonNull()) 2513 Attrs.emplace_back(Attribute::getWithDereferenceableBytes( 2514 Ctx, getAssumedDereferenceableBytes())); 2515 else 2516 Attrs.emplace_back(Attribute::getWithDereferenceableOrNullBytes( 2517 Ctx, getAssumedDereferenceableBytes())); 2518 } 2519 2520 /// See AbstractAttribute::getAsStr(). 2521 const std::string getAsStr() const override { 2522 if (!getAssumedDereferenceableBytes()) 2523 return "unknown-dereferenceable"; 2524 return std::string("dereferenceable") + 2525 (isAssumedNonNull() ? "" : "_or_null") + 2526 (isAssumedGlobal() ? "_globally" : "") + "<" + 2527 std::to_string(getKnownDereferenceableBytes()) + "-" + 2528 std::to_string(getAssumedDereferenceableBytes()) + ">"; 2529 } 2530 }; 2531 2532 /// Dereferenceable attribute for a floating value. 2533 struct AADereferenceableFloating 2534 : AAFromMustBeExecutedContext<AADereferenceable, AADereferenceableImpl> { 2535 using Base = 2536 AAFromMustBeExecutedContext<AADereferenceable, AADereferenceableImpl>; 2537 AADereferenceableFloating(const IRPosition &IRP) : Base(IRP) {} 2538 2539 /// See AbstractAttribute::updateImpl(...). 2540 ChangeStatus updateImpl(Attributor &A) override { 2541 ChangeStatus Change = Base::updateImpl(A); 2542 2543 const DataLayout &DL = A.getDataLayout(); 2544 2545 auto VisitValueCB = [&](Value &V, DerefState &T, bool Stripped) -> bool { 2546 unsigned IdxWidth = 2547 DL.getIndexSizeInBits(V.getType()->getPointerAddressSpace()); 2548 APInt Offset(IdxWidth, 0); 2549 const Value *Base = 2550 V.stripAndAccumulateInBoundsConstantOffsets(DL, Offset); 2551 2552 const auto &AA = 2553 A.getAAFor<AADereferenceable>(*this, IRPosition::value(*Base)); 2554 int64_t DerefBytes = 0; 2555 if (!Stripped && this == &AA) { 2556 // Use IR information if we did not strip anything. 2557 // TODO: track globally. 2558 bool CanBeNull; 2559 DerefBytes = Base->getPointerDereferenceableBytes(DL, CanBeNull); 2560 T.GlobalState.indicatePessimisticFixpoint(); 2561 } else { 2562 const DerefState &DS = static_cast<const DerefState &>(AA.getState()); 2563 DerefBytes = DS.DerefBytesState.getAssumed(); 2564 T.GlobalState &= DS.GlobalState; 2565 } 2566 2567 // For now we do not try to "increase" dereferenceability due to negative 2568 // indices as we first have to come up with code to deal with loops and 2569 // for overflows of the dereferenceable bytes. 2570 int64_t OffsetSExt = Offset.getSExtValue(); 2571 if (OffsetSExt < 0) 2572 OffsetSExt = 0; 2573 2574 T.takeAssumedDerefBytesMinimum( 2575 std::max(int64_t(0), DerefBytes - OffsetSExt)); 2576 2577 if (this == &AA) { 2578 if (!Stripped) { 2579 // If nothing was stripped IR information is all we got. 2580 T.takeKnownDerefBytesMaximum( 2581 std::max(int64_t(0), DerefBytes - OffsetSExt)); 2582 T.indicatePessimisticFixpoint(); 2583 } else if (OffsetSExt > 0) { 2584 // If something was stripped but there is circular reasoning we look 2585 // for the offset. If it is positive we basically decrease the 2586 // dereferenceable bytes in a circluar loop now, which will simply 2587 // drive them down to the known value in a very slow way which we 2588 // can accelerate. 2589 T.indicatePessimisticFixpoint(); 2590 } 2591 } 2592 2593 return T.isValidState(); 2594 }; 2595 2596 DerefState T; 2597 if (!genericValueTraversal<AADereferenceable, DerefState>( 2598 A, getIRPosition(), *this, T, VisitValueCB)) 2599 return indicatePessimisticFixpoint(); 2600 2601 return Change | clampStateAndIndicateChange(getState(), T); 2602 } 2603 2604 /// See AbstractAttribute::trackStatistics() 2605 void trackStatistics() const override { 2606 STATS_DECLTRACK_FLOATING_ATTR(dereferenceable) 2607 } 2608 }; 2609 2610 /// Dereferenceable attribute for a return value. 2611 struct AADereferenceableReturned final 2612 : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl, 2613 DerefState> { 2614 AADereferenceableReturned(const IRPosition &IRP) 2615 : AAReturnedFromReturnedValues<AADereferenceable, AADereferenceableImpl, 2616 DerefState>(IRP) {} 2617 2618 /// See AbstractAttribute::trackStatistics() 2619 void trackStatistics() const override { 2620 STATS_DECLTRACK_FNRET_ATTR(dereferenceable) 2621 } 2622 }; 2623 2624 /// Dereferenceable attribute for an argument 2625 struct AADereferenceableArgument final 2626 : AAArgumentFromCallSiteArgumentsAndMustBeExecutedContext< 2627 AADereferenceable, AADereferenceableImpl, DerefState> { 2628 using Base = AAArgumentFromCallSiteArgumentsAndMustBeExecutedContext< 2629 AADereferenceable, AADereferenceableImpl, DerefState>; 2630 AADereferenceableArgument(const IRPosition &IRP) : Base(IRP) {} 2631 2632 /// See AbstractAttribute::trackStatistics() 2633 void trackStatistics() const override { 2634 STATS_DECLTRACK_ARG_ATTR(dereferenceable) 2635 } 2636 }; 2637 2638 /// Dereferenceable attribute for a call site argument. 2639 struct AADereferenceableCallSiteArgument final : AADereferenceableFloating { 2640 AADereferenceableCallSiteArgument(const IRPosition &IRP) 2641 : AADereferenceableFloating(IRP) {} 2642 2643 /// See AbstractAttribute::trackStatistics() 2644 void trackStatistics() const override { 2645 STATS_DECLTRACK_CSARG_ATTR(dereferenceable) 2646 } 2647 }; 2648 2649 /// Dereferenceable attribute deduction for a call site return value. 2650 struct AADereferenceableCallSiteReturned final 2651 : AACallSiteReturnedFromReturnedAndMustBeExecutedContext< 2652 AADereferenceable, AADereferenceableImpl> { 2653 using Base = AACallSiteReturnedFromReturnedAndMustBeExecutedContext< 2654 AADereferenceable, AADereferenceableImpl>; 2655 AADereferenceableCallSiteReturned(const IRPosition &IRP) : Base(IRP) {} 2656 2657 /// See AbstractAttribute::initialize(...). 2658 void initialize(Attributor &A) override { 2659 Base::initialize(A); 2660 Function *F = getAssociatedFunction(); 2661 if (!F) 2662 indicatePessimisticFixpoint(); 2663 } 2664 2665 /// See AbstractAttribute::updateImpl(...). 2666 ChangeStatus updateImpl(Attributor &A) override { 2667 // TODO: Once we have call site specific value information we can provide 2668 // call site specific liveness information and then it makes 2669 // sense to specialize attributes for call sites arguments instead of 2670 // redirecting requests to the callee argument. 2671 2672 ChangeStatus Change = Base::updateImpl(A); 2673 Function *F = getAssociatedFunction(); 2674 const IRPosition &FnPos = IRPosition::returned(*F); 2675 auto &FnAA = A.getAAFor<AADereferenceable>(*this, FnPos); 2676 return Change | 2677 clampStateAndIndicateChange( 2678 getState(), static_cast<const DerefState &>(FnAA.getState())); 2679 } 2680 2681 /// See AbstractAttribute::trackStatistics() 2682 void trackStatistics() const override { 2683 STATS_DECLTRACK_CS_ATTR(dereferenceable); 2684 } 2685 }; 2686 2687 // ------------------------ Align Argument Attribute ------------------------ 2688 2689 struct AAAlignImpl : AAAlign { 2690 AAAlignImpl(const IRPosition &IRP) : AAAlign(IRP) {} 2691 2692 // Max alignemnt value allowed in IR 2693 static const unsigned MAX_ALIGN = 1U << 29; 2694 2695 /// See AbstractAttribute::initialize(...). 2696 void initialize(Attributor &A) override { 2697 takeAssumedMinimum(MAX_ALIGN); 2698 2699 SmallVector<Attribute, 4> Attrs; 2700 getAttrs({Attribute::Alignment}, Attrs); 2701 for (const Attribute &Attr : Attrs) 2702 takeKnownMaximum(Attr.getValueAsInt()); 2703 2704 if (getIRPosition().isFnInterfaceKind() && 2705 (!getAssociatedFunction() || 2706 !getAssociatedFunction()->hasExactDefinition())) 2707 indicatePessimisticFixpoint(); 2708 } 2709 2710 /// See AbstractAttribute::manifest(...). 2711 ChangeStatus manifest(Attributor &A) override { 2712 ChangeStatus Changed = ChangeStatus::UNCHANGED; 2713 2714 // Check for users that allow alignment annotations. 2715 Value &AnchorVal = getIRPosition().getAnchorValue(); 2716 for (const Use &U : AnchorVal.uses()) { 2717 if (auto *SI = dyn_cast<StoreInst>(U.getUser())) { 2718 if (SI->getPointerOperand() == &AnchorVal) 2719 if (SI->getAlignment() < getAssumedAlign()) { 2720 STATS_DECLTRACK(AAAlign, Store, 2721 "Number of times alignemnt added to a store"); 2722 SI->setAlignment(Align(getAssumedAlign())); 2723 Changed = ChangeStatus::CHANGED; 2724 } 2725 } else if (auto *LI = dyn_cast<LoadInst>(U.getUser())) { 2726 if (LI->getPointerOperand() == &AnchorVal) 2727 if (LI->getAlignment() < getAssumedAlign()) { 2728 LI->setAlignment(Align(getAssumedAlign())); 2729 STATS_DECLTRACK(AAAlign, Load, 2730 "Number of times alignemnt added to a load"); 2731 Changed = ChangeStatus::CHANGED; 2732 } 2733 } 2734 } 2735 2736 return AAAlign::manifest(A) | Changed; 2737 } 2738 2739 // TODO: Provide a helper to determine the implied ABI alignment and check in 2740 // the existing manifest method and a new one for AAAlignImpl that value 2741 // to avoid making the alignment explicit if it did not improve. 2742 2743 /// See AbstractAttribute::getDeducedAttributes 2744 virtual void 2745 getDeducedAttributes(LLVMContext &Ctx, 2746 SmallVectorImpl<Attribute> &Attrs) const override { 2747 if (getAssumedAlign() > 1) 2748 Attrs.emplace_back( 2749 Attribute::getWithAlignment(Ctx, Align(getAssumedAlign()))); 2750 } 2751 2752 /// See AbstractAttribute::getAsStr(). 2753 const std::string getAsStr() const override { 2754 return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) + 2755 "-" + std::to_string(getAssumedAlign()) + ">") 2756 : "unknown-align"; 2757 } 2758 }; 2759 2760 /// Align attribute for a floating value. 2761 struct AAAlignFloating : AAAlignImpl { 2762 AAAlignFloating(const IRPosition &IRP) : AAAlignImpl(IRP) {} 2763 2764 /// See AbstractAttribute::updateImpl(...). 2765 ChangeStatus updateImpl(Attributor &A) override { 2766 const DataLayout &DL = A.getDataLayout(); 2767 2768 auto VisitValueCB = [&](Value &V, AAAlign::StateType &T, 2769 bool Stripped) -> bool { 2770 const auto &AA = A.getAAFor<AAAlign>(*this, IRPosition::value(V)); 2771 if (!Stripped && this == &AA) { 2772 // Use only IR information if we did not strip anything. 2773 const MaybeAlign PA = V.getPointerAlignment(DL); 2774 T.takeKnownMaximum(PA ? PA->value() : 0); 2775 T.indicatePessimisticFixpoint(); 2776 } else { 2777 // Use abstract attribute information. 2778 const AAAlign::StateType &DS = 2779 static_cast<const AAAlign::StateType &>(AA.getState()); 2780 T ^= DS; 2781 } 2782 return T.isValidState(); 2783 }; 2784 2785 StateType T; 2786 if (!genericValueTraversal<AAAlign, StateType>(A, getIRPosition(), *this, T, 2787 VisitValueCB)) 2788 return indicatePessimisticFixpoint(); 2789 2790 // TODO: If we know we visited all incoming values, thus no are assumed 2791 // dead, we can take the known information from the state T. 2792 return clampStateAndIndicateChange(getState(), T); 2793 } 2794 2795 /// See AbstractAttribute::trackStatistics() 2796 void trackStatistics() const override { STATS_DECLTRACK_FLOATING_ATTR(align) } 2797 }; 2798 2799 /// Align attribute for function return value. 2800 struct AAAlignReturned final 2801 : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl> { 2802 AAAlignReturned(const IRPosition &IRP) 2803 : AAReturnedFromReturnedValues<AAAlign, AAAlignImpl>(IRP) {} 2804 2805 /// See AbstractAttribute::trackStatistics() 2806 void trackStatistics() const override { STATS_DECLTRACK_FNRET_ATTR(aligned) } 2807 }; 2808 2809 /// Align attribute for function argument. 2810 struct AAAlignArgument final 2811 : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl> { 2812 AAAlignArgument(const IRPosition &IRP) 2813 : AAArgumentFromCallSiteArguments<AAAlign, AAAlignImpl>(IRP) {} 2814 2815 /// See AbstractAttribute::trackStatistics() 2816 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(aligned) } 2817 }; 2818 2819 struct AAAlignCallSiteArgument final : AAAlignFloating { 2820 AAAlignCallSiteArgument(const IRPosition &IRP) : AAAlignFloating(IRP) {} 2821 2822 /// See AbstractAttribute::manifest(...). 2823 ChangeStatus manifest(Attributor &A) override { 2824 return AAAlignImpl::manifest(A); 2825 } 2826 2827 /// See AbstractAttribute::trackStatistics() 2828 void trackStatistics() const override { STATS_DECLTRACK_CSARG_ATTR(aligned) } 2829 }; 2830 2831 /// Align attribute deduction for a call site return value. 2832 struct AAAlignCallSiteReturned final : AAAlignImpl { 2833 AAAlignCallSiteReturned(const IRPosition &IRP) : AAAlignImpl(IRP) {} 2834 2835 /// See AbstractAttribute::initialize(...). 2836 void initialize(Attributor &A) override { 2837 AAAlignImpl::initialize(A); 2838 Function *F = getAssociatedFunction(); 2839 if (!F) 2840 indicatePessimisticFixpoint(); 2841 } 2842 2843 /// See AbstractAttribute::updateImpl(...). 2844 ChangeStatus updateImpl(Attributor &A) override { 2845 // TODO: Once we have call site specific value information we can provide 2846 // call site specific liveness information and then it makes 2847 // sense to specialize attributes for call sites arguments instead of 2848 // redirecting requests to the callee argument. 2849 Function *F = getAssociatedFunction(); 2850 const IRPosition &FnPos = IRPosition::returned(*F); 2851 auto &FnAA = A.getAAFor<AAAlign>(*this, FnPos); 2852 return clampStateAndIndicateChange( 2853 getState(), static_cast<const AAAlign::StateType &>(FnAA.getState())); 2854 } 2855 2856 /// See AbstractAttribute::trackStatistics() 2857 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(align); } 2858 }; 2859 2860 /// ------------------ Function No-Return Attribute ---------------------------- 2861 struct AANoReturnImpl : public AANoReturn { 2862 AANoReturnImpl(const IRPosition &IRP) : AANoReturn(IRP) {} 2863 2864 /// See AbstractAttribute::initialize(...). 2865 void initialize(Attributor &A) override { 2866 AANoReturn::initialize(A); 2867 Function *F = getAssociatedFunction(); 2868 if (!F || F->hasFnAttribute(Attribute::WillReturn)) 2869 indicatePessimisticFixpoint(); 2870 } 2871 2872 /// See AbstractAttribute::getAsStr(). 2873 const std::string getAsStr() const override { 2874 return getAssumed() ? "noreturn" : "may-return"; 2875 } 2876 2877 /// See AbstractAttribute::updateImpl(Attributor &A). 2878 virtual ChangeStatus updateImpl(Attributor &A) override { 2879 const auto &WillReturnAA = A.getAAFor<AAWillReturn>(*this, getIRPosition()); 2880 if (WillReturnAA.isKnownWillReturn()) 2881 return indicatePessimisticFixpoint(); 2882 auto CheckForNoReturn = [](Instruction &) { return false; }; 2883 if (!A.checkForAllInstructions(CheckForNoReturn, *this, 2884 {(unsigned)Instruction::Ret})) 2885 return indicatePessimisticFixpoint(); 2886 return ChangeStatus::UNCHANGED; 2887 } 2888 }; 2889 2890 struct AANoReturnFunction final : AANoReturnImpl { 2891 AANoReturnFunction(const IRPosition &IRP) : AANoReturnImpl(IRP) {} 2892 2893 /// See AbstractAttribute::trackStatistics() 2894 void trackStatistics() const override { STATS_DECLTRACK_FN_ATTR(noreturn) } 2895 }; 2896 2897 /// NoReturn attribute deduction for a call sites. 2898 struct AANoReturnCallSite final : AANoReturnImpl { 2899 AANoReturnCallSite(const IRPosition &IRP) : AANoReturnImpl(IRP) {} 2900 2901 /// See AbstractAttribute::updateImpl(...). 2902 ChangeStatus updateImpl(Attributor &A) override { 2903 // TODO: Once we have call site specific value information we can provide 2904 // call site specific liveness information and then it makes 2905 // sense to specialize attributes for call sites arguments instead of 2906 // redirecting requests to the callee argument. 2907 Function *F = getAssociatedFunction(); 2908 const IRPosition &FnPos = IRPosition::function(*F); 2909 auto &FnAA = A.getAAFor<AANoReturn>(*this, FnPos); 2910 return clampStateAndIndicateChange( 2911 getState(), 2912 static_cast<const AANoReturn::StateType &>(FnAA.getState())); 2913 } 2914 2915 /// See AbstractAttribute::trackStatistics() 2916 void trackStatistics() const override { STATS_DECLTRACK_CS_ATTR(noreturn); } 2917 }; 2918 2919 /// ----------------------- Variable Capturing --------------------------------- 2920 2921 /// A class to hold the state of for no-capture attributes. 2922 struct AANoCaptureImpl : public AANoCapture { 2923 AANoCaptureImpl(const IRPosition &IRP) : AANoCapture(IRP) {} 2924 2925 /// See AbstractAttribute::initialize(...). 2926 void initialize(Attributor &A) override { 2927 AANoCapture::initialize(A); 2928 2929 // You cannot "capture" null in the default address space. 2930 if (isa<ConstantPointerNull>(getAssociatedValue()) && 2931 getAssociatedValue().getType()->getPointerAddressSpace() == 0) { 2932 indicateOptimisticFixpoint(); 2933 return; 2934 } 2935 2936 const IRPosition &IRP = getIRPosition(); 2937 const Function *F = 2938 getArgNo() >= 0 ? IRP.getAssociatedFunction() : IRP.getAnchorScope(); 2939 2940 // Check what state the associated function can actually capture. 2941 if (F) 2942 determineFunctionCaptureCapabilities(IRP, *F, *this); 2943 else 2944 indicatePessimisticFixpoint(); 2945 } 2946 2947 /// See AbstractAttribute::updateImpl(...). 2948 ChangeStatus updateImpl(Attributor &A) override; 2949 2950 /// see AbstractAttribute::isAssumedNoCaptureMaybeReturned(...). 2951 virtual void 2952 getDeducedAttributes(LLVMContext &Ctx, 2953 SmallVectorImpl<Attribute> &Attrs) const override { 2954 if (!isAssumedNoCaptureMaybeReturned()) 2955 return; 2956 2957 if (getArgNo() >= 0) { 2958 if (isAssumedNoCapture()) 2959 Attrs.emplace_back(Attribute::get(Ctx, Attribute::NoCapture)); 2960 else if (ManifestInternal) 2961 Attrs.emplace_back(Attribute::get(Ctx, "no-capture-maybe-returned")); 2962 } 2963 } 2964 2965 /// Set the NOT_CAPTURED_IN_MEM and NOT_CAPTURED_IN_RET bits in \p Known 2966 /// depending on the ability of the function associated with \p IRP to capture 2967 /// state in memory and through "returning/throwing", respectively. 2968 static void determineFunctionCaptureCapabilities(const IRPosition &IRP, 2969 const Function &F, 2970 IntegerState &State) { 2971 // TODO: Once we have memory behavior attributes we should use them here. 2972 2973 // If we know we cannot communicate or write to memory, we do not care about 2974 // ptr2int anymore. 2975 if (F.onlyReadsMemory() && F.doesNotThrow() && 2976 F.getReturnType()->isVoidTy()) { 2977 State.addKnownBits(NO_CAPTURE); 2978 return; 2979 } 2980 2981 // A function cannot capture state in memory if it only reads memory, it can 2982 // however return/throw state and the state might be influenced by the 2983 // pointer value, e.g., loading from a returned pointer might reveal a bit. 2984 if (F.onlyReadsMemory()) 2985 State.addKnownBits(NOT_CAPTURED_IN_MEM); 2986 2987 // A function cannot communicate state back if it does not through 2988 // exceptions and doesn not return values. 2989 if (F.doesNotThrow() && F.getReturnType()->isVoidTy()) 2990 State.addKnownBits(NOT_CAPTURED_IN_RET); 2991 2992 // Check existing "returned" attributes. 2993 int ArgNo = IRP.getArgNo(); 2994 if (F.doesNotThrow() && ArgNo >= 0) { 2995 for (unsigned u = 0, e = F.arg_size(); u< e; ++u) 2996 if (F.hasParamAttribute(u, Attribute::Returned)) { 2997 if (u == unsigned(ArgNo)) 2998 State.removeAssumedBits(NOT_CAPTURED_IN_RET); 2999 else if (F.onlyReadsMemory()) 3000 State.addKnownBits(NO_CAPTURE); 3001 else 3002 State.addKnownBits(NOT_CAPTURED_IN_RET); 3003 break; 3004 } 3005 } 3006 } 3007 3008 /// See AbstractState::getAsStr(). 3009 const std::string getAsStr() const override { 3010 if (isKnownNoCapture()) 3011 return "known not-captured"; 3012 if (isAssumedNoCapture()) 3013 return "assumed not-captured"; 3014 if (isKnownNoCaptureMaybeReturned()) 3015 return "known not-captured-maybe-returned"; 3016 if (isAssumedNoCaptureMaybeReturned()) 3017 return "assumed not-captured-maybe-returned"; 3018 return "assumed-captured"; 3019 } 3020 }; 3021 3022 /// Attributor-aware capture tracker. 3023 struct AACaptureUseTracker final : public CaptureTracker { 3024 3025 /// Create a capture tracker that can lookup in-flight abstract attributes 3026 /// through the Attributor \p A. 3027 /// 3028 /// If a use leads to a potential capture, \p CapturedInMemory is set and the 3029 /// search is stopped. If a use leads to a return instruction, 3030 /// \p CommunicatedBack is set to true and \p CapturedInMemory is not changed. 3031 /// If a use leads to a ptr2int which may capture the value, 3032 /// \p CapturedInInteger is set. If a use is found that is currently assumed 3033 /// "no-capture-maybe-returned", the user is added to the \p PotentialCopies 3034 /// set. All values in \p PotentialCopies are later tracked as well. For every 3035 /// explored use we decrement \p RemainingUsesToExplore. Once it reaches 0, 3036 /// the search is stopped with \p CapturedInMemory and \p CapturedInInteger 3037 /// conservatively set to true. 3038 AACaptureUseTracker(Attributor &A, AANoCapture &NoCaptureAA, 3039 const AAIsDead &IsDeadAA, IntegerState &State, 3040 SmallVectorImpl<const Value *> &PotentialCopies, 3041 unsigned &RemainingUsesToExplore) 3042 : A(A), NoCaptureAA(NoCaptureAA), IsDeadAA(IsDeadAA), State(State), 3043 PotentialCopies(PotentialCopies), 3044 RemainingUsesToExplore(RemainingUsesToExplore) {} 3045 3046 /// Determine if \p V maybe captured. *Also updates the state!* 3047 bool valueMayBeCaptured(const Value *V) { 3048 if (V->getType()->isPointerTy()) { 3049 PointerMayBeCaptured(V, this); 3050 } else { 3051 State.indicatePessimisticFixpoint(); 3052 } 3053 return State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED); 3054 } 3055 3056 /// See CaptureTracker::tooManyUses(). 3057 void tooManyUses() override { 3058 State.removeAssumedBits(AANoCapture::NO_CAPTURE); 3059 } 3060 3061 bool isDereferenceableOrNull(Value *O, const DataLayout &DL) override { 3062 if (CaptureTracker::isDereferenceableOrNull(O, DL)) 3063 return true; 3064 const auto &DerefAA = 3065 A.getAAFor<AADereferenceable>(NoCaptureAA, IRPosition::value(*O)); 3066 return DerefAA.getAssumedDereferenceableBytes(); 3067 } 3068 3069 /// See CaptureTracker::captured(...). 3070 bool captured(const Use *U) override { 3071 Instruction *UInst = cast<Instruction>(U->getUser()); 3072 LLVM_DEBUG(dbgs() << "Check use: " << *U->get() << " in " << *UInst 3073 << "\n"); 3074 3075 // Because we may reuse the tracker multiple times we keep track of the 3076 // number of explored uses ourselves as well. 3077 if (RemainingUsesToExplore-- == 0) { 3078 LLVM_DEBUG(dbgs() << " - too many uses to explore!\n"); 3079 return isCapturedIn(/* Memory */ true, /* Integer */ true, 3080 /* Return */ true); 3081 } 3082 3083 // Deal with ptr2int by following uses. 3084 if (isa<PtrToIntInst>(UInst)) { 3085 LLVM_DEBUG(dbgs() << " - ptr2int assume the worst!\n"); 3086 return valueMayBeCaptured(UInst); 3087 } 3088 3089 // Explicitly catch return instructions. 3090 if (isa<ReturnInst>(UInst)) 3091 return isCapturedIn(/* Memory */ false, /* Integer */ false, 3092 /* Return */ true); 3093 3094 // For now we only use special logic for call sites. However, the tracker 3095 // itself knows about a lot of other non-capturing cases already. 3096 CallSite CS(UInst); 3097 if (!CS || !CS.isArgOperand(U)) 3098 return isCapturedIn(/* Memory */ true, /* Integer */ true, 3099 /* Return */ true); 3100 3101 unsigned ArgNo = CS.getArgumentNo(U); 3102 const IRPosition &CSArgPos = IRPosition::callsite_argument(CS, ArgNo); 3103 // If we have a abstract no-capture attribute for the argument we can use 3104 // it to justify a non-capture attribute here. This allows recursion! 3105 auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(NoCaptureAA, CSArgPos); 3106 if (ArgNoCaptureAA.isAssumedNoCapture()) 3107 return isCapturedIn(/* Memory */ false, /* Integer */ false, 3108 /* Return */ false); 3109 if (ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) { 3110 addPotentialCopy(CS); 3111 return isCapturedIn(/* Memory */ false, /* Integer */ false, 3112 /* Return */ false); 3113 } 3114 3115 // Lastly, we could not find a reason no-capture can be assumed so we don't. 3116 return isCapturedIn(/* Memory */ true, /* Integer */ true, 3117 /* Return */ true); 3118 } 3119 3120 /// Register \p CS as potential copy of the value we are checking. 3121 void addPotentialCopy(CallSite CS) { 3122 PotentialCopies.push_back(CS.getInstruction()); 3123 } 3124 3125 /// See CaptureTracker::shouldExplore(...). 3126 bool shouldExplore(const Use *U) override { 3127 // Check liveness. 3128 return !IsDeadAA.isAssumedDead(cast<Instruction>(U->getUser())); 3129 } 3130 3131 /// Update the state according to \p CapturedInMem, \p CapturedInInt, and 3132 /// \p CapturedInRet, then return the appropriate value for use in the 3133 /// CaptureTracker::captured() interface. 3134 bool isCapturedIn(bool CapturedInMem, bool CapturedInInt, 3135 bool CapturedInRet) { 3136 LLVM_DEBUG(dbgs() << " - captures [Mem " << CapturedInMem << "|Int " 3137 << CapturedInInt << "|Ret " << CapturedInRet << "]\n"); 3138 if (CapturedInMem) 3139 State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_MEM); 3140 if (CapturedInInt) 3141 State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_INT); 3142 if (CapturedInRet) 3143 State.removeAssumedBits(AANoCapture::NOT_CAPTURED_IN_RET); 3144 return !State.isAssumed(AANoCapture::NO_CAPTURE_MAYBE_RETURNED); 3145 } 3146 3147 private: 3148 /// The attributor providing in-flight abstract attributes. 3149 Attributor &A; 3150 3151 /// The abstract attribute currently updated. 3152 AANoCapture &NoCaptureAA; 3153 3154 /// The abstract liveness state. 3155 const AAIsDead &IsDeadAA; 3156 3157 /// The state currently updated. 3158 IntegerState &State; 3159 3160 /// Set of potential copies of the tracked value. 3161 SmallVectorImpl<const Value *> &PotentialCopies; 3162 3163 /// Global counter to limit the number of explored uses. 3164 unsigned &RemainingUsesToExplore; 3165 }; 3166 3167 ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) { 3168 const IRPosition &IRP = getIRPosition(); 3169 const Value *V = 3170 getArgNo() >= 0 ? IRP.getAssociatedArgument() : &IRP.getAssociatedValue(); 3171 if (!V) 3172 return indicatePessimisticFixpoint(); 3173 3174 const Function *F = 3175 getArgNo() >= 0 ? IRP.getAssociatedFunction() : IRP.getAnchorScope(); 3176 assert(F && "Expected a function!"); 3177 const IRPosition &FnPos = IRPosition::function(*F); 3178 const auto &IsDeadAA = A.getAAFor<AAIsDead>(*this, FnPos); 3179 3180 AANoCapture::StateType T; 3181 3182 // Readonly means we cannot capture through memory. 3183 const auto &FnMemAA = A.getAAFor<AAMemoryBehavior>(*this, FnPos); 3184 if (FnMemAA.isAssumedReadOnly()) { 3185 T.addKnownBits(NOT_CAPTURED_IN_MEM); 3186 if (FnMemAA.isKnownReadOnly()) 3187 addKnownBits(NOT_CAPTURED_IN_MEM); 3188 } 3189 3190 // Make sure all returned values are different than the underlying value. 3191 // TODO: we could do this in a more sophisticated way inside 3192 // AAReturnedValues, e.g., track all values that escape through returns 3193 // directly somehow. 3194 auto CheckReturnedArgs = [&](const AAReturnedValues &RVAA) { 3195 bool SeenConstant = false; 3196 for (auto &It : RVAA.returned_values()) { 3197 if (isa<Constant>(It.first)) { 3198 if (SeenConstant) 3199 return false; 3200 SeenConstant = true; 3201 } else if (!isa<Argument>(It.first) || 3202 It.first == getAssociatedArgument()) 3203 return false; 3204 } 3205 return true; 3206 }; 3207 3208 const auto &NoUnwindAA = A.getAAFor<AANoUnwind>(*this, FnPos); 3209 if (NoUnwindAA.isAssumedNoUnwind()) { 3210 bool IsVoidTy = F->getReturnType()->isVoidTy(); 3211 const AAReturnedValues *RVAA = 3212 IsVoidTy ? nullptr : &A.getAAFor<AAReturnedValues>(*this, FnPos); 3213 if (IsVoidTy || CheckReturnedArgs(*RVAA)) { 3214 T.addKnownBits(NOT_CAPTURED_IN_RET); 3215 if (T.isKnown(NOT_CAPTURED_IN_MEM)) 3216 return ChangeStatus::UNCHANGED; 3217 if (NoUnwindAA.isKnownNoUnwind() && 3218 (IsVoidTy || RVAA->getState().isAtFixpoint())) { 3219 addKnownBits(NOT_CAPTURED_IN_RET); 3220 if (isKnown(NOT_CAPTURED_IN_MEM)) 3221 return indicateOptimisticFixpoint(); 3222 } 3223 } 3224 } 3225 3226 // Use the CaptureTracker interface and logic with the specialized tracker, 3227 // defined in AACaptureUseTracker, that can look at in-flight abstract 3228 // attributes and directly updates the assumed state. 3229 SmallVector<const Value *, 4> PotentialCopies; 3230 unsigned RemainingUsesToExplore = DefaultMaxUsesToExplore; 3231 AACaptureUseTracker Tracker(A, *this, IsDeadAA, T, PotentialCopies, 3232 RemainingUsesToExplore); 3233 3234 // Check all potential copies of the associated value until we can assume 3235 // none will be captured or we have to assume at least one might be. 3236 unsigned Idx = 0; 3237 PotentialCopies.push_back(V); 3238 while (T.isAssumed(NO_CAPTURE_MAYBE_RETURNED) && Idx < PotentialCopies.size()) 3239 Tracker.valueMayBeCaptured(PotentialCopies[Idx++]); 3240 3241 AAAlign::StateType &S = getState(); 3242 auto Assumed = S.getAssumed(); 3243 S.intersectAssumedBits(T.getAssumed()); 3244 return Assumed == S.getAssumed() ? ChangeStatus::UNCHANGED 3245 : ChangeStatus::CHANGED; 3246 } 3247 3248 /// NoCapture attribute for function arguments. 3249 struct AANoCaptureArgument final : AANoCaptureImpl { 3250 AANoCaptureArgument(const IRPosition &IRP) : AANoCaptureImpl(IRP) {} 3251 3252 /// See AbstractAttribute::trackStatistics() 3253 void trackStatistics() const override { STATS_DECLTRACK_ARG_ATTR(nocapture) } 3254 }; 3255 3256 /// NoCapture attribute for call site arguments. 3257 struct AANoCaptureCallSiteArgument final : AANoCaptureImpl { 3258 AANoCaptureCallSiteArgument(const IRPosition &IRP) : AANoCaptureImpl(IRP) {} 3259 3260 /// See AbstractAttribute::updateImpl(...). 3261 ChangeStatus updateImpl(Attributor &A) override { 3262 // TODO: Once we have call site specific value information we can provide 3263 // call site specific liveness information and then it makes 3264 // sense to specialize attributes for call sites arguments instead of 3265 // redirecting requests to the callee argument. 3266 Argument *Arg = getAssociatedArgument(); 3267 if (!Arg) 3268 return indicatePessimisticFixpoint(); 3269 const IRPosition &ArgPos = IRPosition::argument(*Arg); 3270 auto &ArgAA = A.getAAFor<AANoCapture>(*this, ArgPos); 3271 return clampStateAndIndicateChange( 3272 getState(), 3273 static_cast<const AANoCapture::StateType &>(ArgAA.getState())); 3274 } 3275 3276 /// See AbstractAttribute::trackStatistics() 3277 void trackStatistics() const override{STATS_DECLTRACK_CSARG_ATTR(nocapture)}; 3278 }; 3279 3280 /// NoCapture attribute for floating values. 3281 struct AANoCaptureFloating final : AANoCaptureImpl { 3282 AANoCaptureFloating(const IRPosition &IRP) : AANoCaptureImpl(IRP) {} 3283 3284 /// See AbstractAttribute::trackStatistics() 3285 void trackStatistics() const override { 3286 STATS_DECLTRACK_FLOATING_ATTR(nocapture) 3287 } 3288 }; 3289 3290 /// NoCapture attribute for function return value. 3291 struct AANoCaptureReturned final : AANoCaptureImpl { 3292 AANoCaptureReturned(const IRPosition &IRP) : AANoCaptureImpl(IRP) { 3293 llvm_unreachable("NoCapture is not applicable to function returns!"); 3294 } 3295 3296 /// See AbstractAttribute::initialize(...). 3297 void initialize(Attributor &A) override { 3298 llvm_unreachable("NoCapture is not applicable to function returns!"); 3299 } 3300 3301 /// See AbstractAttribute::updateImpl(...). 3302 ChangeStatus updateImpl(Attributor &A) override { 3303 llvm_unreachable("NoCapture is not applicable to function returns!"); 3304 } 3305 3306 /// See AbstractAttribute::trackStatistics() 3307 void trackStatistics() const override {} 3308 }; 3309 3310 /// NoCapture attribute deduction for a call site return value. 3311 struct AANoCaptureCallSiteReturned final : AANoCaptureImpl { 3312 AANoCaptureCallSiteReturned(const IRPosition &IRP) : AANoCaptureImpl(IRP) {} 3313 3314 /// See AbstractAttribute::trackStatistics() 3315 void trackStatistics() const override { 3316 STATS_DECLTRACK_CSRET_ATTR(nocapture) 3317 } 3318 }; 3319 3320 /// ------------------ Value Simplify Attribute ---------------------------- 3321 struct AAValueSimplifyImpl : AAValueSimplify { 3322 AAValueSimplifyImpl(const IRPosition &IRP) : AAValueSimplify(IRP) {} 3323 3324 /// See AbstractAttribute::getAsStr(). 3325 const std::string getAsStr() const override { 3326 return getAssumed() ? (getKnown() ? "simplified" : "maybe-simple") 3327 : "not-simple"; 3328 } 3329 3330 /// See AbstractAttribute::trackStatistics() 3331 void trackStatistics() const override {} 3332 3333 /// See AAValueSimplify::getAssumedSimplifiedValue() 3334 Optional<Value *> getAssumedSimplifiedValue(Attributor &A) const override { 3335 if (!getAssumed()) 3336 return const_cast<Value *>(&getAssociatedValue()); 3337 return SimplifiedAssociatedValue; 3338 } 3339 void initialize(Attributor &A) override {} 3340 3341 /// Helper function for querying AAValueSimplify and updating candicate. 3342 /// \param QueryingValue Value trying to unify with SimplifiedValue 3343 /// \param AccumulatedSimplifiedValue Current simplification result. 3344 static bool checkAndUpdate(Attributor &A, const AbstractAttribute &QueryingAA, 3345 Value &QueryingValue, 3346 Optional<Value *> &AccumulatedSimplifiedValue) { 3347 // FIXME: Add a typecast support. 3348 3349 auto &ValueSimpifyAA = A.getAAFor<AAValueSimplify>( 3350 QueryingAA, IRPosition::value(QueryingValue)); 3351 3352 Optional<Value *> QueryingValueSimplified = 3353 ValueSimpifyAA.getAssumedSimplifiedValue(A); 3354 3355 if (!QueryingValueSimplified.hasValue()) 3356 return true; 3357 3358 if (!QueryingValueSimplified.getValue()) 3359 return false; 3360 3361 Value &QueryingValueSimplifiedUnwrapped = 3362 *QueryingValueSimplified.getValue(); 3363 3364 if (isa<UndefValue>(QueryingValueSimplifiedUnwrapped)) 3365 return true; 3366 3367 if (AccumulatedSimplifiedValue.hasValue()) 3368 return AccumulatedSimplifiedValue == QueryingValueSimplified; 3369 3370 LLVM_DEBUG(dbgs() << "[Attributor][ValueSimplify] " << QueryingValue 3371 << " is assumed to be " 3372 << QueryingValueSimplifiedUnwrapped << "\n"); 3373 3374 AccumulatedSimplifiedValue = QueryingValueSimplified; 3375 return true; 3376 } 3377 3378 /// See AbstractAttribute::manifest(...). 3379 ChangeStatus manifest(Attributor &A) override { 3380 ChangeStatus Changed = ChangeStatus::UNCHANGED; 3381 3382 if (!SimplifiedAssociatedValue.hasValue() || 3383 !SimplifiedAssociatedValue.getValue()) 3384 return Changed; 3385 3386 if (auto *C = dyn_cast<Constant>(SimplifiedAssociatedValue.getValue())) { 3387 // We can replace the AssociatedValue with the constant. 3388 Value &V = getAssociatedValue(); 3389 if (!V.user_empty() && &V != C && V.getType() == C->getType()) { 3390 LLVM_DEBUG(dbgs() << "[Attributor][ValueSimplify] " << V << " -> " << *C 3391 << "\n"); 3392 V.replaceAllUsesWith(C); 3393 Changed = ChangeStatus::CHANGED; 3394 } 3395 } 3396 3397 return Changed | AAValueSimplify::manifest(A); 3398 } 3399 3400 protected: 3401 // An assumed simplified value. Initially, it is set to Optional::None, which 3402 // means that the value is not clear under current assumption. If in the 3403 // pessimistic state, getAssumedSimplifiedValue doesn't return this value but 3404 // returns orignal associated value. 3405 Optional<Value *> SimplifiedAssociatedValue; 3406 }; 3407 3408 struct AAValueSimplifyArgument final : AAValueSimplifyImpl { 3409 AAValueSimplifyArgument(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {} 3410 3411 /// See AbstractAttribute::updateImpl(...). 3412 ChangeStatus updateImpl(Attributor &A) override { 3413 bool HasValueBefore = SimplifiedAssociatedValue.hasValue(); 3414 3415 auto PredForCallSite = [&](AbstractCallSite ACS) { 3416 // Check if we have an associated argument or not (which can happen for 3417 // callback calls). 3418 if (Value *ArgOp = ACS.getCallArgOperand(getArgNo())) 3419 return checkAndUpdate(A, *this, *ArgOp, SimplifiedAssociatedValue); 3420 return false; 3421 }; 3422 3423 if (!A.checkForAllCallSites(PredForCallSite, *this, true)) 3424 return indicatePessimisticFixpoint(); 3425 3426 // If a candicate was found in this update, return CHANGED. 3427 return HasValueBefore == SimplifiedAssociatedValue.hasValue() 3428 ? ChangeStatus::UNCHANGED 3429 : ChangeStatus ::CHANGED; 3430 } 3431 3432 /// See AbstractAttribute::trackStatistics() 3433 void trackStatistics() const override { 3434 STATS_DECLTRACK_ARG_ATTR(value_simplify) 3435 } 3436 }; 3437 3438 struct AAValueSimplifyReturned : AAValueSimplifyImpl { 3439 AAValueSimplifyReturned(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {} 3440 3441 /// See AbstractAttribute::updateImpl(...). 3442 ChangeStatus updateImpl(Attributor &A) override { 3443 bool HasValueBefore = SimplifiedAssociatedValue.hasValue(); 3444 3445 auto PredForReturned = [&](Value &V) { 3446 return checkAndUpdate(A, *this, V, SimplifiedAssociatedValue); 3447 }; 3448 3449 if (!A.checkForAllReturnedValues(PredForReturned, *this)) 3450 return indicatePessimisticFixpoint(); 3451 3452 // If a candicate was found in this update, return CHANGED. 3453 return HasValueBefore == SimplifiedAssociatedValue.hasValue() 3454 ? ChangeStatus::UNCHANGED 3455 : ChangeStatus ::CHANGED; 3456 } 3457 /// See AbstractAttribute::trackStatistics() 3458 void trackStatistics() const override { 3459 STATS_DECLTRACK_FNRET_ATTR(value_simplify) 3460 } 3461 }; 3462 3463 struct AAValueSimplifyFloating : AAValueSimplifyImpl { 3464 AAValueSimplifyFloating(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {} 3465 3466 /// See AbstractAttribute::initialize(...). 3467 void initialize(Attributor &A) override { 3468 Value &V = getAnchorValue(); 3469 3470 // TODO: add other stuffs 3471 if (isa<Constant>(V) || isa<UndefValue>(V)) 3472 indicatePessimisticFixpoint(); 3473 } 3474 3475 /// See AbstractAttribute::updateImpl(...). 3476 ChangeStatus updateImpl(Attributor &A) override { 3477 bool HasValueBefore = SimplifiedAssociatedValue.hasValue(); 3478 3479 auto VisitValueCB = [&](Value &V, BooleanState, bool Stripped) -> bool { 3480 auto &AA = A.getAAFor<AAValueSimplify>(*this, IRPosition::value(V)); 3481 if (!Stripped && this == &AA) { 3482 // TODO: Look the instruction and check recursively. 3483 LLVM_DEBUG( 3484 dbgs() << "[Attributor][ValueSimplify] Can't be stripped more : " 3485 << V << "\n"); 3486 indicatePessimisticFixpoint(); 3487 return false; 3488 } 3489 return checkAndUpdate(A, *this, V, SimplifiedAssociatedValue); 3490 }; 3491 3492 if (!genericValueTraversal<AAValueSimplify, BooleanState>( 3493 A, getIRPosition(), *this, static_cast<BooleanState &>(*this), 3494 VisitValueCB)) 3495 return indicatePessimisticFixpoint(); 3496 3497 // If a candicate was found in this update, return CHANGED. 3498 3499 return HasValueBefore == SimplifiedAssociatedValue.hasValue() 3500 ? ChangeStatus::UNCHANGED 3501 : ChangeStatus ::CHANGED; 3502 } 3503 3504 /// See AbstractAttribute::trackStatistics() 3505 void trackStatistics() const override { 3506 STATS_DECLTRACK_FLOATING_ATTR(value_simplify) 3507 } 3508 }; 3509 3510 struct AAValueSimplifyFunction : AAValueSimplifyImpl { 3511 AAValueSimplifyFunction(const IRPosition &IRP) : AAValueSimplifyImpl(IRP) {} 3512 3513 /// See AbstractAttribute::initialize(...). 3514 void initialize(Attributor &A) override { 3515 SimplifiedAssociatedValue = &getAnchorValue(); 3516 indicateOptimisticFixpoint(); 3517 } 3518 /// See AbstractAttribute::initialize(...). 3519 ChangeStatus updateImpl(Attributor &A) override { 3520 llvm_unreachable( 3521 "AAValueSimplify(Function|CallSite)::updateImpl will not be called"); 3522 } 3523 /// See AbstractAttribute::trackStatistics() 3524 void trackStatistics() const override { 3525 STATS_DECLTRACK_FN_ATTR(value_simplify) 3526 } 3527 }; 3528 3529 struct AAValueSimplifyCallSite : AAValueSimplifyFunction { 3530 AAValueSimplifyCallSite(const IRPosition &IRP) 3531 : AAValueSimplifyFunction(IRP) {} 3532 /// See AbstractAttribute::trackStatistics() 3533 void trackStatistics() const override { 3534 STATS_DECLTRACK_CS_ATTR(value_simplify) 3535 } 3536 }; 3537 3538 struct AAValueSimplifyCallSiteReturned : AAValueSimplifyReturned { 3539 AAValueSimplifyCallSiteReturned(const IRPosition &IRP) 3540 : AAValueSimplifyReturned(IRP) {} 3541 3542 void trackStatistics() const override { 3543 STATS_DECLTRACK_CSRET_ATTR(value_simplify) 3544 } 3545 }; 3546 struct AAValueSimplifyCallSiteArgument : AAValueSimplifyFloating { 3547 AAValueSimplifyCallSiteArgument(const IRPosition &IRP) 3548 : AAValueSimplifyFloating(IRP) {} 3549 3550 void trackStatistics() const override { 3551 STATS_DECLTRACK_CSARG_ATTR(value_simplify) 3552 } 3553 }; 3554 3555 /// ----------------------- Heap-To-Stack Conversion --------------------------- 3556 struct AAHeapToStackImpl : public AAHeapToStack { 3557 AAHeapToStackImpl(const IRPosition &IRP) : AAHeapToStack(IRP) {} 3558 3559 const std::string getAsStr() const override { 3560 return "[H2S] Mallocs: " + std::to_string(MallocCalls.size()); 3561 } 3562 3563 ChangeStatus manifest(Attributor &A) override { 3564 assert(getState().isValidState() && 3565 "Attempted to manifest an invalid state!"); 3566 3567 ChangeStatus HasChanged = ChangeStatus::UNCHANGED; 3568 Function *F = getAssociatedFunction(); 3569 const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F); 3570 3571 for (Instruction *MallocCall : MallocCalls) { 3572 // This malloc cannot be replaced. 3573 if (BadMallocCalls.count(MallocCall)) 3574 continue; 3575 3576 for (Instruction *FreeCall : FreesForMalloc[MallocCall]) { 3577 LLVM_DEBUG(dbgs() << "H2S: Removing free call: " << *FreeCall << "\n"); 3578 A.deleteAfterManifest(*FreeCall); 3579 HasChanged = ChangeStatus::CHANGED; 3580 } 3581 3582 LLVM_DEBUG(dbgs() << "H2S: Removing malloc call: " << *MallocCall 3583 << "\n"); 3584 3585 Constant *Size; 3586 if (isCallocLikeFn(MallocCall, TLI)) { 3587 auto *Num = cast<ConstantInt>(MallocCall->getOperand(0)); 3588 auto *SizeT = dyn_cast<ConstantInt>(MallocCall->getOperand(1)); 3589 APInt TotalSize = SizeT->getValue() * Num->getValue(); 3590 Size = 3591 ConstantInt::get(MallocCall->getOperand(0)->getType(), TotalSize); 3592 } else { 3593 Size = cast<ConstantInt>(MallocCall->getOperand(0)); 3594 } 3595 3596 unsigned AS = cast<PointerType>(MallocCall->getType())->getAddressSpace(); 3597 Instruction *AI = new AllocaInst(Type::getInt8Ty(F->getContext()), AS, 3598 Size, "", MallocCall->getNextNode()); 3599 3600 if (AI->getType() != MallocCall->getType()) 3601 AI = new BitCastInst(AI, MallocCall->getType(), "malloc_bc", 3602 AI->getNextNode()); 3603 3604 MallocCall->replaceAllUsesWith(AI); 3605 3606 if (auto *II = dyn_cast<InvokeInst>(MallocCall)) { 3607 auto *NBB = II->getNormalDest(); 3608 BranchInst::Create(NBB, MallocCall->getParent()); 3609 A.deleteAfterManifest(*MallocCall); 3610 } else { 3611 A.deleteAfterManifest(*MallocCall); 3612 } 3613 3614 if (isCallocLikeFn(MallocCall, TLI)) { 3615 auto *BI = new BitCastInst(AI, MallocCall->getType(), "calloc_bc", 3616 AI->getNextNode()); 3617 Value *Ops[] = { 3618 BI, ConstantInt::get(F->getContext(), APInt(8, 0, false)), Size, 3619 ConstantInt::get(Type::getInt1Ty(F->getContext()), false)}; 3620 3621 Type *Tys[] = {BI->getType(), MallocCall->getOperand(0)->getType()}; 3622 Module *M = F->getParent(); 3623 Function *Fn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys); 3624 CallInst::Create(Fn, Ops, "", BI->getNextNode()); 3625 } 3626 HasChanged = ChangeStatus::CHANGED; 3627 } 3628 3629 return HasChanged; 3630 } 3631 3632 /// Collection of all malloc calls in a function. 3633 SmallSetVector<Instruction *, 4> MallocCalls; 3634 3635 /// Collection of malloc calls that cannot be converted. 3636 DenseSet<const Instruction *> BadMallocCalls; 3637 3638 /// A map for each malloc call to the set of associated free calls. 3639 DenseMap<Instruction *, SmallPtrSet<Instruction *, 4>> FreesForMalloc; 3640 3641 ChangeStatus updateImpl(Attributor &A) override; 3642 }; 3643 3644 ChangeStatus AAHeapToStackImpl::updateImpl(Attributor &A) { 3645 const Function *F = getAssociatedFunction(); 3646 const auto *TLI = A.getInfoCache().getTargetLibraryInfoForFunction(*F); 3647 3648 auto UsesCheck = [&](Instruction &I) { 3649 SmallPtrSet<const Use *, 8> Visited; 3650 SmallVector<const Use *, 8> Worklist; 3651 3652 for (Use &U : I.uses()) 3653 Worklist.push_back(&U); 3654 3655 while (!Worklist.empty()) { 3656 const Use *U = Worklist.pop_back_val(); 3657 if (!Visited.insert(U).second) 3658 continue; 3659 3660 auto *UserI = U->getUser(); 3661 3662 if (isa<LoadInst>(UserI)) 3663 continue; 3664 if (auto *SI = dyn_cast<StoreInst>(UserI)) { 3665 if (SI->getValueOperand() == U->get()) { 3666 LLVM_DEBUG(dbgs() << "[H2S] escaping store to memory: " << *UserI << "\n"); 3667 return false; 3668 } 3669 // A store into the malloc'ed memory is fine. 3670 continue; 3671 } 3672 3673 // NOTE: Right now, if a function that has malloc pointer as an argument 3674 // frees memory, we assume that the malloc pointer is freed. 3675 3676 // TODO: Add nofree callsite argument attribute to indicate that pointer 3677 // argument is not freed. 3678 if (auto *CB = dyn_cast<CallBase>(UserI)) { 3679 if (!CB->isArgOperand(U)) 3680 continue; 3681 3682 if (CB->isLifetimeStartOrEnd()) 3683 continue; 3684 3685 // Record malloc. 3686 if (isFreeCall(UserI, TLI)) { 3687 FreesForMalloc[&I].insert( 3688 cast<Instruction>(const_cast<User *>(UserI))); 3689 continue; 3690 } 3691 3692 // If a function does not free memory we are fine 3693 const auto &NoFreeAA = 3694 A.getAAFor<AANoFree>(*this, IRPosition::callsite_function(*CB)); 3695 3696 unsigned ArgNo = U - CB->arg_begin(); 3697 const auto &NoCaptureAA = A.getAAFor<AANoCapture>( 3698 *this, IRPosition::callsite_argument(*CB, ArgNo)); 3699 3700 if (!NoCaptureAA.isAssumedNoCapture() || !NoFreeAA.isAssumedNoFree()) { 3701 LLVM_DEBUG(dbgs() << "[H2S] Bad user: " << *UserI << "\n"); 3702 return false; 3703 } 3704 continue; 3705 } 3706 3707 if (isa<GetElementPtrInst>(UserI) || isa<BitCastInst>(UserI)) { 3708 for (Use &U : UserI->uses()) 3709 Worklist.push_back(&U); 3710 continue; 3711 } 3712 3713 // Unknown user. 3714 LLVM_DEBUG(dbgs() << "[H2S] Unknown user: " << *UserI << "\n"); 3715 return false; 3716 } 3717 return true; 3718 }; 3719 3720 auto MallocCallocCheck = [&](Instruction &I) { 3721 if (BadMallocCalls.count(&I)) 3722 return true; 3723 3724 bool IsMalloc = isMallocLikeFn(&I, TLI); 3725 bool IsCalloc = !IsMalloc && isCallocLikeFn(&I, TLI); 3726 if (!IsMalloc && !IsCalloc) { 3727 BadMallocCalls.insert(&I); 3728 return true; 3729 } 3730 3731 if (IsMalloc) { 3732 if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(0))) 3733 if (Size->getValue().sle(MaxHeapToStackSize)) 3734 if (UsesCheck(I)) { 3735 MallocCalls.insert(&I); 3736 return true; 3737 } 3738 } else if (IsCalloc) { 3739 bool Overflow = false; 3740 if (auto *Num = dyn_cast<ConstantInt>(I.getOperand(0))) 3741 if (auto *Size = dyn_cast<ConstantInt>(I.getOperand(1))) 3742 if ((Size->getValue().umul_ov(Num->getValue(), Overflow)) 3743 .sle(MaxHeapToStackSize)) 3744 if (!Overflow && UsesCheck(I)) { 3745 MallocCalls.insert(&I); 3746 return true; 3747 } 3748 } 3749 3750 BadMallocCalls.insert(&I); 3751 return true; 3752 }; 3753 3754 size_t NumBadMallocs = BadMallocCalls.size(); 3755 3756 A.checkForAllCallLikeInstructions(MallocCallocCheck, *this); 3757 3758 if (NumBadMallocs != BadMallocCalls.size()) 3759 return ChangeStatus::CHANGED; 3760 3761 return ChangeStatus::UNCHANGED; 3762 } 3763 3764 struct AAHeapToStackFunction final : public AAHeapToStackImpl { 3765 AAHeapToStackFunction(const IRPosition &IRP) : AAHeapToStackImpl(IRP) {} 3766 3767 /// See AbstractAttribute::trackStatistics() 3768 void trackStatistics() const override { 3769 STATS_DECL(MallocCalls, Function, 3770 "Number of MallocCalls converted to allocas"); 3771 BUILD_STAT_NAME(MallocCalls, Function) += MallocCalls.size(); 3772 } 3773 }; 3774 3775 /// -------------------- Memory Behavior Attributes ---------------------------- 3776 /// Includes read-none, read-only, and write-only. 3777 /// ---------------------------------------------------------------------------- 3778 struct AAMemoryBehaviorImpl : public AAMemoryBehavior { 3779 AAMemoryBehaviorImpl(const IRPosition &IRP) : AAMemoryBehavior(IRP) {} 3780 3781 /// See AbstractAttribute::initialize(...). 3782 void initialize(Attributor &A) override { 3783 intersectAssumedBits(BEST_STATE); 3784 getKnownStateFromValue(getIRPosition(), getState()); 3785 IRAttribute::initialize(A); 3786 } 3787 3788 /// Return the memory behavior information encoded in the IR for \p IRP. 3789 static void getKnownStateFromValue(const IRPosition &IRP, 3790 IntegerState &State) { 3791 SmallVector<Attribute, 2> Attrs; 3792 IRP.getAttrs(AttrKinds, Attrs); 3793 for (const Attribute &Attr : Attrs) { 3794 switch (Attr.getKindAsEnum()) { 3795 case Attribute::ReadNone: 3796 State.addKnownBits(NO_ACCESSES); 3797 break; 3798 case Attribute::ReadOnly: 3799 State.addKnownBits(NO_WRITES); 3800 break; 3801 case Attribute::WriteOnly: 3802 State.addKnownBits(NO_READS); 3803 break; 3804 default: 3805 llvm_unreachable("Unexpcted attribute!"); 3806 } 3807 } 3808 3809 if (auto *I = dyn_cast<Instruction>(&IRP.getAnchorValue())) { 3810 if (!I->mayReadFromMemory()) 3811 State.addKnownBits(NO_READS); 3812 if (!I->mayWriteToMemory()) 3813 State.addKnownBits(NO_WRITES); 3814 } 3815 } 3816 3817 /// See AbstractAttribute::getDeducedAttributes(...). 3818 void getDeducedAttributes(LLVMContext &Ctx, 3819 SmallVectorImpl<Attribute> &Attrs) const override { 3820 assert(Attrs.size() == 0); 3821 if (isAssumedReadNone()) 3822 Attrs.push_back(Attribute::get(Ctx, Attribute::ReadNone)); 3823 else if (isAssumedReadOnly()) 3824 Attrs.push_back(Attribute::get(Ctx, Attribute::ReadOnly)); 3825 else if (isAssumedWriteOnly()) 3826 Attrs.push_back(Attribute::get(Ctx, Attribute::WriteOnly)); 3827 assert(Attrs.size() <= 1); 3828 } 3829 3830 /// See AbstractAttribute::manifest(...). 3831 ChangeStatus manifest(Attributor &A) override { 3832 IRPosition &IRP = getIRPosition(); 3833 3834 // Check if we would improve the existing attributes first. 3835 SmallVector<Attribute, 4> DeducedAttrs; 3836 getDeducedAttributes(IRP.getAnchorValue().getContext(), DeducedAttrs); 3837 if (llvm::all_of(DeducedAttrs, [&](const Attribute &Attr) { 3838 return IRP.hasAttr(Attr.getKindAsEnum(), 3839 /* IgnoreSubsumingPositions */ true); 3840 })) 3841 return ChangeStatus::UNCHANGED; 3842 3843 // Clear existing attributes. 3844 IRP.removeAttrs(AttrKinds); 3845 3846 // Use the generic manifest method. 3847 return IRAttribute::manifest(A); 3848 } 3849 3850 /// See AbstractState::getAsStr(). 3851 const std::string getAsStr() const override { 3852 if (isAssumedReadNone()) 3853 return "readnone"; 3854 if (isAssumedReadOnly()) 3855 return "readonly"; 3856 if (isAssumedWriteOnly()) 3857 return "writeonly"; 3858 return "may-read/write"; 3859 } 3860 3861 /// The set of IR attributes AAMemoryBehavior deals with. 3862 static const Attribute::AttrKind AttrKinds[3]; 3863 }; 3864 3865 const Attribute::AttrKind AAMemoryBehaviorImpl::AttrKinds[] = { 3866 Attribute::ReadNone, Attribute::ReadOnly, Attribute::WriteOnly}; 3867 3868 /// Memory behavior attribute for a floating value. 3869 struct AAMemoryBehaviorFloating : AAMemoryBehaviorImpl { 3870 AAMemoryBehaviorFloating(const IRPosition &IRP) : AAMemoryBehaviorImpl(IRP) {} 3871 3872 /// See AbstractAttribute::initialize(...). 3873 void initialize(Attributor &A) override { 3874 AAMemoryBehaviorImpl::initialize(A); 3875 // Initialize the use vector with all direct uses of the associated value. 3876 for (const Use &U : getAssociatedValue().uses()) 3877 Uses.insert(&U); 3878 } 3879 3880 /// See AbstractAttribute::updateImpl(...). 3881 ChangeStatus updateImpl(Attributor &A) override; 3882 3883 /// See AbstractAttribute::trackStatistics() 3884 void trackStatistics() const override { 3885 if (isAssumedReadNone()) 3886 STATS_DECLTRACK_FLOATING_ATTR(readnone) 3887 else if (isAssumedReadOnly()) 3888 STATS_DECLTRACK_FLOATING_ATTR(readonly) 3889 else if (isAssumedWriteOnly()) 3890 STATS_DECLTRACK_FLOATING_ATTR(writeonly) 3891 } 3892 3893 private: 3894 /// Return true if users of \p UserI might access the underlying 3895 /// variable/location described by \p U and should therefore be analyzed. 3896 bool followUsersOfUseIn(Attributor &A, const Use *U, 3897 const Instruction *UserI); 3898 3899 /// Update the state according to the effect of use \p U in \p UserI. 3900 void analyzeUseIn(Attributor &A, const Use *U, const Instruction *UserI); 3901 3902 protected: 3903 /// Container for (transitive) uses of the associated argument. 3904 SetVector<const Use *> Uses; 3905 }; 3906 3907 /// Memory behavior attribute for function argument. 3908 struct AAMemoryBehaviorArgument : AAMemoryBehaviorFloating { 3909 AAMemoryBehaviorArgument(const IRPosition &IRP) 3910 : AAMemoryBehaviorFloating(IRP) {} 3911 3912 /// See AbstractAttribute::initialize(...). 3913 void initialize(Attributor &A) override { 3914 AAMemoryBehaviorFloating::initialize(A); 3915 3916 // Initialize the use vector with all direct uses of the associated value. 3917 Argument *Arg = getAssociatedArgument(); 3918 if (!Arg || !Arg->getParent()->hasExactDefinition()) 3919 indicatePessimisticFixpoint(); 3920 } 3921 3922 ChangeStatus manifest(Attributor &A) override { 3923 // TODO: From readattrs.ll: "inalloca parameters are always 3924 // considered written" 3925 if (hasAttr({Attribute::InAlloca})) { 3926 removeKnownBits(NO_WRITES); 3927 removeAssumedBits(NO_WRITES); 3928 } 3929 return AAMemoryBehaviorFloating::manifest(A); 3930 } 3931 3932 3933 /// See AbstractAttribute::trackStatistics() 3934 void trackStatistics() const override { 3935 if (isAssumedReadNone()) 3936 STATS_DECLTRACK_ARG_ATTR(readnone) 3937 else if (isAssumedReadOnly()) 3938 STATS_DECLTRACK_ARG_ATTR(readonly) 3939 else if (isAssumedWriteOnly()) 3940 STATS_DECLTRACK_ARG_ATTR(writeonly) 3941 } 3942 }; 3943 3944 struct AAMemoryBehaviorCallSiteArgument final : AAMemoryBehaviorArgument { 3945 AAMemoryBehaviorCallSiteArgument(const IRPosition &IRP) 3946 : AAMemoryBehaviorArgument(IRP) {} 3947 3948 /// See AbstractAttribute::updateImpl(...). 3949 ChangeStatus updateImpl(Attributor &A) override { 3950 // TODO: Once we have call site specific value information we can provide 3951 // call site specific liveness liveness information and then it makes 3952 // sense to specialize attributes for call sites arguments instead of 3953 // redirecting requests to the callee argument. 3954 Argument *Arg = getAssociatedArgument(); 3955 const IRPosition &ArgPos = IRPosition::argument(*Arg); 3956 auto &ArgAA = A.getAAFor<AAMemoryBehavior>(*this, ArgPos); 3957 return clampStateAndIndicateChange( 3958 getState(), 3959 static_cast<const AANoCapture::StateType &>(ArgAA.getState())); 3960 } 3961 3962 /// See AbstractAttribute::trackStatistics() 3963 void trackStatistics() const override { 3964 if (isAssumedReadNone()) 3965 STATS_DECLTRACK_CSARG_ATTR(readnone) 3966 else if (isAssumedReadOnly()) 3967 STATS_DECLTRACK_CSARG_ATTR(readonly) 3968 else if (isAssumedWriteOnly()) 3969 STATS_DECLTRACK_CSARG_ATTR(writeonly) 3970 } 3971 }; 3972 3973 /// Memory behavior attribute for a call site return position. 3974 struct AAMemoryBehaviorCallSiteReturned final : AAMemoryBehaviorFloating { 3975 AAMemoryBehaviorCallSiteReturned(const IRPosition &IRP) 3976 : AAMemoryBehaviorFloating(IRP) {} 3977 3978 /// See AbstractAttribute::manifest(...). 3979 ChangeStatus manifest(Attributor &A) override { 3980 // We do not annotate returned values. 3981 return ChangeStatus::UNCHANGED; 3982 } 3983 3984 /// See AbstractAttribute::trackStatistics() 3985 void trackStatistics() const override {} 3986 }; 3987 3988 /// An AA to represent the memory behavior function attributes. 3989 struct AAMemoryBehaviorFunction final : public AAMemoryBehaviorImpl { 3990 AAMemoryBehaviorFunction(const IRPosition &IRP) : AAMemoryBehaviorImpl(IRP) {} 3991 3992 /// See AbstractAttribute::updateImpl(Attributor &A). 3993 virtual ChangeStatus updateImpl(Attributor &A) override; 3994 3995 /// See AbstractAttribute::manifest(...). 3996 ChangeStatus manifest(Attributor &A) override { 3997 Function &F = cast<Function>(getAnchorValue()); 3998 if (isAssumedReadNone()) { 3999 F.removeFnAttr(Attribute::ArgMemOnly); 4000 F.removeFnAttr(Attribute::InaccessibleMemOnly); 4001 F.removeFnAttr(Attribute::InaccessibleMemOrArgMemOnly); 4002 } 4003 return AAMemoryBehaviorImpl::manifest(A); 4004 } 4005 4006 /// See AbstractAttribute::trackStatistics() 4007 void trackStatistics() const override { 4008 if (isAssumedReadNone()) 4009 STATS_DECLTRACK_FN_ATTR(readnone) 4010 else if (isAssumedReadOnly()) 4011 STATS_DECLTRACK_FN_ATTR(readonly) 4012 else if (isAssumedWriteOnly()) 4013 STATS_DECLTRACK_FN_ATTR(writeonly) 4014 } 4015 }; 4016 4017 /// AAMemoryBehavior attribute for call sites. 4018 struct AAMemoryBehaviorCallSite final : AAMemoryBehaviorImpl { 4019 AAMemoryBehaviorCallSite(const IRPosition &IRP) : AAMemoryBehaviorImpl(IRP) {} 4020 4021 /// See AbstractAttribute::initialize(...). 4022 void initialize(Attributor &A) override { 4023 AAMemoryBehaviorImpl::initialize(A); 4024 Function *F = getAssociatedFunction(); 4025 if (!F || !F->hasExactDefinition()) 4026 indicatePessimisticFixpoint(); 4027 } 4028 4029 /// See AbstractAttribute::updateImpl(...). 4030 ChangeStatus updateImpl(Attributor &A) override { 4031 // TODO: Once we have call site specific value information we can provide 4032 // call site specific liveness liveness information and then it makes 4033 // sense to specialize attributes for call sites arguments instead of 4034 // redirecting requests to the callee argument. 4035 Function *F = getAssociatedFunction(); 4036 const IRPosition &FnPos = IRPosition::function(*F); 4037 auto &FnAA = A.getAAFor<AAMemoryBehavior>(*this, FnPos); 4038 return clampStateAndIndicateChange( 4039 getState(), static_cast<const AAAlign::StateType &>(FnAA.getState())); 4040 } 4041 4042 /// See AbstractAttribute::trackStatistics() 4043 void trackStatistics() const override { 4044 if (isAssumedReadNone()) 4045 STATS_DECLTRACK_CS_ATTR(readnone) 4046 else if (isAssumedReadOnly()) 4047 STATS_DECLTRACK_CS_ATTR(readonly) 4048 else if (isAssumedWriteOnly()) 4049 STATS_DECLTRACK_CS_ATTR(writeonly) 4050 } 4051 }; 4052 } // namespace 4053 4054 ChangeStatus AAMemoryBehaviorFunction::updateImpl(Attributor &A) { 4055 4056 // The current assumed state used to determine a change. 4057 auto AssumedState = getAssumed(); 4058 4059 auto CheckRWInst = [&](Instruction &I) { 4060 // If the instruction has an own memory behavior state, use it to restrict 4061 // the local state. No further analysis is required as the other memory 4062 // state is as optimistic as it gets. 4063 if (ImmutableCallSite ICS = ImmutableCallSite(&I)) { 4064 const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>( 4065 *this, IRPosition::callsite_function(ICS)); 4066 intersectAssumedBits(MemBehaviorAA.getAssumed()); 4067 return !isAtFixpoint(); 4068 } 4069 4070 // Remove access kind modifiers if necessary. 4071 if (I.mayReadFromMemory()) 4072 removeAssumedBits(NO_READS); 4073 if (I.mayWriteToMemory()) 4074 removeAssumedBits(NO_WRITES); 4075 return !isAtFixpoint(); 4076 }; 4077 4078 if (!A.checkForAllReadWriteInstructions(CheckRWInst, *this)) 4079 return indicatePessimisticFixpoint(); 4080 4081 return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED 4082 : ChangeStatus::UNCHANGED; 4083 } 4084 4085 ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) { 4086 4087 const IRPosition &IRP = getIRPosition(); 4088 const IRPosition &FnPos = IRPosition::function_scope(IRP); 4089 AAMemoryBehavior::StateType &S = getState(); 4090 4091 // First, check the function scope. We take the known information and we avoid 4092 // work if the assumed information implies the current assumed information for 4093 // this attribute. 4094 const auto &FnMemAA = A.getAAFor<AAMemoryBehavior>(*this, FnPos); 4095 S.addKnownBits(FnMemAA.getKnown()); 4096 if ((S.getAssumed() & FnMemAA.getAssumed()) == S.getAssumed()) 4097 return ChangeStatus::UNCHANGED; 4098 4099 // Make sure the value is not captured (except through "return"), if 4100 // it is, any information derived would be irrelevant anyway as we cannot 4101 // check the potential aliases introduced by the capture. However, no need 4102 // to fall back to anythign less optimistic than the function state. 4103 const auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(*this, IRP); 4104 if (!ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) { 4105 S.intersectAssumedBits(FnMemAA.getAssumed()); 4106 return ChangeStatus::CHANGED; 4107 } 4108 4109 // The current assumed state used to determine a change. 4110 auto AssumedState = S.getAssumed(); 4111 4112 // Liveness information to exclude dead users. 4113 // TODO: Take the FnPos once we have call site specific liveness information. 4114 const auto &LivenessAA = A.getAAFor<AAIsDead>( 4115 *this, IRPosition::function(*IRP.getAssociatedFunction())); 4116 4117 // Visit and expand uses until all are analyzed or a fixpoint is reached. 4118 for (unsigned i = 0; i < Uses.size() && !isAtFixpoint(); i++) { 4119 const Use *U = Uses[i]; 4120 Instruction *UserI = cast<Instruction>(U->getUser()); 4121 LLVM_DEBUG(dbgs() << "[AAMemoryBehavior] Use: " << **U << " in " << *UserI 4122 << " [Dead: " << (LivenessAA.isAssumedDead(UserI)) 4123 << "]\n"); 4124 if (LivenessAA.isAssumedDead(UserI)) 4125 continue; 4126 4127 // Check if the users of UserI should also be visited. 4128 if (followUsersOfUseIn(A, U, UserI)) 4129 for (const Use &UserIUse : UserI->uses()) 4130 Uses.insert(&UserIUse); 4131 4132 // If UserI might touch memory we analyze the use in detail. 4133 if (UserI->mayReadOrWriteMemory()) 4134 analyzeUseIn(A, U, UserI); 4135 } 4136 4137 return (AssumedState != getAssumed()) ? ChangeStatus::CHANGED 4138 : ChangeStatus::UNCHANGED; 4139 } 4140 4141 bool AAMemoryBehaviorFloating::followUsersOfUseIn(Attributor &A, const Use *U, 4142 const Instruction *UserI) { 4143 // The loaded value is unrelated to the pointer argument, no need to 4144 // follow the users of the load. 4145 if (isa<LoadInst>(UserI)) 4146 return false; 4147 4148 // By default we follow all uses assuming UserI might leak information on U, 4149 // we have special handling for call sites operands though. 4150 ImmutableCallSite ICS(UserI); 4151 if (!ICS || !ICS.isArgOperand(U)) 4152 return true; 4153 4154 // If the use is a call argument known not to be captured, the users of 4155 // the call do not need to be visited because they have to be unrelated to 4156 // the input. Note that this check is not trivial even though we disallow 4157 // general capturing of the underlying argument. The reason is that the 4158 // call might the argument "through return", which we allow and for which we 4159 // need to check call users. 4160 unsigned ArgNo = ICS.getArgumentNo(U); 4161 const auto &ArgNoCaptureAA = 4162 A.getAAFor<AANoCapture>(*this, IRPosition::callsite_argument(ICS, ArgNo)); 4163 return !ArgNoCaptureAA.isAssumedNoCapture(); 4164 } 4165 4166 void AAMemoryBehaviorFloating::analyzeUseIn(Attributor &A, const Use *U, 4167 const Instruction *UserI) { 4168 assert(UserI->mayReadOrWriteMemory()); 4169 4170 switch (UserI->getOpcode()) { 4171 default: 4172 // TODO: Handle all atomics and other side-effect operations we know of. 4173 break; 4174 case Instruction::Load: 4175 // Loads cause the NO_READS property to disappear. 4176 removeAssumedBits(NO_READS); 4177 return; 4178 4179 case Instruction::Store: 4180 // Stores cause the NO_WRITES property to disappear if the use is the 4181 // pointer operand. Note that we do assume that capturing was taken care of 4182 // somewhere else. 4183 if (cast<StoreInst>(UserI)->getPointerOperand() == U->get()) 4184 removeAssumedBits(NO_WRITES); 4185 return; 4186 4187 case Instruction::Call: 4188 case Instruction::CallBr: 4189 case Instruction::Invoke: { 4190 // For call sites we look at the argument memory behavior attribute (this 4191 // could be recursive!) in order to restrict our own state. 4192 ImmutableCallSite ICS(UserI); 4193 4194 // Give up on operand bundles. 4195 if (ICS.isBundleOperand(U)) { 4196 indicatePessimisticFixpoint(); 4197 return; 4198 } 4199 4200 // Calling a function does read the function pointer, maybe write it if the 4201 // function is self-modifying. 4202 if (ICS.isCallee(U)) { 4203 removeAssumedBits(NO_READS); 4204 break; 4205 } 4206 4207 // Adjust the possible access behavior based on the information on the 4208 // argument. 4209 unsigned ArgNo = ICS.getArgumentNo(U); 4210 const IRPosition &ArgPos = IRPosition::callsite_argument(ICS, ArgNo); 4211 const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>(*this, ArgPos); 4212 // "assumed" has at most the same bits as the MemBehaviorAA assumed 4213 // and at least "known". 4214 intersectAssumedBits(MemBehaviorAA.getAssumed()); 4215 return; 4216 } 4217 }; 4218 4219 // Generally, look at the "may-properties" and adjust the assumed state if we 4220 // did not trigger special handling before. 4221 if (UserI->mayReadFromMemory()) 4222 removeAssumedBits(NO_READS); 4223 if (UserI->mayWriteToMemory()) 4224 removeAssumedBits(NO_WRITES); 4225 } 4226 4227 /// ---------------------------------------------------------------------------- 4228 /// Attributor 4229 /// ---------------------------------------------------------------------------- 4230 4231 bool Attributor::isAssumedDead(const AbstractAttribute &AA, 4232 const AAIsDead *LivenessAA) { 4233 const Instruction *CtxI = AA.getIRPosition().getCtxI(); 4234 if (!CtxI) 4235 return false; 4236 4237 if (!LivenessAA) 4238 LivenessAA = 4239 &getAAFor<AAIsDead>(AA, IRPosition::function(*CtxI->getFunction()), 4240 /* TrackDependence */ false); 4241 4242 // Don't check liveness for AAIsDead. 4243 if (&AA == LivenessAA) 4244 return false; 4245 4246 if (!LivenessAA->isAssumedDead(CtxI)) 4247 return false; 4248 4249 // We actually used liveness information so we have to record a dependence. 4250 recordDependence(*LivenessAA, AA); 4251 4252 return true; 4253 } 4254 4255 bool Attributor::checkForAllCallSites( 4256 const function_ref<bool(AbstractCallSite)> &Pred, 4257 const AbstractAttribute &QueryingAA, bool RequireAllCallSites) { 4258 // We can try to determine information from 4259 // the call sites. However, this is only possible all call sites are known, 4260 // hence the function has internal linkage. 4261 const IRPosition &IRP = QueryingAA.getIRPosition(); 4262 const Function *AssociatedFunction = IRP.getAssociatedFunction(); 4263 if (!AssociatedFunction) { 4264 LLVM_DEBUG(dbgs() << "[Attributor] No function associated with " << IRP 4265 << "\n"); 4266 return false; 4267 } 4268 4269 return checkForAllCallSites(Pred, *AssociatedFunction, RequireAllCallSites, 4270 &QueryingAA); 4271 } 4272 4273 bool Attributor::checkForAllCallSites( 4274 const function_ref<bool(AbstractCallSite)> &Pred, const Function &Fn, 4275 bool RequireAllCallSites, const AbstractAttribute *QueryingAA) { 4276 if (RequireAllCallSites && !Fn.hasLocalLinkage()) { 4277 LLVM_DEBUG( 4278 dbgs() 4279 << "[Attributor] Function " << Fn.getName() 4280 << " has no internal linkage, hence not all call sites are known\n"); 4281 return false; 4282 } 4283 4284 for (const Use &U : Fn.uses()) { 4285 AbstractCallSite ACS(&U); 4286 if (!ACS) { 4287 LLVM_DEBUG(dbgs() << "[Attributor] Function " 4288 << Fn.getName() 4289 << " has non call site use " << *U.get() << " in " 4290 << *U.getUser() << "\n"); 4291 return false; 4292 } 4293 4294 Instruction *I = ACS.getInstruction(); 4295 Function *Caller = I->getFunction(); 4296 4297 const auto *LivenessAA = 4298 lookupAAFor<AAIsDead>(IRPosition::function(*Caller), QueryingAA, 4299 /* TrackDependence */ false); 4300 4301 // Skip dead calls. 4302 if (LivenessAA && LivenessAA->isAssumedDead(I)) { 4303 // We actually used liveness information so we have to record a 4304 // dependence. 4305 if (QueryingAA) 4306 recordDependence(*LivenessAA, *QueryingAA); 4307 continue; 4308 } 4309 4310 const Use *EffectiveUse = 4311 ACS.isCallbackCall() ? &ACS.getCalleeUseForCallback() : &U; 4312 if (!ACS.isCallee(EffectiveUse)) { 4313 if (!RequireAllCallSites) 4314 continue; 4315 LLVM_DEBUG(dbgs() << "[Attributor] User " << EffectiveUse->getUser() 4316 << " is an invalid use of " 4317 << Fn.getName() << "\n"); 4318 return false; 4319 } 4320 4321 if (Pred(ACS)) 4322 continue; 4323 4324 LLVM_DEBUG(dbgs() << "[Attributor] Call site callback failed for " 4325 << *ACS.getInstruction() << "\n"); 4326 return false; 4327 } 4328 4329 return true; 4330 } 4331 4332 bool Attributor::checkForAllReturnedValuesAndReturnInsts( 4333 const function_ref<bool(Value &, const SmallSetVector<ReturnInst *, 4> &)> 4334 &Pred, 4335 const AbstractAttribute &QueryingAA) { 4336 4337 const IRPosition &IRP = QueryingAA.getIRPosition(); 4338 // Since we need to provide return instructions we have to have an exact 4339 // definition. 4340 const Function *AssociatedFunction = IRP.getAssociatedFunction(); 4341 if (!AssociatedFunction) 4342 return false; 4343 4344 // If this is a call site query we use the call site specific return values 4345 // and liveness information. 4346 // TODO: use the function scope once we have call site AAReturnedValues. 4347 const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction); 4348 const auto &AARetVal = getAAFor<AAReturnedValues>(QueryingAA, QueryIRP); 4349 if (!AARetVal.getState().isValidState()) 4350 return false; 4351 4352 return AARetVal.checkForAllReturnedValuesAndReturnInsts(Pred); 4353 } 4354 4355 bool Attributor::checkForAllReturnedValues( 4356 const function_ref<bool(Value &)> &Pred, 4357 const AbstractAttribute &QueryingAA) { 4358 4359 const IRPosition &IRP = QueryingAA.getIRPosition(); 4360 const Function *AssociatedFunction = IRP.getAssociatedFunction(); 4361 if (!AssociatedFunction) 4362 return false; 4363 4364 // TODO: use the function scope once we have call site AAReturnedValues. 4365 const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction); 4366 const auto &AARetVal = getAAFor<AAReturnedValues>(QueryingAA, QueryIRP); 4367 if (!AARetVal.getState().isValidState()) 4368 return false; 4369 4370 return AARetVal.checkForAllReturnedValuesAndReturnInsts( 4371 [&](Value &RV, const SmallSetVector<ReturnInst *, 4> &) { 4372 return Pred(RV); 4373 }); 4374 } 4375 4376 static bool 4377 checkForAllInstructionsImpl(InformationCache::OpcodeInstMapTy &OpcodeInstMap, 4378 const function_ref<bool(Instruction &)> &Pred, 4379 const AAIsDead *LivenessAA, bool &AnyDead, 4380 const ArrayRef<unsigned> &Opcodes) { 4381 for (unsigned Opcode : Opcodes) { 4382 for (Instruction *I : OpcodeInstMap[Opcode]) { 4383 // Skip dead instructions. 4384 if (LivenessAA && LivenessAA->isAssumedDead(I)) { 4385 AnyDead = true; 4386 continue; 4387 } 4388 4389 if (!Pred(*I)) 4390 return false; 4391 } 4392 } 4393 return true; 4394 } 4395 4396 bool Attributor::checkForAllInstructions( 4397 const llvm::function_ref<bool(Instruction &)> &Pred, 4398 const AbstractAttribute &QueryingAA, const ArrayRef<unsigned> &Opcodes) { 4399 4400 const IRPosition &IRP = QueryingAA.getIRPosition(); 4401 // Since we need to provide instructions we have to have an exact definition. 4402 const Function *AssociatedFunction = IRP.getAssociatedFunction(); 4403 if (!AssociatedFunction) 4404 return false; 4405 4406 // TODO: use the function scope once we have call site AAReturnedValues. 4407 const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction); 4408 const auto &LivenessAA = 4409 getAAFor<AAIsDead>(QueryingAA, QueryIRP, /* TrackDependence */ false); 4410 bool AnyDead = false; 4411 4412 auto &OpcodeInstMap = 4413 InfoCache.getOpcodeInstMapForFunction(*AssociatedFunction); 4414 if (!checkForAllInstructionsImpl(OpcodeInstMap, Pred, &LivenessAA, AnyDead, 4415 Opcodes)) 4416 return false; 4417 4418 // If we actually used liveness information so we have to record a dependence. 4419 if (AnyDead) 4420 recordDependence(LivenessAA, QueryingAA); 4421 4422 return true; 4423 } 4424 4425 bool Attributor::checkForAllReadWriteInstructions( 4426 const llvm::function_ref<bool(Instruction &)> &Pred, 4427 AbstractAttribute &QueryingAA) { 4428 4429 const Function *AssociatedFunction = 4430 QueryingAA.getIRPosition().getAssociatedFunction(); 4431 if (!AssociatedFunction) 4432 return false; 4433 4434 // TODO: use the function scope once we have call site AAReturnedValues. 4435 const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction); 4436 const auto &LivenessAA = 4437 getAAFor<AAIsDead>(QueryingAA, QueryIRP, /* TrackDependence */ false); 4438 bool AnyDead = false; 4439 4440 for (Instruction *I : 4441 InfoCache.getReadOrWriteInstsForFunction(*AssociatedFunction)) { 4442 // Skip dead instructions. 4443 if (LivenessAA.isAssumedDead(I)) { 4444 AnyDead = true; 4445 continue; 4446 } 4447 4448 if (!Pred(*I)) 4449 return false; 4450 } 4451 4452 // If we actually used liveness information so we have to record a dependence. 4453 if (AnyDead) 4454 recordDependence(LivenessAA, QueryingAA); 4455 4456 return true; 4457 } 4458 4459 ChangeStatus Attributor::run(Module &M) { 4460 LLVM_DEBUG(dbgs() << "[Attributor] Identified and initialized " 4461 << AllAbstractAttributes.size() 4462 << " abstract attributes.\n"); 4463 4464 // Now that all abstract attributes are collected and initialized we start 4465 // the abstract analysis. 4466 4467 unsigned IterationCounter = 1; 4468 4469 SmallVector<AbstractAttribute *, 64> ChangedAAs; 4470 SetVector<AbstractAttribute *> Worklist; 4471 Worklist.insert(AllAbstractAttributes.begin(), AllAbstractAttributes.end()); 4472 4473 bool RecomputeDependences = false; 4474 4475 do { 4476 // Remember the size to determine new attributes. 4477 size_t NumAAs = AllAbstractAttributes.size(); 4478 LLVM_DEBUG(dbgs() << "\n\n[Attributor] #Iteration: " << IterationCounter 4479 << ", Worklist size: " << Worklist.size() << "\n"); 4480 4481 // If dependences (=QueryMap) are recomputed we have to look at all abstract 4482 // attributes again, regardless of what changed in the last iteration. 4483 if (RecomputeDependences) { 4484 LLVM_DEBUG( 4485 dbgs() << "[Attributor] Run all AAs to recompute dependences\n"); 4486 QueryMap.clear(); 4487 ChangedAAs.clear(); 4488 Worklist.insert(AllAbstractAttributes.begin(), 4489 AllAbstractAttributes.end()); 4490 } 4491 4492 // Add all abstract attributes that are potentially dependent on one that 4493 // changed to the work list. 4494 for (AbstractAttribute *ChangedAA : ChangedAAs) { 4495 auto &QuerriedAAs = QueryMap[ChangedAA]; 4496 Worklist.insert(QuerriedAAs.begin(), QuerriedAAs.end()); 4497 } 4498 4499 LLVM_DEBUG(dbgs() << "[Attributor] #Iteration: " << IterationCounter 4500 << ", Worklist+Dependent size: " << Worklist.size() 4501 << "\n"); 4502 4503 // Reset the changed set. 4504 ChangedAAs.clear(); 4505 4506 // Update all abstract attribute in the work list and record the ones that 4507 // changed. 4508 for (AbstractAttribute *AA : Worklist) 4509 if (!isAssumedDead(*AA, nullptr)) 4510 if (AA->update(*this) == ChangeStatus::CHANGED) 4511 ChangedAAs.push_back(AA); 4512 4513 // Check if we recompute the dependences in the next iteration. 4514 RecomputeDependences = (DepRecomputeInterval > 0 && 4515 IterationCounter % DepRecomputeInterval == 0); 4516 4517 // Add attributes to the changed set if they have been created in the last 4518 // iteration. 4519 ChangedAAs.append(AllAbstractAttributes.begin() + NumAAs, 4520 AllAbstractAttributes.end()); 4521 4522 // Reset the work list and repopulate with the changed abstract attributes. 4523 // Note that dependent ones are added above. 4524 Worklist.clear(); 4525 Worklist.insert(ChangedAAs.begin(), ChangedAAs.end()); 4526 4527 } while (!Worklist.empty() && (IterationCounter++ < MaxFixpointIterations || 4528 VerifyMaxFixpointIterations)); 4529 4530 LLVM_DEBUG(dbgs() << "\n[Attributor] Fixpoint iteration done after: " 4531 << IterationCounter << "/" << MaxFixpointIterations 4532 << " iterations\n"); 4533 4534 size_t NumFinalAAs = AllAbstractAttributes.size(); 4535 4536 // Reset abstract arguments not settled in a sound fixpoint by now. This 4537 // happens when we stopped the fixpoint iteration early. Note that only the 4538 // ones marked as "changed" *and* the ones transitively depending on them 4539 // need to be reverted to a pessimistic state. Others might not be in a 4540 // fixpoint state but we can use the optimistic results for them anyway. 4541 SmallPtrSet<AbstractAttribute *, 32> Visited; 4542 for (unsigned u = 0; u < ChangedAAs.size(); u++) { 4543 AbstractAttribute *ChangedAA = ChangedAAs[u]; 4544 if (!Visited.insert(ChangedAA).second) 4545 continue; 4546 4547 AbstractState &State = ChangedAA->getState(); 4548 if (!State.isAtFixpoint()) { 4549 State.indicatePessimisticFixpoint(); 4550 4551 NumAttributesTimedOut++; 4552 } 4553 4554 auto &QuerriedAAs = QueryMap[ChangedAA]; 4555 ChangedAAs.append(QuerriedAAs.begin(), QuerriedAAs.end()); 4556 } 4557 4558 LLVM_DEBUG({ 4559 if (!Visited.empty()) 4560 dbgs() << "\n[Attributor] Finalized " << Visited.size() 4561 << " abstract attributes.\n"; 4562 }); 4563 4564 unsigned NumManifested = 0; 4565 unsigned NumAtFixpoint = 0; 4566 ChangeStatus ManifestChange = ChangeStatus::UNCHANGED; 4567 for (AbstractAttribute *AA : AllAbstractAttributes) { 4568 AbstractState &State = AA->getState(); 4569 4570 // If there is not already a fixpoint reached, we can now take the 4571 // optimistic state. This is correct because we enforced a pessimistic one 4572 // on abstract attributes that were transitively dependent on a changed one 4573 // already above. 4574 if (!State.isAtFixpoint()) 4575 State.indicateOptimisticFixpoint(); 4576 4577 // If the state is invalid, we do not try to manifest it. 4578 if (!State.isValidState()) 4579 continue; 4580 4581 // Skip dead code. 4582 if (isAssumedDead(*AA, nullptr)) 4583 continue; 4584 // Manifest the state and record if we changed the IR. 4585 ChangeStatus LocalChange = AA->manifest(*this); 4586 if (LocalChange == ChangeStatus::CHANGED && AreStatisticsEnabled()) 4587 AA->trackStatistics(); 4588 4589 ManifestChange = ManifestChange | LocalChange; 4590 4591 NumAtFixpoint++; 4592 NumManifested += (LocalChange == ChangeStatus::CHANGED); 4593 } 4594 4595 (void)NumManifested; 4596 (void)NumAtFixpoint; 4597 LLVM_DEBUG(dbgs() << "\n[Attributor] Manifested " << NumManifested 4598 << " arguments while " << NumAtFixpoint 4599 << " were in a valid fixpoint state\n"); 4600 4601 NumAttributesManifested += NumManifested; 4602 NumAttributesValidFixpoint += NumAtFixpoint; 4603 4604 (void)NumFinalAAs; 4605 assert( 4606 NumFinalAAs == AllAbstractAttributes.size() && 4607 "Expected the final number of abstract attributes to remain unchanged!"); 4608 4609 // Delete stuff at the end to avoid invalid references and a nice order. 4610 { 4611 LLVM_DEBUG(dbgs() << "\n[Attributor] Delete at least " 4612 << ToBeDeletedFunctions.size() << " functions and " 4613 << ToBeDeletedBlocks.size() << " blocks and " 4614 << ToBeDeletedInsts.size() << " instructions\n"); 4615 for (Instruction *I : ToBeDeletedInsts) { 4616 if (!I->use_empty()) 4617 I->replaceAllUsesWith(UndefValue::get(I->getType())); 4618 I->eraseFromParent(); 4619 } 4620 4621 if (unsigned NumDeadBlocks = ToBeDeletedBlocks.size()) { 4622 SmallVector<BasicBlock *, 8> ToBeDeletedBBs; 4623 ToBeDeletedBBs.reserve(NumDeadBlocks); 4624 ToBeDeletedBBs.append(ToBeDeletedBlocks.begin(), ToBeDeletedBlocks.end()); 4625 DeleteDeadBlocks(ToBeDeletedBBs); 4626 STATS_DECLTRACK(AAIsDead, BasicBlock, 4627 "Number of dead basic blocks deleted."); 4628 } 4629 4630 STATS_DECL(AAIsDead, Function, "Number of dead functions deleted."); 4631 for (Function *Fn : ToBeDeletedFunctions) { 4632 Fn->replaceAllUsesWith(UndefValue::get(Fn->getType())); 4633 Fn->eraseFromParent(); 4634 STATS_TRACK(AAIsDead, Function); 4635 } 4636 4637 // Identify dead internal functions and delete them. This happens outside 4638 // the other fixpoint analysis as we might treat potentially dead functions 4639 // as live to lower the number of iterations. If they happen to be dead, the 4640 // below fixpoint loop will identify and eliminate them. 4641 SmallVector<Function *, 8> InternalFns; 4642 for (Function &F : M) 4643 if (F.hasLocalLinkage()) 4644 InternalFns.push_back(&F); 4645 4646 bool FoundDeadFn = true; 4647 while (FoundDeadFn) { 4648 FoundDeadFn = false; 4649 for (unsigned u = 0, e = InternalFns.size(); u < e; ++u) { 4650 Function *F = InternalFns[u]; 4651 if (!F) 4652 continue; 4653 4654 const auto *LivenessAA = 4655 lookupAAFor<AAIsDead>(IRPosition::function(*F)); 4656 if (LivenessAA && 4657 !checkForAllCallSites([](AbstractCallSite ACS) { return false; }, 4658 *LivenessAA, true)) 4659 continue; 4660 4661 STATS_TRACK(AAIsDead, Function); 4662 F->replaceAllUsesWith(UndefValue::get(F->getType())); 4663 F->eraseFromParent(); 4664 InternalFns[u] = nullptr; 4665 FoundDeadFn = true; 4666 } 4667 } 4668 } 4669 4670 if (VerifyMaxFixpointIterations && 4671 IterationCounter != MaxFixpointIterations) { 4672 errs() << "\n[Attributor] Fixpoint iteration done after: " 4673 << IterationCounter << "/" << MaxFixpointIterations 4674 << " iterations\n"; 4675 llvm_unreachable("The fixpoint was not reached with exactly the number of " 4676 "specified iterations!"); 4677 } 4678 4679 return ManifestChange; 4680 } 4681 4682 void Attributor::initializeInformationCache(Function &F) { 4683 4684 // Walk all instructions to find interesting instructions that might be 4685 // queried by abstract attributes during their initialization or update. 4686 // This has to happen before we create attributes. 4687 auto &ReadOrWriteInsts = InfoCache.FuncRWInstsMap[&F]; 4688 auto &InstOpcodeMap = InfoCache.FuncInstOpcodeMap[&F]; 4689 4690 for (Instruction &I : instructions(&F)) { 4691 bool IsInterestingOpcode = false; 4692 4693 // To allow easy access to all instructions in a function with a given 4694 // opcode we store them in the InfoCache. As not all opcodes are interesting 4695 // to concrete attributes we only cache the ones that are as identified in 4696 // the following switch. 4697 // Note: There are no concrete attributes now so this is initially empty. 4698 switch (I.getOpcode()) { 4699 default: 4700 assert((!ImmutableCallSite(&I)) && (!isa<CallBase>(&I)) && 4701 "New call site/base instruction type needs to be known int the " 4702 "Attributor."); 4703 break; 4704 case Instruction::Load: 4705 // The alignment of a pointer is interesting for loads. 4706 case Instruction::Store: 4707 // The alignment of a pointer is interesting for stores. 4708 case Instruction::Call: 4709 case Instruction::CallBr: 4710 case Instruction::Invoke: 4711 case Instruction::CleanupRet: 4712 case Instruction::CatchSwitch: 4713 case Instruction::Resume: 4714 case Instruction::Ret: 4715 IsInterestingOpcode = true; 4716 } 4717 if (IsInterestingOpcode) 4718 InstOpcodeMap[I.getOpcode()].push_back(&I); 4719 if (I.mayReadOrWriteMemory()) 4720 ReadOrWriteInsts.push_back(&I); 4721 } 4722 } 4723 4724 void Attributor::identifyDefaultAbstractAttributes(Function &F) { 4725 if (!VisitedFunctions.insert(&F).second) 4726 return; 4727 4728 IRPosition FPos = IRPosition::function(F); 4729 4730 // Check for dead BasicBlocks in every function. 4731 // We need dead instruction detection because we do not want to deal with 4732 // broken IR in which SSA rules do not apply. 4733 getOrCreateAAFor<AAIsDead>(FPos); 4734 4735 // Every function might be "will-return". 4736 getOrCreateAAFor<AAWillReturn>(FPos); 4737 4738 // Every function can be nounwind. 4739 getOrCreateAAFor<AANoUnwind>(FPos); 4740 4741 // Every function might be marked "nosync" 4742 getOrCreateAAFor<AANoSync>(FPos); 4743 4744 // Every function might be "no-free". 4745 getOrCreateAAFor<AANoFree>(FPos); 4746 4747 // Every function might be "no-return". 4748 getOrCreateAAFor<AANoReturn>(FPos); 4749 4750 // Every function might be "no-recurse". 4751 getOrCreateAAFor<AANoRecurse>(FPos); 4752 4753 // Every function might be "readnone/readonly/writeonly/...". 4754 getOrCreateAAFor<AAMemoryBehavior>(FPos); 4755 4756 // Every function might be applicable for Heap-To-Stack conversion. 4757 if (EnableHeapToStack) 4758 getOrCreateAAFor<AAHeapToStack>(FPos); 4759 4760 // Return attributes are only appropriate if the return type is non void. 4761 Type *ReturnType = F.getReturnType(); 4762 if (!ReturnType->isVoidTy()) { 4763 // Argument attribute "returned" --- Create only one per function even 4764 // though it is an argument attribute. 4765 getOrCreateAAFor<AAReturnedValues>(FPos); 4766 4767 IRPosition RetPos = IRPosition::returned(F); 4768 4769 // Every function might be simplified. 4770 getOrCreateAAFor<AAValueSimplify>(RetPos); 4771 4772 if (ReturnType->isPointerTy()) { 4773 4774 // Every function with pointer return type might be marked align. 4775 getOrCreateAAFor<AAAlign>(RetPos); 4776 4777 // Every function with pointer return type might be marked nonnull. 4778 getOrCreateAAFor<AANonNull>(RetPos); 4779 4780 // Every function with pointer return type might be marked noalias. 4781 getOrCreateAAFor<AANoAlias>(RetPos); 4782 4783 // Every function with pointer return type might be marked 4784 // dereferenceable. 4785 getOrCreateAAFor<AADereferenceable>(RetPos); 4786 } 4787 } 4788 4789 for (Argument &Arg : F.args()) { 4790 IRPosition ArgPos = IRPosition::argument(Arg); 4791 4792 // Every argument might be simplified. 4793 getOrCreateAAFor<AAValueSimplify>(ArgPos); 4794 4795 if (Arg.getType()->isPointerTy()) { 4796 // Every argument with pointer type might be marked nonnull. 4797 getOrCreateAAFor<AANonNull>(ArgPos); 4798 4799 // Every argument with pointer type might be marked noalias. 4800 getOrCreateAAFor<AANoAlias>(ArgPos); 4801 4802 // Every argument with pointer type might be marked dereferenceable. 4803 getOrCreateAAFor<AADereferenceable>(ArgPos); 4804 4805 // Every argument with pointer type might be marked align. 4806 getOrCreateAAFor<AAAlign>(ArgPos); 4807 4808 // Every argument with pointer type might be marked nocapture. 4809 getOrCreateAAFor<AANoCapture>(ArgPos); 4810 4811 // Every argument with pointer type might be marked 4812 // "readnone/readonly/writeonly/..." 4813 getOrCreateAAFor<AAMemoryBehavior>(ArgPos); 4814 } 4815 } 4816 4817 auto CallSitePred = [&](Instruction &I) -> bool { 4818 CallSite CS(&I); 4819 if (CS.getCalledFunction()) { 4820 for (int i = 0, e = CS.getCalledFunction()->arg_size(); i < e; i++) { 4821 4822 IRPosition CSArgPos = IRPosition::callsite_argument(CS, i); 4823 4824 // Call site argument might be simplified. 4825 getOrCreateAAFor<AAValueSimplify>(CSArgPos); 4826 4827 if (!CS.getArgument(i)->getType()->isPointerTy()) 4828 continue; 4829 4830 // Call site argument attribute "non-null". 4831 getOrCreateAAFor<AANonNull>(CSArgPos); 4832 4833 // Call site argument attribute "no-alias". 4834 getOrCreateAAFor<AANoAlias>(CSArgPos); 4835 4836 // Call site argument attribute "dereferenceable". 4837 getOrCreateAAFor<AADereferenceable>(CSArgPos); 4838 4839 // Call site argument attribute "align". 4840 getOrCreateAAFor<AAAlign>(CSArgPos); 4841 } 4842 } 4843 return true; 4844 }; 4845 4846 auto &OpcodeInstMap = InfoCache.getOpcodeInstMapForFunction(F); 4847 bool Success, AnyDead = false; 4848 Success = checkForAllInstructionsImpl( 4849 OpcodeInstMap, CallSitePred, nullptr, AnyDead, 4850 {(unsigned)Instruction::Invoke, (unsigned)Instruction::CallBr, 4851 (unsigned)Instruction::Call}); 4852 (void)Success; 4853 assert(Success && !AnyDead && "Expected the check call to be successful!"); 4854 4855 auto LoadStorePred = [&](Instruction &I) -> bool { 4856 if (isa<LoadInst>(I)) 4857 getOrCreateAAFor<AAAlign>( 4858 IRPosition::value(*cast<LoadInst>(I).getPointerOperand())); 4859 else 4860 getOrCreateAAFor<AAAlign>( 4861 IRPosition::value(*cast<StoreInst>(I).getPointerOperand())); 4862 return true; 4863 }; 4864 Success = checkForAllInstructionsImpl( 4865 OpcodeInstMap, LoadStorePred, nullptr, AnyDead, 4866 {(unsigned)Instruction::Load, (unsigned)Instruction::Store}); 4867 (void)Success; 4868 assert(Success && !AnyDead && "Expected the check call to be successful!"); 4869 } 4870 4871 /// Helpers to ease debugging through output streams and print calls. 4872 /// 4873 ///{ 4874 raw_ostream &llvm::operator<<(raw_ostream &OS, ChangeStatus S) { 4875 return OS << (S == ChangeStatus::CHANGED ? "changed" : "unchanged"); 4876 } 4877 4878 raw_ostream &llvm::operator<<(raw_ostream &OS, IRPosition::Kind AP) { 4879 switch (AP) { 4880 case IRPosition::IRP_INVALID: 4881 return OS << "inv"; 4882 case IRPosition::IRP_FLOAT: 4883 return OS << "flt"; 4884 case IRPosition::IRP_RETURNED: 4885 return OS << "fn_ret"; 4886 case IRPosition::IRP_CALL_SITE_RETURNED: 4887 return OS << "cs_ret"; 4888 case IRPosition::IRP_FUNCTION: 4889 return OS << "fn"; 4890 case IRPosition::IRP_CALL_SITE: 4891 return OS << "cs"; 4892 case IRPosition::IRP_ARGUMENT: 4893 return OS << "arg"; 4894 case IRPosition::IRP_CALL_SITE_ARGUMENT: 4895 return OS << "cs_arg"; 4896 } 4897 llvm_unreachable("Unknown attribute position!"); 4898 } 4899 4900 raw_ostream &llvm::operator<<(raw_ostream &OS, const IRPosition &Pos) { 4901 const Value &AV = Pos.getAssociatedValue(); 4902 return OS << "{" << Pos.getPositionKind() << ":" << AV.getName() << " [" 4903 << Pos.getAnchorValue().getName() << "@" << Pos.getArgNo() << "]}"; 4904 } 4905 4906 raw_ostream &llvm::operator<<(raw_ostream &OS, const IntegerState &S) { 4907 return OS << "(" << S.getKnown() << "-" << S.getAssumed() << ")" 4908 << static_cast<const AbstractState &>(S); 4909 } 4910 4911 raw_ostream &llvm::operator<<(raw_ostream &OS, const AbstractState &S) { 4912 return OS << (!S.isValidState() ? "top" : (S.isAtFixpoint() ? "fix" : "")); 4913 } 4914 4915 raw_ostream &llvm::operator<<(raw_ostream &OS, const AbstractAttribute &AA) { 4916 AA.print(OS); 4917 return OS; 4918 } 4919 4920 void AbstractAttribute::print(raw_ostream &OS) const { 4921 OS << "[P: " << getIRPosition() << "][" << getAsStr() << "][S: " << getState() 4922 << "]"; 4923 } 4924 ///} 4925 4926 /// ---------------------------------------------------------------------------- 4927 /// Pass (Manager) Boilerplate 4928 /// ---------------------------------------------------------------------------- 4929 4930 static bool runAttributorOnModule(Module &M, AnalysisGetter &AG) { 4931 if (DisableAttributor) 4932 return false; 4933 4934 LLVM_DEBUG(dbgs() << "[Attributor] Run on module with " << M.size() 4935 << " functions.\n"); 4936 4937 // Create an Attributor and initially empty information cache that is filled 4938 // while we identify default attribute opportunities. 4939 InformationCache InfoCache(M, AG); 4940 Attributor A(InfoCache, DepRecInterval); 4941 4942 for (Function &F : M) 4943 A.initializeInformationCache(F); 4944 4945 for (Function &F : M) { 4946 if (F.hasExactDefinition()) 4947 NumFnWithExactDefinition++; 4948 else 4949 NumFnWithoutExactDefinition++; 4950 4951 // We look at internal functions only on-demand but if any use is not a 4952 // direct call, we have to do it eagerly. 4953 if (F.hasLocalLinkage()) { 4954 if (llvm::all_of(F.uses(), [](const Use &U) { 4955 return ImmutableCallSite(U.getUser()) && 4956 ImmutableCallSite(U.getUser()).isCallee(&U); 4957 })) 4958 continue; 4959 } 4960 4961 // Populate the Attributor with abstract attribute opportunities in the 4962 // function and the information cache with IR information. 4963 A.identifyDefaultAbstractAttributes(F); 4964 } 4965 4966 return A.run(M) == ChangeStatus::CHANGED; 4967 } 4968 4969 PreservedAnalyses AttributorPass::run(Module &M, ModuleAnalysisManager &AM) { 4970 AnalysisGetter AG(AM); 4971 if (runAttributorOnModule(M, AG)) { 4972 // FIXME: Think about passes we will preserve and add them here. 4973 return PreservedAnalyses::none(); 4974 } 4975 return PreservedAnalyses::all(); 4976 } 4977 4978 namespace { 4979 4980 struct AttributorLegacyPass : public ModulePass { 4981 static char ID; 4982 4983 AttributorLegacyPass() : ModulePass(ID) { 4984 initializeAttributorLegacyPassPass(*PassRegistry::getPassRegistry()); 4985 } 4986 4987 bool runOnModule(Module &M) override { 4988 if (skipModule(M)) 4989 return false; 4990 4991 AnalysisGetter AG; 4992 return runAttributorOnModule(M, AG); 4993 } 4994 4995 void getAnalysisUsage(AnalysisUsage &AU) const override { 4996 // FIXME: Think about passes we will preserve and add them here. 4997 AU.addRequired<TargetLibraryInfoWrapperPass>(); 4998 } 4999 }; 5000 5001 } // end anonymous namespace 5002 5003 Pass *llvm::createAttributorLegacyPass() { return new AttributorLegacyPass(); } 5004 5005 char AttributorLegacyPass::ID = 0; 5006 5007 const char AAReturnedValues::ID = 0; 5008 const char AANoUnwind::ID = 0; 5009 const char AANoSync::ID = 0; 5010 const char AANoFree::ID = 0; 5011 const char AANonNull::ID = 0; 5012 const char AANoRecurse::ID = 0; 5013 const char AAWillReturn::ID = 0; 5014 const char AANoAlias::ID = 0; 5015 const char AANoReturn::ID = 0; 5016 const char AAIsDead::ID = 0; 5017 const char AADereferenceable::ID = 0; 5018 const char AAAlign::ID = 0; 5019 const char AANoCapture::ID = 0; 5020 const char AAValueSimplify::ID = 0; 5021 const char AAHeapToStack::ID = 0; 5022 const char AAMemoryBehavior::ID = 0; 5023 5024 // Macro magic to create the static generator function for attributes that 5025 // follow the naming scheme. 5026 5027 #define SWITCH_PK_INV(CLASS, PK, POS_NAME) \ 5028 case IRPosition::PK: \ 5029 llvm_unreachable("Cannot create " #CLASS " for a " POS_NAME " position!"); 5030 5031 #define SWITCH_PK_CREATE(CLASS, IRP, PK, SUFFIX) \ 5032 case IRPosition::PK: \ 5033 AA = new CLASS##SUFFIX(IRP); \ 5034 break; 5035 5036 #define CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 5037 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 5038 CLASS *AA = nullptr; \ 5039 switch (IRP.getPositionKind()) { \ 5040 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 5041 SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating") \ 5042 SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument") \ 5043 SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned") \ 5044 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned") \ 5045 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument") \ 5046 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 5047 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite) \ 5048 } \ 5049 return *AA; \ 5050 } 5051 5052 #define CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 5053 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 5054 CLASS *AA = nullptr; \ 5055 switch (IRP.getPositionKind()) { \ 5056 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 5057 SWITCH_PK_INV(CLASS, IRP_FUNCTION, "function") \ 5058 SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site") \ 5059 SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating) \ 5060 SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument) \ 5061 SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned) \ 5062 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned) \ 5063 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument) \ 5064 } \ 5065 return *AA; \ 5066 } 5067 5068 #define CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 5069 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 5070 CLASS *AA = nullptr; \ 5071 switch (IRP.getPositionKind()) { \ 5072 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 5073 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 5074 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite) \ 5075 SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating) \ 5076 SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument) \ 5077 SWITCH_PK_CREATE(CLASS, IRP, IRP_RETURNED, Returned) \ 5078 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned) \ 5079 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument) \ 5080 } \ 5081 return *AA; \ 5082 } 5083 5084 #define CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 5085 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 5086 CLASS *AA = nullptr; \ 5087 switch (IRP.getPositionKind()) { \ 5088 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 5089 SWITCH_PK_INV(CLASS, IRP_ARGUMENT, "argument") \ 5090 SWITCH_PK_INV(CLASS, IRP_FLOAT, "floating") \ 5091 SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned") \ 5092 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_RETURNED, "call site returned") \ 5093 SWITCH_PK_INV(CLASS, IRP_CALL_SITE_ARGUMENT, "call site argument") \ 5094 SWITCH_PK_INV(CLASS, IRP_CALL_SITE, "call site") \ 5095 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 5096 } \ 5097 return *AA; \ 5098 } 5099 5100 #define CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \ 5101 CLASS &CLASS::createForPosition(const IRPosition &IRP, Attributor &A) { \ 5102 CLASS *AA = nullptr; \ 5103 switch (IRP.getPositionKind()) { \ 5104 SWITCH_PK_INV(CLASS, IRP_INVALID, "invalid") \ 5105 SWITCH_PK_INV(CLASS, IRP_RETURNED, "returned") \ 5106 SWITCH_PK_CREATE(CLASS, IRP, IRP_FUNCTION, Function) \ 5107 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE, CallSite) \ 5108 SWITCH_PK_CREATE(CLASS, IRP, IRP_FLOAT, Floating) \ 5109 SWITCH_PK_CREATE(CLASS, IRP, IRP_ARGUMENT, Argument) \ 5110 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_RETURNED, CallSiteReturned) \ 5111 SWITCH_PK_CREATE(CLASS, IRP, IRP_CALL_SITE_ARGUMENT, CallSiteArgument) \ 5112 } \ 5113 return *AA; \ 5114 } 5115 5116 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoUnwind) 5117 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoSync) 5118 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoFree) 5119 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoRecurse) 5120 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAWillReturn) 5121 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoReturn) 5122 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAIsDead) 5123 CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAReturnedValues) 5124 5125 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANonNull) 5126 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoAlias) 5127 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AADereferenceable) 5128 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAlign) 5129 CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoCapture) 5130 5131 CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAValueSimplify) 5132 5133 CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAHeapToStack) 5134 5135 CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryBehavior) 5136 5137 #undef CREATE_FUNCTION_ONLY_ABSTRACT_ATTRIBUTE_FOR_POSITION 5138 #undef CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION 5139 #undef CREATE_NON_RET_ABSTRACT_ATTRIBUTE_FOR_POSITION 5140 #undef CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION 5141 #undef CREATE_ALL_ABSTRACT_ATTRIBUTE_FOR_POSITION 5142 #undef SWITCH_PK_CREATE 5143 #undef SWITCH_PK_INV 5144 5145 INITIALIZE_PASS_BEGIN(AttributorLegacyPass, "attributor", 5146 "Deduce and propagate attributes", false, false) 5147 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) 5148 INITIALIZE_PASS_END(AttributorLegacyPass, "attributor", 5149 "Deduce and propagate attributes", false, false) 5150