LLVM 24.0.0git
InferAddressSpaces.cpp
Go to the documentation of this file.
1//===- InferAddressSpace.cpp - --------------------------------------------===//
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// CUDA C/C++ includes memory space designation as variable type qualifers (such
10// as __global__ and __shared__). Knowing the space of a memory access allows
11// CUDA compilers to emit faster PTX loads and stores. For example, a load from
12// shared memory can be translated to `ld.shared` which is roughly 10% faster
13// than a generic `ld` on an NVIDIA Tesla K40c.
14//
15// Unfortunately, type qualifiers only apply to variable declarations, so CUDA
16// compilers must infer the memory space of an address expression from
17// type-qualified variables.
18//
19// LLVM IR uses non-zero (so-called) specific address spaces to represent memory
20// spaces (e.g. addrspace(3) means shared memory). The Clang frontend
21// places only type-qualified variables in specific address spaces, and then
22// conservatively `addrspacecast`s each type-qualified variable to addrspace(0)
23// (so-called the generic address space) for other instructions to use.
24//
25// For example, the Clang translates the following CUDA code
26// __shared__ float a[10];
27// float v = a[i];
28// to
29// %0 = addrspacecast [10 x float] addrspace(3)* @a to [10 x float]*
30// %1 = gep [10 x float], [10 x float]* %0, i64 0, i64 %i
31// %v = load float, float* %1 ; emits ld.f32
32// @a is in addrspace(3) since it's type-qualified, but its use from %1 is
33// redirected to %0 (the generic version of @a).
34//
35// The optimization implemented in this file propagates specific address spaces
36// from type-qualified variable declarations to its users. For example, it
37// optimizes the above IR to
38// %1 = gep [10 x float] addrspace(3)* @a, i64 0, i64 %i
39// %v = load float addrspace(3)* %1 ; emits ld.shared.f32
40// propagating the addrspace(3) from @a to %1. As the result, the NVPTX
41// codegen is able to emit ld.shared.f32 for %v.
42//
43// Address space inference works in two steps. First, it uses a data-flow
44// analysis to infer as many generic pointers as possible to point to only one
45// specific address space. In the above example, it can prove that %1 only
46// points to addrspace(3). This algorithm was published in
47// CUDA: Compiling and optimizing for a GPU platform
48// Chakrabarti, Grover, Aarts, Kong, Kudlur, Lin, Marathe, Murphy, Wang
49// ICCS 2012
50//
51// Then, address space inference replaces all refinable generic pointers with
52// equivalent specific pointers.
53//
54// The major challenge of implementing this optimization is handling PHINodes,
55// which may create loops in the data flow graph. This brings two complications.
56//
57// First, the data flow analysis in Step 1 needs to be circular. For example,
58// %generic.input = addrspacecast float addrspace(3)* %input to float*
59// loop:
60// %y = phi [ %generic.input, %y2 ]
61// %y2 = getelementptr %y, 1
62// %v = load %y2
63// br ..., label %loop, ...
64// proving %y specific requires proving both %generic.input and %y2 specific,
65// but proving %y2 specific circles back to %y. To address this complication,
66// the data flow analysis operates on a lattice:
67// uninitialized > specific address spaces > generic.
68// All address expressions (our implementation only considers phi, bitcast,
69// addrspacecast, and getelementptr) start with the uninitialized address space.
70// The monotone transfer function moves the address space of a pointer down a
71// lattice path from uninitialized to specific and then to generic. A join
72// operation of two different specific address spaces pushes the expression down
73// to their common address space. The analysis completes once it reaches a fixed
74// point.
75//
76// Second, IR rewriting in Step 2 also needs to be circular. For example,
77// converting %y to addrspace(3) requires the compiler to know the converted
78// %y2, but converting %y2 needs the converted %y. To address this complication,
79// we break these cycles using "poison" placeholders. When converting an
80// instruction `I` to a new address space, if its operand `Op` is not converted
81// yet, we let `I` temporarily use `poison` and fix all the uses later.
82// For instance, our algorithm first converts %y to
83// %y' = phi float addrspace(3)* [ %input, poison ]
84// Then, it converts %y2 to
85// %y2' = getelementptr %y', 1
86// Finally, it fixes the poison in %y' so that
87// %y' = phi float addrspace(3)* [ %input, %y2' ]
88//
89//===----------------------------------------------------------------------===//
90
92#include "llvm/ADT/ArrayRef.h"
93#include "llvm/ADT/DenseMap.h"
94#include "llvm/ADT/DenseSet.h"
95#include "llvm/ADT/SetVector.h"
100#include "llvm/IR/Argument.h"
101#include "llvm/IR/BasicBlock.h"
102#include "llvm/IR/Constant.h"
103#include "llvm/IR/Constants.h"
104#include "llvm/IR/Dominators.h"
105#include "llvm/IR/Function.h"
106#include "llvm/IR/IRBuilder.h"
107#include "llvm/IR/InstIterator.h"
108#include "llvm/IR/Instruction.h"
109#include "llvm/IR/Instructions.h"
111#include "llvm/IR/Intrinsics.h"
112#include "llvm/IR/LLVMContext.h"
113#include "llvm/IR/Operator.h"
114#include "llvm/IR/PassManager.h"
115#include "llvm/IR/PatternMatch.h"
116#include "llvm/IR/Type.h"
117#include "llvm/IR/Use.h"
118#include "llvm/IR/User.h"
119#include "llvm/IR/Value.h"
120#include "llvm/IR/ValueHandle.h"
122#include "llvm/Pass.h"
123#include "llvm/Support/Casting.h"
124#include "llvm/Support/Debug.h"
131#include <cassert>
132#include <iterator>
133#include <limits>
134#include <optional>
135#include <utility>
136#include <vector>
137
138#define DEBUG_TYPE "infer-address-spaces"
139
140using namespace llvm;
141using namespace llvm::PatternMatch;
142
143static const unsigned UninitializedAddressSpace =
144 std::numeric_limits<unsigned>::max();
145
146namespace {
147
148using ValueToAddrSpaceMapTy = DenseMap<const Value *, unsigned>;
149// Different from ValueToAddrSpaceMapTy, where a new addrspace is inferred on
150// the *def* of a value, PredicatedAddrSpaceMapTy is map where a new
151// addrspace is inferred on the *use* of a pointer. This map is introduced to
152// infer addrspace from the addrspace predicate assumption built from assume
153// intrinsic. In that scenario, only specific uses (under valid assumption
154// context) could be inferred with a new addrspace.
155using PredicatedAddrSpaceMapTy =
157using PostorderStackTy = llvm::SmallVector<PointerIntPair<Value *, 1, bool>, 4>;
158
159class InferAddressSpaces : public FunctionPass {
160 unsigned FlatAddrSpace = 0;
161
162public:
163 static char ID;
164
165 InferAddressSpaces()
166 : FunctionPass(ID), FlatAddrSpace(UninitializedAddressSpace) {
168 }
169 InferAddressSpaces(unsigned AS) : FunctionPass(ID), FlatAddrSpace(AS) {
171 }
172
173 void getAnalysisUsage(AnalysisUsage &AU) const override {
174 AU.setPreservesCFG();
175 AU.addRequired<AssumptionCacheTracker>();
176 AU.addRequired<TargetTransformInfoWrapperPass>();
177 }
178
179 bool runOnFunction(Function &F) override;
180};
181
182class InferAddressSpacesImpl {
183 AssumptionCache &AC;
184 Function *F = nullptr;
185 const DominatorTree *DT = nullptr;
186 const TargetTransformInfo *TTI = nullptr;
187 const DataLayout *DL = nullptr;
188
189 /// Target specific address space which uses of should be replaced if
190 /// possible.
191 unsigned FlatAddrSpace = 0;
192
193 /// The default address space is assumed as the flat address space. This is
194 /// mainly for test purpose.
195 const bool AssumeDefaultIsFlatAddressSpace = false;
196
197 DenseMap<const Value *, Value *> PtrIntCastPairs;
198
199 // Tries to find if the inttoptr instruction is derived from an pointer have
200 // specific address space, and is safe to propagate the address space to the
201 // new pointer that inttoptr produces.
202 Value *getIntToPtrPointerOperand(const Operator *I2P) const;
203 // Tries to find if the inttoptr instruction is derived from an pointer have
204 // specific address space, and is safe to propagate the address space to the
205 // new pointer that inttoptr produces. If the old pointer is found, cache the
206 // <OldPtr, inttoptr> pairs to a map.
207 void collectIntToPtrPointerOperand();
208 // Check if an old pointer is found ahead of time. The safety has been checked
209 // when collecting the inttoptr original pointer and the result is cached in
210 // PtrIntCastPairs.
211 bool isSafeToCastIntToPtrAddrSpace(const Operator *I2P) const {
212 return PtrIntCastPairs.contains(I2P);
213 }
214 bool isAddressExpression(const Value &V, const DataLayout &DL,
215 const TargetTransformInfo *TTI) const;
216 Value *cloneConstantExprWithNewAddressSpace(
217 ConstantExpr *CE, unsigned NewAddrSpace,
218 const ValueToValueMapTy &ValueWithNewAddrSpace, const DataLayout *DL,
219 const TargetTransformInfo *TTI) const;
220
221 SmallVector<Value *, 2>
222 getPointerOperands(const Value &V, const DataLayout &DL,
223 const TargetTransformInfo *TTI) const;
224
225 // Try to update the address space of V. If V is updated, returns true and
226 // false otherwise.
227 bool updateAddressSpace(const Value &V,
228 ValueToAddrSpaceMapTy &InferredAddrSpace,
229 PredicatedAddrSpaceMapTy &PredicatedAS) const;
230
231 // Adds the users of V whose address space may still change to Worklist.
232 void enqueueUsers(Value &V, const ValueToAddrSpaceMapTy &InferredAddrSpace,
233 SetVector<Value *> &Worklist) const;
234
235 // Propagates address spaces out of Worklist until nothing changes.
236 void runToFixPoint(SetVector<Value *> &Worklist,
237 ValueToAddrSpaceMapTy &InferredAddrSpace,
238 PredicatedAddrSpaceMapTy &PredicatedAS) const;
239
240 // Tries to infer the specific address space of each address expression in
241 // Postorder.
242 void inferAddressSpaces(ArrayRef<WeakTrackingVH> Postorder,
243 ValueToAddrSpaceMapTy &InferredAddrSpace,
244 PredicatedAddrSpaceMapTy &PredicatedAS) const;
245
246 bool isSafeToCastConstAddrSpace(Constant *C, unsigned NewAS) const;
247
248 Value *clonePtrMaskWithNewAddressSpace(
249 IntrinsicInst *I, unsigned NewAddrSpace,
250 const ValueToValueMapTy &ValueWithNewAddrSpace,
251 const PredicatedAddrSpaceMapTy &PredicatedAS,
252 SmallVectorImpl<const Use *> *PoisonUsesToFix) const;
253
254 Value *cloneInstructionWithNewAddressSpace(
255 Instruction *I, unsigned NewAddrSpace,
256 const ValueToValueMapTy &ValueWithNewAddrSpace,
257 const PredicatedAddrSpaceMapTy &PredicatedAS,
258 SmallVectorImpl<const Use *> *PoisonUsesToFix) const;
259
260 void performPointerReplacement(
261 Value *V, Value *NewV, Use &U, ValueToValueMapTy &ValueWithNewAddrSpace,
262 SmallVectorImpl<Instruction *> &DeadInstructions) const;
263
264 // Changes the flat address expressions in function F to point to specific
265 // address spaces if InferredAddrSpace says so. Postorder is the postorder of
266 // all flat expressions in the use-def graph of function F.
267 bool rewriteWithNewAddressSpaces(
268 ArrayRef<WeakTrackingVH> Postorder,
269 const ValueToAddrSpaceMapTy &InferredAddrSpace,
270 const PredicatedAddrSpaceMapTy &PredicatedAS) const;
271
272 void appendsFlatAddressExpressionToPostorderStack(
273 Value *V, PostorderStackTy &PostorderStack,
274 DenseSet<Value *> &Visited) const;
275
276 bool rewriteIntrinsicOperands(IntrinsicInst *II, Value *OldV,
277 Value *NewV) const;
278 void collectRewritableIntrinsicOperands(IntrinsicInst *II,
279 PostorderStackTy &PostorderStack,
280 DenseSet<Value *> &Visited) const;
281
282 std::vector<WeakTrackingVH> collectFlatAddressExpressions(Function &F) const;
283
284 Value *cloneValueWithNewAddressSpace(
285 Value *V, unsigned NewAddrSpace,
286 const ValueToValueMapTy &ValueWithNewAddrSpace,
287 const PredicatedAddrSpaceMapTy &PredicatedAS,
288 SmallVectorImpl<const Use *> *PoisonUsesToFix) const;
289 unsigned joinAddressSpaces(unsigned AS1, unsigned AS2) const;
290
291 unsigned getPredicatedAddrSpace(const Value &PtrV,
292 const Value *UserCtx) const;
293
294public:
295 InferAddressSpacesImpl(AssumptionCache &AC, const DominatorTree *DT,
296 const TargetTransformInfo *TTI, unsigned FlatAddrSpace,
297 bool AssumeDefaultIsFlatAddressSpace)
298 : AC(AC), DT(DT), TTI(TTI), FlatAddrSpace(FlatAddrSpace),
299 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
300 bool run(Function &F);
301};
302
303} // end anonymous namespace
304
305char InferAddressSpaces::ID = 0;
306
307INITIALIZE_PASS_BEGIN(InferAddressSpaces, DEBUG_TYPE, "Infer address spaces",
308 false, false)
311INITIALIZE_PASS_END(InferAddressSpaces, DEBUG_TYPE, "Infer address spaces",
313
314static Type *getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace) {
315 assert(Ty->isPtrOrPtrVectorTy());
316 PointerType *NPT = PointerType::get(Ty->getContext(), NewAddrSpace);
317 return Ty->getWithNewType(NPT);
318}
319
320// Check whether that's no-op pointer bitcast using a pair of
321// `ptrtoint`/`inttoptr` due to the missing no-op pointer bitcast over
322// different address spaces.
323static bool isNoopPtrIntCastPair(const Operator *I2P, const DataLayout &DL,
324 const TargetTransformInfo *TTI) {
325 assert(I2P->getOpcode() == Instruction::IntToPtr);
326 auto *P2I = dyn_cast<Operator>(I2P->getOperand(0));
327 if (!P2I || P2I->getOpcode() != Instruction::PtrToInt)
328 return false;
329 // Check it's really safe to treat that pair of `ptrtoint`/`inttoptr` as a
330 // no-op cast. Besides checking both of them are no-op casts, as the
331 // reinterpreted pointer may be used in other pointer arithmetic, we also
332 // need to double-check that through the target-specific hook. That ensures
333 // the underlying target also agrees that's a no-op address space cast and
334 // pointer bits are preserved.
335 // The current IR spec doesn't have clear rules on address space casts,
336 // especially a clear definition for pointer bits in non-default address
337 // spaces. It would be undefined if that pointer is dereferenced after an
338 // invalid reinterpret cast. Also, due to the unclearness for the meaning of
339 // bits in non-default address spaces in the current spec, the pointer
340 // arithmetic may also be undefined after invalid pointer reinterpret cast.
341 // However, as we confirm through the target hooks that it's a no-op
342 // addrspacecast, it doesn't matter since the bits should be the same.
343 unsigned P2IOp0AS = P2I->getOperand(0)->getType()->getPointerAddressSpace();
344 unsigned I2PAS = I2P->getType()->getPointerAddressSpace();
346 I2P->getOperand(0)->getType(), I2P->getType(),
347 DL) &&
349 P2I->getOperand(0)->getType(), P2I->getType(),
350 DL) &&
351 (P2IOp0AS == I2PAS || TTI->isNoopAddrSpaceCast(P2IOp0AS, I2PAS));
352}
353
354// Returns true if V is an address expression.
355// TODO: Currently, we only consider:
356// - arguments
357// - phi, bitcast, addrspacecast, and getelementptr operators
358bool InferAddressSpacesImpl::isAddressExpression(
359 const Value &V, const DataLayout &DL,
360 const TargetTransformInfo *TTI) const {
361
362 if (const Argument *Arg = dyn_cast<Argument>(&V))
363 return Arg->getType()->isPointerTy() &&
365
366 const Operator *Op = dyn_cast<Operator>(&V);
367 if (!Op)
368 return false;
369
370 switch (Op->getOpcode()) {
371 case Instruction::PHI:
372 assert(Op->getType()->isPtrOrPtrVectorTy());
373 return true;
374 case Instruction::BitCast:
375 case Instruction::AddrSpaceCast:
376 case Instruction::GetElementPtr:
377 return true;
378 case Instruction::Select:
379 return Op->getType()->isPtrOrPtrVectorTy();
380 case Instruction::Call: {
381 const IntrinsicInst *II = dyn_cast<IntrinsicInst>(&V);
382 return II && II->getIntrinsicID() == Intrinsic::ptrmask;
383 }
384 case Instruction::IntToPtr:
385 return isNoopPtrIntCastPair(Op, DL, TTI) ||
386 isSafeToCastIntToPtrAddrSpace(Op);
387 default:
388 // That value is an address expression if it has an assumed address space.
390 }
391}
392
393// Returns the pointer operands of V.
394//
395// Precondition: V is an address expression.
396SmallVector<Value *, 2> InferAddressSpacesImpl::getPointerOperands(
397 const Value &V, const DataLayout &DL,
398 const TargetTransformInfo *TTI) const {
399 if (isa<Argument>(&V))
400 return {};
401
402 const Operator &Op = cast<Operator>(V);
403 switch (Op.getOpcode()) {
404 case Instruction::PHI: {
405 auto IncomingValues = cast<PHINode>(Op).incoming_values();
406 return {IncomingValues.begin(), IncomingValues.end()};
407 }
408 case Instruction::BitCast:
409 case Instruction::AddrSpaceCast:
410 case Instruction::GetElementPtr:
411 return {Op.getOperand(0)};
412 case Instruction::Select:
413 return {Op.getOperand(1), Op.getOperand(2)};
414 case Instruction::Call: {
415 const IntrinsicInst &II = cast<IntrinsicInst>(Op);
416 assert(II.getIntrinsicID() == Intrinsic::ptrmask &&
417 "unexpected intrinsic call");
418 return {II.getArgOperand(0)};
419 }
420 case Instruction::IntToPtr: {
421 if (isNoopPtrIntCastPair(&Op, DL, TTI)) {
422 auto *P2I = cast<Operator>(Op.getOperand(0));
423 return {P2I->getOperand(0)};
424 }
425 assert(isSafeToCastIntToPtrAddrSpace(&Op));
426 return {getIntToPtrPointerOperand(&Op)};
427 }
428 default:
429 llvm_unreachable("Unexpected instruction type.");
430 }
431}
432
433// Return mask. The 1 in mask indicate the bit is changed.
434// This helper function is to compute the max know changed bits for ptr1 and
435// ptr2 after the operation `ptr2 = ptr1 Op Mask`.
436static APInt computeMaxChangedPtrBits(const Operator *Op, const Value *Mask,
437 const DataLayout &DL, AssumptionCache *AC,
438 const DominatorTree *DT) {
439 KnownBits Known = computeKnownBits(Mask, DL, AC, nullptr, DT);
440 switch (Op->getOpcode()) {
441 case Instruction::Xor:
442 case Instruction::Or:
443 return ~Known.Zero;
444 case Instruction::And:
445 return ~Known.One;
446 default:
447 return APInt::getAllOnes(Known.getBitWidth());
448 }
449}
450
451Value *
452InferAddressSpacesImpl::getIntToPtrPointerOperand(const Operator *I2P) const {
453 assert(I2P->getOpcode() == Instruction::IntToPtr);
454 if (I2P->getType()->isVectorTy())
455 return nullptr;
456
457 // If I2P has been accessed and has the corresponding old pointer value, just
458 // return true.
459 if (auto *OldPtr = PtrIntCastPairs.lookup(I2P))
460 return OldPtr;
461
462 Value *LogicalOp = I2P->getOperand(0);
463 Value *OldPtr, *Mask;
464 if (!match(LogicalOp,
465 m_c_BitwiseLogic(m_PtrToInt(m_Value(OldPtr)), m_Value(Mask))))
466 return nullptr;
467
469 if (!AsCast)
470 return nullptr;
471
472 unsigned SrcAS = I2P->getType()->getPointerAddressSpace();
473 unsigned DstAS = AsCast->getOperand(0)->getType()->getPointerAddressSpace();
474 APInt PreservedPtrMask = TTI->getAddrSpaceCastPreservedPtrMask(SrcAS, DstAS);
475 if (PreservedPtrMask.isZero())
476 return nullptr;
477 APInt ChangedPtrBits =
478 computeMaxChangedPtrBits(cast<Operator>(LogicalOp), Mask, *DL, &AC, DT);
479 // Check if the address bits change is within the preserved mask. If the bits
480 // change is not preserved, it is not safe to perform address space cast.
481 // The following pattern is not safe to cast address space.
482 // %1 = ptrtoint ptr addrspace(3) %sp to i32
483 // %2 = zext i32 %1 to i64
484 // %gp = inttoptr i64 %2 to ptr
485 assert(ChangedPtrBits.getBitWidth() == PreservedPtrMask.getBitWidth());
486 if (ChangedPtrBits.isSubsetOf(PreservedPtrMask))
487 return OldPtr;
488
489 return nullptr;
490}
491
492void InferAddressSpacesImpl::collectIntToPtrPointerOperand() {
493 // Only collect inttoptr instruction.
494 // TODO: We need to collect inttoptr constant expression as well.
495 for (Instruction &I : instructions(F)) {
497 continue;
498 if (auto *OldPtr = getIntToPtrPointerOperand(cast<Operator>(&I)))
499 PtrIntCastPairs.insert({&I, OldPtr});
500 }
501}
502
503bool InferAddressSpacesImpl::rewriteIntrinsicOperands(IntrinsicInst *II,
504 Value *OldV,
505 Value *NewV) const {
506 Module *M = II->getParent()->getParent()->getParent();
507 Intrinsic::ID IID = II->getIntrinsicID();
508 switch (IID) {
509 case Intrinsic::objectsize:
510 case Intrinsic::masked_load: {
511 Type *DestTy = II->getType();
512 Type *SrcTy = NewV->getType();
513 Function *NewDecl =
514 Intrinsic::getOrInsertDeclaration(M, IID, {DestTy, SrcTy});
515 II->setArgOperand(0, NewV);
516 II->setCalledFunction(NewDecl);
517 return true;
518 }
519 case Intrinsic::ptrmask:
520 // This is handled as an address expression, not as a use memory operation.
521 return false;
522 case Intrinsic::masked_gather: {
523 Type *RetTy = II->getType();
524 Type *NewPtrTy = NewV->getType();
525 Function *NewDecl =
526 Intrinsic::getOrInsertDeclaration(M, IID, {RetTy, NewPtrTy});
527 II->setArgOperand(0, NewV);
528 II->setCalledFunction(NewDecl);
529 return true;
530 }
531 case Intrinsic::masked_store:
532 case Intrinsic::masked_scatter: {
533 Type *ValueTy = II->getOperand(0)->getType();
534 Type *NewPtrTy = NewV->getType();
536 M, II->getIntrinsicID(), {ValueTy, NewPtrTy});
537 II->setArgOperand(1, NewV);
538 II->setCalledFunction(NewDecl);
539 return true;
540 }
541 case Intrinsic::prefetch:
542 case Intrinsic::is_constant: {
544 M, II->getIntrinsicID(), {NewV->getType()});
545 II->setArgOperand(0, NewV);
546 II->setCalledFunction(NewDecl);
547 return true;
548 }
549 case Intrinsic::fake_use: {
550 II->replaceUsesOfWith(OldV, NewV);
551 return true;
552 }
553 case Intrinsic::lifetime_start:
554 case Intrinsic::lifetime_end: {
555 // Always force lifetime markers to work directly on the alloca.
556 NewV = NewV->stripPointerCasts();
558 M, II->getIntrinsicID(), {NewV->getType()});
559 II->setArgOperand(0, NewV);
560 II->setCalledFunction(NewDecl);
561 return true;
562 }
563 default: {
564 Value *Rewrite = TTI->rewriteIntrinsicWithAddressSpace(II, OldV, NewV);
565 if (!Rewrite)
566 return false;
567 if (Rewrite != II) {
568 II->replaceAllUsesWith(Rewrite);
569 II->eraseFromParent();
570 }
571 return true;
572 }
573 }
574}
575
576void InferAddressSpacesImpl::collectRewritableIntrinsicOperands(
577 IntrinsicInst *II, PostorderStackTy &PostorderStack,
578 DenseSet<Value *> &Visited) const {
579 auto IID = II->getIntrinsicID();
580 switch (IID) {
581 case Intrinsic::ptrmask:
582 case Intrinsic::objectsize:
583 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(0),
584 PostorderStack, Visited);
585 break;
586 case Intrinsic::is_constant: {
587 Value *Ptr = II->getArgOperand(0);
588 if (Ptr->getType()->isPtrOrPtrVectorTy()) {
589 appendsFlatAddressExpressionToPostorderStack(Ptr, PostorderStack,
590 Visited);
591 }
592
593 break;
594 }
595 case Intrinsic::masked_load:
596 case Intrinsic::masked_gather:
597 case Intrinsic::prefetch:
598 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(0),
599 PostorderStack, Visited);
600 break;
601 case Intrinsic::masked_store:
602 case Intrinsic::masked_scatter:
603 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(1),
604 PostorderStack, Visited);
605 break;
606 case Intrinsic::fake_use: {
607 for (Value *Op : II->operands()) {
608 if (Op->getType()->isPtrOrPtrVectorTy()) {
609 appendsFlatAddressExpressionToPostorderStack(Op, PostorderStack,
610 Visited);
611 }
612 }
613
614 break;
615 }
616 case Intrinsic::lifetime_start:
617 case Intrinsic::lifetime_end: {
618 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(0),
619 PostorderStack, Visited);
620 break;
621 }
622 default:
623 SmallVector<int, 2> OpIndexes;
624 if (TTI->collectFlatAddressOperands(OpIndexes, IID)) {
625 for (int Idx : OpIndexes) {
626 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(Idx),
627 PostorderStack, Visited);
628 }
629 }
630 break;
631 }
632}
633
634// Returns all flat address expressions in function F. The elements are
635// If V is an unvisited flat address expression, appends V to PostorderStack
636// and marks it as visited.
637void InferAddressSpacesImpl::appendsFlatAddressExpressionToPostorderStack(
638 Value *V, PostorderStackTy &PostorderStack,
639 DenseSet<Value *> &Visited) const {
640 assert(V->getType()->isPtrOrPtrVectorTy());
641
642 // Generic addressing expressions may be hidden in nested constant
643 // expressions.
644 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
645 // TODO: Look in non-address parts, like icmp operands.
646 if (isAddressExpression(*CE, *DL, TTI) && Visited.insert(CE).second)
647 PostorderStack.emplace_back(CE, false);
648
649 return;
650 }
651
652 if (V->getType()->getPointerAddressSpace() == FlatAddrSpace &&
653 isAddressExpression(*V, *DL, TTI)) {
654 if (Visited.insert(V).second) {
655 PostorderStack.emplace_back(V, false);
656
657 if (auto *Op = dyn_cast<Operator>(V))
658 for (auto &O : Op->operands())
659 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(O))
660 if (isAddressExpression(*CE, *DL, TTI) && Visited.insert(CE).second)
661 PostorderStack.emplace_back(CE, false);
662 }
663 }
664}
665
666// Returns all flat address expressions in function F. The elements are ordered
667// in postorder.
668std::vector<WeakTrackingVH>
669InferAddressSpacesImpl::collectFlatAddressExpressions(Function &F) const {
670 // This function implements a non-recursive postorder traversal of a partial
671 // use-def graph of function F.
672 PostorderStackTy PostorderStack;
673 // The set of visited expressions.
674 DenseSet<Value *> Visited;
675
676 auto PushPtrOperand = [&](Value *Ptr) {
677 appendsFlatAddressExpressionToPostorderStack(Ptr, PostorderStack, Visited);
678 };
679
680 // Look at operations that may be interesting accelerate by moving to a known
681 // address space. We aim at generating after loads and stores, but pure
682 // addressing calculations may also be faster.
683 for (Instruction &I : instructions(F)) {
684 if (auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
685 PushPtrOperand(GEP->getPointerOperand());
686 } else if (auto *LI = dyn_cast<LoadInst>(&I))
687 PushPtrOperand(LI->getPointerOperand());
688 else if (auto *SI = dyn_cast<StoreInst>(&I))
689 PushPtrOperand(SI->getPointerOperand());
690 else if (auto *RMW = dyn_cast<AtomicRMWInst>(&I))
691 PushPtrOperand(RMW->getPointerOperand());
692 else if (auto *CmpX = dyn_cast<AtomicCmpXchgInst>(&I))
693 PushPtrOperand(CmpX->getPointerOperand());
694 else if (auto *MI = dyn_cast<MemIntrinsic>(&I)) {
695 // For memset/memcpy/memmove, any pointer operand can be replaced.
696 PushPtrOperand(MI->getRawDest());
697
698 // Handle 2nd operand for memcpy/memmove.
699 if (auto *MTI = dyn_cast<MemTransferInst>(MI))
700 PushPtrOperand(MTI->getRawSource());
701 } else if (auto *II = dyn_cast<IntrinsicInst>(&I))
702 collectRewritableIntrinsicOperands(II, PostorderStack, Visited);
703 else if (ICmpInst *Cmp = dyn_cast<ICmpInst>(&I)) {
704 if (Cmp->getOperand(0)->getType()->isPtrOrPtrVectorTy()) {
705 PushPtrOperand(Cmp->getOperand(0));
706 PushPtrOperand(Cmp->getOperand(1));
707 }
708 } else if (auto *ASC = dyn_cast<AddrSpaceCastInst>(&I)) {
709 PushPtrOperand(ASC->getPointerOperand());
710 } else if (auto *I2P = dyn_cast<IntToPtrInst>(&I)) {
712 PushPtrOperand(cast<Operator>(I2P->getOperand(0))->getOperand(0));
713 else if (isSafeToCastIntToPtrAddrSpace(cast<Operator>(I2P)))
714 PushPtrOperand(getIntToPtrPointerOperand(cast<Operator>(I2P)));
715 } else if (auto *RI = dyn_cast<ReturnInst>(&I)) {
716 if (auto *RV = RI->getReturnValue();
717 RV && RV->getType()->isPtrOrPtrVectorTy())
718 PushPtrOperand(RV);
719 }
720 }
721
722 std::vector<WeakTrackingVH> Postorder; // The resultant postorder.
723 while (!PostorderStack.empty()) {
724 Value *TopVal = PostorderStack.back().getPointer();
725 // If the operands of the expression on the top are already explored,
726 // adds that expression to the resultant postorder.
727 if (PostorderStack.back().getInt()) {
728 if (TopVal->getType()->getPointerAddressSpace() == FlatAddrSpace)
729 Postorder.push_back(TopVal);
730 PostorderStack.pop_back();
731 continue;
732 }
733 // Otherwise, adds its operands to the stack and explores them.
734 PostorderStack.back().setInt(true);
735 // Skip values with an assumed address space.
737 for (Value *PtrOperand : getPointerOperands(*TopVal, *DL, TTI)) {
738 appendsFlatAddressExpressionToPostorderStack(PtrOperand, PostorderStack,
739 Visited);
740 }
741 }
742 }
743 return Postorder;
744}
745
746// Inserts an addrspacecast for a phi node operand, handling the proper
747// insertion position based on the operand type.
749 Value *Operand) {
750 auto InsertBefore = [NewI](auto It) {
751 NewI->insertBefore(It);
752 NewI->setDebugLoc(It->getDebugLoc());
753 return NewI;
754 };
755
756 if (auto *Arg = dyn_cast<Argument>(Operand)) {
757 // For arguments, insert the cast at the beginning of entry block.
758 // Consider inserting at the dominating block for better placement.
759 Function *F = Arg->getParent();
760 auto InsertI = F->getEntryBlock().getFirstNonPHIIt();
761 return InsertBefore(InsertI);
762 }
763
764 // No check for Constant here, as constants are already handled.
765 assert(isa<Instruction>(Operand));
766
767 Instruction *OpInst = cast<Instruction>(Operand);
768 if (LLVM_UNLIKELY(OpInst->getOpcode() == Instruction::PHI)) {
769 // If the operand is defined by another PHI node, insert after the first
770 // non-PHI instruction at the corresponding basic block.
771 auto InsertI = OpInst->getParent()->getFirstNonPHIIt();
772 return InsertBefore(InsertI);
773 }
774
775 // Otherwise, insert immediately after the operand definition.
776 NewI->insertAfter(OpInst->getIterator());
777 NewI->setDebugLoc(OpInst->getDebugLoc());
778 return NewI;
779}
780
781// A helper function for cloneInstructionWithNewAddressSpace. Returns the clone
782// of OperandUse.get() in the new address space. If the clone is not ready yet,
783// returns poison in the new address space as a placeholder.
785 const Use &OperandUse, unsigned NewAddrSpace,
786 const ValueToValueMapTy &ValueWithNewAddrSpace,
787 const PredicatedAddrSpaceMapTy &PredicatedAS,
788 SmallVectorImpl<const Use *> *PoisonUsesToFix) {
789 Value *Operand = OperandUse.get();
790
791 Type *NewPtrTy = getPtrOrVecOfPtrsWithNewAS(Operand->getType(), NewAddrSpace);
792
793 if (Constant *C = dyn_cast<Constant>(Operand))
794 return ConstantExpr::getAddrSpaceCast(C, NewPtrTy);
795
796 Instruction *Inst = cast<Instruction>(OperandUse.getUser());
797 if (Value *NewOperand = ValueWithNewAddrSpace.lookup(Operand)) {
798 Operand = NewOperand;
799 } else if (!PredicatedAS.contains(std::make_pair(Inst, Operand))) {
800 assert(PoisonUsesToFix && "missing inferred operand replacement");
801 PoisonUsesToFix->push_back(&OperandUse);
802 return PoisonValue::get(NewPtrTy);
803 }
804
805 if (Operand->getType() == NewPtrTy)
806 return Operand;
807
808 auto *NewI = new AddrSpaceCastInst(Operand, NewPtrTy);
809 if (LLVM_UNLIKELY(Inst->getOpcode() == Instruction::PHI))
810 return phiNodeOperandWithNewAddressSpace(NewI, OperandUse.get());
811
812 // During cloning phase, the cast is placed before the original flat
813 // instruction, as its clone in the new address space has not been inserted
814 // yet. During poison fixup phase, the clone already exists, thus make sure
815 // the cast is inserted before it.
816 Instruction *InsertPt = Inst;
817 if (Value *NewUser = ValueWithNewAddrSpace.lookup(Inst))
818 InsertPt = cast<Instruction>(NewUser);
819 NewI->insertBefore(InsertPt->getIterator());
820 NewI->setDebugLoc(Inst->getDebugLoc());
821 return NewI;
822}
823
824// A helper function for cloneInstructionWithNewAddressSpace. Handles the
825// conversion of a ptrmask intrinsic instruction.
826Value *InferAddressSpacesImpl::clonePtrMaskWithNewAddressSpace(
827 IntrinsicInst *I, unsigned NewAddrSpace,
828 const ValueToValueMapTy &ValueWithNewAddrSpace,
829 const PredicatedAddrSpaceMapTy &PredicatedAS,
830 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
831 const Use &PtrOpUse = I->getArgOperandUse(0);
832 unsigned OldAddrSpace = PtrOpUse->getType()->getPointerAddressSpace();
833 Value *MaskOp = I->getArgOperand(1);
834 Type *MaskTy = MaskOp->getType();
835
836 KnownBits OldPtrBits{DL->getPointerSizeInBits(OldAddrSpace)};
837 KnownBits NewPtrBits{DL->getPointerSizeInBits(NewAddrSpace)};
838 if (!TTI->isNoopAddrSpaceCast(OldAddrSpace, NewAddrSpace)) {
839 std::tie(OldPtrBits, NewPtrBits) =
840 TTI->computeKnownBitsAddrSpaceCast(NewAddrSpace, *PtrOpUse.get());
841 }
842
843 // If the pointers in both addrspaces have a bitwise representation and if the
844 // representation of the new pointer is smaller (fewer bits) than the old one,
845 // check if the mask is applicable to the ptr in the new addrspace. Any
846 // masking only clearing the low bits will also apply in the new addrspace
847 // Note: checking if the mask clears high bits is not sufficient as those
848 // might have already been 0 in the old ptr.
849 if (OldPtrBits.getBitWidth() > NewPtrBits.getBitWidth()) {
850 KnownBits MaskBits =
851 computeKnownBits(MaskOp, *DL, /*AssumptionCache=*/nullptr, I);
852 // Set all unknown bits of the old ptr to 1, so that we are conservative in
853 // checking which bits are cleared by the mask.
854 OldPtrBits.One |= ~OldPtrBits.Zero;
855 // Check which bits are cleared by the mask in the old ptr.
856 KnownBits ClearedBits = KnownBits::sub(OldPtrBits, OldPtrBits & MaskBits);
857
858 // If the mask isn't applicable to the new ptr, leave the ptrmask as-is and
859 // insert an addrspacecast after it.
860 if (ClearedBits.countMaxActiveBits() > NewPtrBits.countMaxActiveBits()) {
861 std::optional<BasicBlock::iterator> InsertPoint =
862 I->getInsertionPointAfterDef();
863 assert(InsertPoint && "insertion after ptrmask should be possible");
864 Type *NewPtrType = getPtrOrVecOfPtrsWithNewAS(I->getType(), NewAddrSpace);
865 Instruction *AddrSpaceCast =
866 new AddrSpaceCastInst(I, NewPtrType, "", *InsertPoint);
867 AddrSpaceCast->setDebugLoc(I->getDebugLoc());
868 return AddrSpaceCast;
869 }
870 }
871
872 IRBuilder<> B(I);
873 if (NewPtrBits.getBitWidth() < MaskTy->getScalarSizeInBits()) {
874 MaskTy = MaskTy->getWithNewBitWidth(NewPtrBits.getBitWidth());
875 MaskOp = B.CreateTrunc(MaskOp, MaskTy);
876 }
878 PtrOpUse, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS,
879 PoisonUsesToFix);
880 return B.CreateIntrinsic(Intrinsic::ptrmask, {NewPtr->getType(), MaskTy},
881 {NewPtr, MaskOp});
882}
883
884// Returns a clone of `I` with its operands converted to those specified in
885// ValueWithNewAddrSpace. Due to potential cycles in the data flow graph, an
886// operand whose address space needs to be modified might not exist in
887// ValueWithNewAddrSpace. In that case, uses poison as a placeholder operand and
888// adds that operand use to PoisonUsesToFix so that caller can fix them later.
889//
890// Note that we do not necessarily clone `I`, e.g., if it is an addrspacecast
891// from a pointer whose type already matches. Therefore, this function returns a
892// Value* instead of an Instruction*.
893Value *InferAddressSpacesImpl::cloneInstructionWithNewAddressSpace(
894 Instruction *I, unsigned NewAddrSpace,
895 const ValueToValueMapTy &ValueWithNewAddrSpace,
896 const PredicatedAddrSpaceMapTy &PredicatedAS,
897 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
898 Type *NewPtrType = getPtrOrVecOfPtrsWithNewAS(I->getType(), NewAddrSpace);
899
900 if (I->getOpcode() == Instruction::AddrSpaceCast) {
901 Value *Src = I->getOperand(0);
902 // Because `I` is flat, the source address space must be specific.
903 // Therefore, the inferred address space must be the source space, according
904 // to our algorithm.
905 assert(Src->getType()->getPointerAddressSpace() == NewAddrSpace);
906 return Src;
907 }
908
909 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
910 // Technically the intrinsic ID is a pointer typed argument, so specially
911 // handle calls early.
912 assert(II->getIntrinsicID() == Intrinsic::ptrmask);
913 return clonePtrMaskWithNewAddressSpace(
914 II, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS, PoisonUsesToFix);
915 }
916
917 unsigned AS = TTI->getAssumedAddrSpace(I);
918 if (AS != UninitializedAddressSpace) {
919 // For the assumed address space, insert an `addrspacecast` to make that
920 // explicit.
921 Type *NewPtrTy = getPtrOrVecOfPtrsWithNewAS(I->getType(), AS);
922 auto *NewI = new AddrSpaceCastInst(I, NewPtrTy);
923 NewI->insertAfter(I->getIterator());
924 NewI->setDebugLoc(I->getDebugLoc());
925 return NewI;
926 }
927
928 // Computes the converted pointer operands.
929 SmallVector<Value *, 4> NewPointerOperands;
930 for (const Use &OperandUse : I->operands()) {
931 if (!OperandUse.get()->getType()->isPtrOrPtrVectorTy())
932 NewPointerOperands.push_back(nullptr);
933 else
935 OperandUse, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS,
936 PoisonUsesToFix));
937 }
938
939 switch (I->getOpcode()) {
940 case Instruction::BitCast:
941 return new BitCastInst(NewPointerOperands[0], NewPtrType);
942 case Instruction::PHI: {
943 assert(I->getType()->isPtrOrPtrVectorTy());
944 PHINode *PHI = cast<PHINode>(I);
945 PHINode *NewPHI = PHINode::Create(NewPtrType, PHI->getNumIncomingValues());
946 for (unsigned Index = 0; Index < PHI->getNumIncomingValues(); ++Index) {
947 unsigned OperandNo = PHINode::getOperandNumForIncomingValue(Index);
948 NewPHI->addIncoming(NewPointerOperands[OperandNo],
949 PHI->getIncomingBlock(Index));
950 }
951 return NewPHI;
952 }
953 case Instruction::GetElementPtr: {
954 GetElementPtrInst *GEP = cast<GetElementPtrInst>(I);
955 GetElementPtrInst *NewGEP = GetElementPtrInst::Create(
956 GEP->getSourceElementType(), NewPointerOperands[0],
957 SmallVector<Value *, 4>(GEP->indices()));
958 NewGEP->setIsInBounds(GEP->isInBounds());
959 return NewGEP;
960 }
961 case Instruction::Select:
962 assert(I->getType()->isPtrOrPtrVectorTy());
963 return SelectInst::Create(I->getOperand(0), NewPointerOperands[1],
964 NewPointerOperands[2], "", nullptr, I);
965 case Instruction::IntToPtr: {
967 Value *Src = cast<Operator>(I->getOperand(0))->getOperand(0);
968 if (Src->getType() == NewPtrType)
969 return Src;
970
971 // If we had a no-op inttoptr/ptrtoint pair, we may still have inferred a
972 // source address space from a generic pointer source need to insert a
973 // cast back.
974 return new AddrSpaceCastInst(Src, NewPtrType);
975 }
976 assert(isSafeToCastIntToPtrAddrSpace(cast<Operator>(I)));
977 AddrSpaceCastInst *AsCast = new AddrSpaceCastInst(I, NewPtrType);
978 AsCast->insertAfter(I);
979 return AsCast;
980 }
981 default:
982 llvm_unreachable("Unexpected opcode");
983 }
984}
985
986// Similar to cloneInstructionWithNewAddressSpace, returns a clone of the
987// constant expression `CE` with its operands replaced as specified in
988// ValueWithNewAddrSpace.
989Value *InferAddressSpacesImpl::cloneConstantExprWithNewAddressSpace(
990 ConstantExpr *CE, unsigned NewAddrSpace,
991 const ValueToValueMapTy &ValueWithNewAddrSpace, const DataLayout *DL,
992 const TargetTransformInfo *TTI) const {
994 CE->getType()->isPtrOrPtrVectorTy()
995 ? getPtrOrVecOfPtrsWithNewAS(CE->getType(), NewAddrSpace)
996 : CE->getType();
997
998 switch (CE->getOpcode()) {
999 case Instruction::AddrSpaceCast:
1000 // Because CE is flat, the source address space must be specific.
1001 // Therefore, the inferred address space must be the source space according
1002 // to our algorithm.
1003 assert(CE->getOperand(0)->getType()->getPointerAddressSpace() ==
1004 NewAddrSpace);
1005 return CE->getOperand(0);
1006
1007 case Instruction::BitCast:
1008 if (Value *NewOperand = ValueWithNewAddrSpace.lookup(CE->getOperand(0)))
1009 return ConstantExpr::getBitCast(cast<Constant>(NewOperand), TargetType);
1010 return ConstantExpr::getAddrSpaceCast(CE, TargetType);
1011
1012 case Instruction::IntToPtr:
1013 if (isNoopPtrIntCastPair(cast<Operator>(CE), *DL, TTI)) {
1014 Constant *Src = cast<ConstantExpr>(CE->getOperand(0))->getOperand(0);
1015 // If we had a no-op inttoptr/ptrtoint pair, we may still have inferred a
1016 // source address space from a generic pointer source, so insert a cast
1017 // back. See cloneInstructionWithNewAddressSpace.
1018 if (Src->getType() == TargetType)
1019 return Src;
1020 return ConstantExpr::getAddrSpaceCast(Src, TargetType);
1021 }
1022 assert(isSafeToCastIntToPtrAddrSpace(cast<Operator>(CE)));
1023 return ConstantExpr::getAddrSpaceCast(CE, TargetType);
1024
1025 case Instruction::GetElementPtr: {
1026 // Only the pointer operand is rewritten: the indices are not related to
1027 // the pointer and NewAddrSpace may not be valid for them. The pointer
1028 // operand is an address expression, but it is not guaranteed to have been
1029 // cloned already, so clone it here if needed.
1030 Constant *Base = CE->getOperand(0);
1031 Value *NewBase = ValueWithNewAddrSpace.lookup(Base);
1032 if (!NewBase)
1033 NewBase = cloneConstantExprWithNewAddressSpace(
1034 cast<ConstantExpr>(Base), NewAddrSpace, ValueWithNewAddrSpace, DL,
1035 TTI);
1036 assert(NewBase && "pointer operand of a rewritten GEP was not rewritten");
1037
1038 SmallVector<Constant *, 4> NewOperands;
1039 NewOperands.push_back(cast<Constant>(NewBase));
1040 for (unsigned Index = 1; Index < CE->getNumOperands(); ++Index)
1041 NewOperands.push_back(CE->getOperand(Index));
1042 // Needs to specify the source type while constructing a getelementptr
1043 // constant expression.
1044 return CE->getWithOperands(NewOperands, TargetType, /*OnlyIfReduced=*/false,
1045 cast<GEPOperator>(CE)->getSourceElementType());
1046 }
1047
1048 default:
1049 llvm_unreachable("unexpected constant expression");
1050 }
1051}
1052
1053// Returns a clone of the value `V`, with its operands replaced as specified in
1054// ValueWithNewAddrSpace. This function is called on every flat address
1055// expression whose address space needs to be modified, in postorder.
1056//
1057// See cloneInstructionWithNewAddressSpace for the meaning of PoisonUsesToFix.
1058Value *InferAddressSpacesImpl::cloneValueWithNewAddressSpace(
1059 Value *V, unsigned NewAddrSpace,
1060 const ValueToValueMapTy &ValueWithNewAddrSpace,
1061 const PredicatedAddrSpaceMapTy &PredicatedAS,
1062 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
1063 // All values in Postorder are flat address expressions.
1064 assert(V->getType()->getPointerAddressSpace() == FlatAddrSpace &&
1065 isAddressExpression(*V, *DL, TTI));
1066
1067 if (auto *Arg = dyn_cast<Argument>(V)) {
1068 // Arguments are address space casted in the function body, as we do not
1069 // want to change the function signature.
1070 Function *F = Arg->getParent();
1071 BasicBlock::iterator Insert = F->getEntryBlock().getFirstNonPHIIt();
1072
1073 Type *NewPtrTy = PointerType::get(Arg->getContext(), NewAddrSpace);
1074 auto *NewI = new AddrSpaceCastInst(Arg, NewPtrTy);
1075 NewI->insertBefore(Insert);
1076 return NewI;
1077 }
1078
1079 if (Instruction *I = dyn_cast<Instruction>(V)) {
1080 Value *NewV = cloneInstructionWithNewAddressSpace(
1081 I, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS, PoisonUsesToFix);
1082 if (Instruction *NewI = dyn_cast_or_null<Instruction>(NewV)) {
1083 if (NewI->getParent() == nullptr) {
1084 NewI->insertBefore(I->getIterator());
1085 NewI->takeName(I);
1086 NewI->setDebugLoc(I->getDebugLoc());
1087 }
1088 }
1089 return NewV;
1090 }
1091
1092 return cloneConstantExprWithNewAddressSpace(
1093 cast<ConstantExpr>(V), NewAddrSpace, ValueWithNewAddrSpace, DL, TTI);
1094}
1095
1096// Defines the join operation on the address space lattice (see the file header
1097// comments).
1098unsigned InferAddressSpacesImpl::joinAddressSpaces(unsigned AS1,
1099 unsigned AS2) const {
1100 if (AS1 == AS2)
1101 return AS1;
1102
1103 if (AS1 == FlatAddrSpace || AS2 == FlatAddrSpace)
1104 return FlatAddrSpace;
1105
1106 if (AS1 == UninitializedAddressSpace)
1107 return AS2;
1108 if (AS2 == UninitializedAddressSpace)
1109 return AS1;
1110
1111 return TTI->getAddressSpaceJoin(AS1, AS2);
1112}
1113
1114bool InferAddressSpacesImpl::run(Function &CurFn) {
1115 F = &CurFn;
1116 DL = &F->getDataLayout();
1117 PtrIntCastPairs.clear();
1118
1119 if (AssumeDefaultIsFlatAddressSpace)
1120 FlatAddrSpace = 0;
1121
1122 if (FlatAddrSpace == UninitializedAddressSpace) {
1124 if (FlatAddrSpace == UninitializedAddressSpace)
1125 return false;
1126 }
1127
1128 collectIntToPtrPointerOperand();
1129 // Collects all flat address expressions in postorder.
1130 std::vector<WeakTrackingVH> Postorder = collectFlatAddressExpressions(*F);
1131
1132 // Runs a data-flow analysis to refine the address spaces of every expression
1133 // in Postorder.
1134 ValueToAddrSpaceMapTy InferredAddrSpace;
1135 PredicatedAddrSpaceMapTy PredicatedAS;
1136 inferAddressSpaces(Postorder, InferredAddrSpace, PredicatedAS);
1137
1138 // Changes the address spaces of the flat address expressions who are inferred
1139 // to point to a specific address space.
1140 return rewriteWithNewAddressSpaces(Postorder, InferredAddrSpace,
1141 PredicatedAS);
1142}
1143
1144void InferAddressSpacesImpl::enqueueUsers(
1145 Value &V, const ValueToAddrSpaceMapTy &InferredAddrSpace,
1146 SetVector<Value *> &Worklist) const {
1147 for (Value *User : V.users()) {
1148 // Skip if User is already in the worklist.
1149 if (Worklist.count(User))
1150 continue;
1151
1152 ValueToAddrSpaceMapTy::const_iterator Pos = InferredAddrSpace.find(User);
1153 // Our algorithm only updates the address spaces of flat address
1154 // expressions, which are those in InferredAddrSpace.
1155 if (Pos == InferredAddrSpace.end())
1156 continue;
1157
1158 // Function updateAddressSpace moves the address space down a lattice path.
1159 // Therefore, nothing to do if User is already inferred as flat (the bottom
1160 // element in the lattice).
1161 if (Pos->second == FlatAddrSpace)
1162 continue;
1163
1164 Worklist.insert(User);
1165 }
1166}
1167
1168void InferAddressSpacesImpl::runToFixPoint(
1169 SetVector<Value *> &Worklist, ValueToAddrSpaceMapTy &InferredAddrSpace,
1170 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1171 while (!Worklist.empty()) {
1172 Value *V = Worklist.pop_back_val();
1173
1174 // Try to update the address space of the stack top according to the
1175 // address spaces of its operands.
1176 if (!updateAddressSpace(*V, InferredAddrSpace, PredicatedAS))
1177 continue;
1178
1179 enqueueUsers(*V, InferredAddrSpace, Worklist);
1180 }
1181}
1182
1183// Constants need to be tracked through RAUW to handle cases with nested
1184// constant expressions, so wrap values in WeakTrackingVH.
1185void InferAddressSpacesImpl::inferAddressSpaces(
1186 ArrayRef<WeakTrackingVH> Postorder,
1187 ValueToAddrSpaceMapTy &InferredAddrSpace,
1188 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1189 SetVector<Value *> Worklist(llvm::from_range, Postorder);
1190 // Initially, all expressions are in the uninitialized address space.
1191 for (Value *V : Postorder)
1192 InferredAddrSpace[V] = UninitializedAddressSpace;
1193
1194 runToFixPoint(Worklist, InferredAddrSpace, PredicatedAS);
1195
1196 // A value still uninitialized here is stuck in a cycle of uninitialized
1197 // values and carries no address space information. Lower it to flat so its
1198 // users join to flat, instead of being rewritten to reference an operand
1199 // that rewriteWithNewAddressSpaces() never converts.
1200 SmallVector<Value *, 4> Lowered;
1201 for (Value *V : Postorder) {
1202 ValueToAddrSpaceMapTy::iterator I = InferredAddrSpace.find(V);
1203 if (I->second == UninitializedAddressSpace) {
1204 I->second = FlatAddrSpace;
1205 Lowered.push_back(V);
1206 }
1207 }
1208
1209 for (Value *V : Lowered)
1210 enqueueUsers(*V, InferredAddrSpace, Worklist);
1211
1212 runToFixPoint(Worklist, InferredAddrSpace, PredicatedAS);
1213}
1214
1215unsigned
1216InferAddressSpacesImpl::getPredicatedAddrSpace(const Value &Ptr,
1217 const Value *UserCtx) const {
1218 const Instruction *UserCtxI = dyn_cast<Instruction>(UserCtx);
1219 if (!UserCtxI)
1221
1222 const Value *StrippedPtr = Ptr.stripInBoundsOffsets();
1223 for (auto &AssumeVH : AC.assumptionsFor(StrippedPtr)) {
1224 if (!AssumeVH)
1225 continue;
1226 CallInst *CI = cast<CallInst>(AssumeVH);
1227 if (!isValidAssumeForContext(CI, UserCtxI, DT))
1228 continue;
1229
1230 const Value *Ptr;
1231 unsigned AS;
1232 std::tie(Ptr, AS) = TTI->getPredicatedAddrSpace(CI->getArgOperand(0));
1233 if (Ptr)
1234 return AS;
1235 }
1236
1238}
1239
1240bool InferAddressSpacesImpl::updateAddressSpace(
1241 const Value &V, ValueToAddrSpaceMapTy &InferredAddrSpace,
1242 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1243 assert(InferredAddrSpace.count(&V));
1244
1245 LLVM_DEBUG(dbgs() << "Updating the address space of\n " << V << '\n');
1246
1247 // The new inferred address space equals the join of the address spaces
1248 // of all its pointer operands.
1249 unsigned NewAS = UninitializedAddressSpace;
1250
1251 // isAddressExpression should guarantee that V is an operator or an argument.
1253
1254 unsigned AS = TTI->getAssumedAddrSpace(&V);
1255 if (AS != UninitializedAddressSpace) {
1256 // Use the assumed address space directly.
1257 NewAS = AS;
1258 } else {
1259 // Otherwise, infer the address space from its pointer operands.
1260 SmallVector<Constant *, 2> ConstantPtrOps;
1261 SmallVector<Value *, 2> PtrOps = getPointerOperands(V, *DL, TTI);
1262 for (Value *PtrOperand : PtrOps) {
1263 auto I = InferredAddrSpace.find(PtrOperand);
1264 unsigned OperandAS;
1265 if (I == InferredAddrSpace.end()) {
1266 OperandAS = PtrOperand->getType()->getPointerAddressSpace();
1267 if (auto *C = dyn_cast<Constant>(PtrOperand);
1268 C && OperandAS == FlatAddrSpace) {
1269 // Defer joining the address space of constant pointer operands.
1270 ConstantPtrOps.push_back(C);
1271 continue;
1272 }
1273 if (OperandAS == FlatAddrSpace) {
1274 // Check AC for assumption dominating V.
1275 unsigned AS = getPredicatedAddrSpace(*PtrOperand, &V);
1276 if (AS != UninitializedAddressSpace) {
1278 << " deduce operand AS from the predicate addrspace "
1279 << AS << '\n');
1280 OperandAS = AS;
1281 // Record this use with the predicated AS.
1282 PredicatedAS[std::make_pair(&V, PtrOperand)] = OperandAS;
1283 }
1284 }
1285 } else
1286 OperandAS = I->second;
1287
1288 // join(flat, *) = flat. So we can break if NewAS is already flat.
1289 NewAS = joinAddressSpaces(NewAS, OperandAS);
1290 if (NewAS == FlatAddrSpace)
1291 break;
1292 }
1293
1294 if (NewAS != FlatAddrSpace && NewAS != UninitializedAddressSpace) {
1295 if (any_of(ConstantPtrOps, [=](Constant *C) {
1296 return !isSafeToCastConstAddrSpace(C, NewAS);
1297 }))
1298 NewAS = FlatAddrSpace;
1299 }
1300
1301 // operator(flat const, flat const, ...) -> flat
1302 if (NewAS == UninitializedAddressSpace &&
1303 PtrOps.size() == ConstantPtrOps.size())
1304 NewAS = FlatAddrSpace;
1305 }
1306
1307 unsigned OldAS = InferredAddrSpace.lookup(&V);
1308 assert(OldAS != FlatAddrSpace);
1309 if (OldAS == NewAS)
1310 return false;
1311
1312 // If any updates are made, grabs its users to the worklist because
1313 // their address spaces can also be possibly updated.
1314 LLVM_DEBUG(dbgs() << " to " << NewAS << '\n');
1315 InferredAddrSpace[&V] = NewAS;
1316 return true;
1317}
1318
1319/// Replace operand \p OpIdx in \p Inst, if the value is the same as \p OldVal
1320/// with \p NewVal.
1321static bool replaceOperandIfSame(Instruction *Inst, unsigned OpIdx,
1322 Value *OldVal, Value *NewVal) {
1323 Use &U = Inst->getOperandUse(OpIdx);
1324 if (U.get() == OldVal) {
1325 U.set(NewVal);
1326 return true;
1327 }
1328
1329 return false;
1330}
1331
1332template <typename InstrType>
1334 InstrType *MemInstr, Value *OldV,
1335 Value *NewV) {
1336 unsigned AddrSpace = NewV->getType()->getPointerAddressSpace();
1337 if (!MemInstr->isVolatile() || TTI.hasVolatileVariant(MemInstr, AddrSpace)) {
1338 return replaceOperandIfSame(MemInstr, InstrType::getPointerOperandIndex(),
1339 OldV, NewV);
1340 }
1341
1342 return false;
1343}
1344
1345/// If \p OldV is used as the pointer operand of a compatible memory operation
1346/// \p Inst, replaces the pointer operand with NewV.
1347///
1348/// This covers memory instructions with a single pointer operand that can have
1349/// its address space changed by simply mutating the use to a new value.
1350///
1351/// \p returns true the user replacement was made.
1353 User *Inst, Value *OldV, Value *NewV) {
1354 if (auto *LI = dyn_cast<LoadInst>(Inst))
1355 return replaceSimplePointerUse(TTI, LI, OldV, NewV);
1356
1357 if (auto *SI = dyn_cast<StoreInst>(Inst))
1358 return replaceSimplePointerUse(TTI, SI, OldV, NewV);
1359
1360 if (auto *RMW = dyn_cast<AtomicRMWInst>(Inst))
1361 return replaceSimplePointerUse(TTI, RMW, OldV, NewV);
1362
1363 if (auto *CmpX = dyn_cast<AtomicCmpXchgInst>(Inst))
1364 return replaceSimplePointerUse(TTI, CmpX, OldV, NewV);
1365
1366 return false;
1367}
1368
1369/// Update memory intrinsic uses that require more complex processing than
1370/// simple memory instructions. These require re-mangling and may have multiple
1371/// pointer operands.
1373 Value *NewV) {
1374 IRBuilder<> B(MI);
1375 if (auto *MSI = dyn_cast<MemSetInst>(MI)) {
1376 B.CreateMemSet(NewV, MSI->getValue(), MSI->getLength(), MSI->getDestAlign(),
1377 false, // isVolatile
1378 MI->getAAMetadata());
1379 } else if (auto *MTI = dyn_cast<MemTransferInst>(MI)) {
1380 Value *Src = MTI->getRawSource();
1381 Value *Dest = MTI->getRawDest();
1382
1383 // Be careful in case this is a self-to-self copy.
1384 if (Src == OldV)
1385 Src = NewV;
1386
1387 if (Dest == OldV)
1388 Dest = NewV;
1389
1390 if (auto *MCI = dyn_cast<MemCpyInst>(MTI)) {
1391 if (MCI->isForceInlined())
1392 B.CreateMemCpyInline(Dest, MTI->getDestAlign(), Src,
1393 MTI->getSourceAlign(), MTI->getLength(),
1394 false, // isVolatile
1395 MI->getAAMetadata());
1396 else
1397 B.CreateMemCpy(Dest, MTI->getDestAlign(), Src, MTI->getSourceAlign(),
1398 MTI->getLength(),
1399 false, // isVolatile
1400 MI->getAAMetadata());
1401 } else {
1403 B.CreateMemMove(Dest, MTI->getDestAlign(), Src, MTI->getSourceAlign(),
1404 MTI->getLength(),
1405 false, // isVolatile
1406 MI->getAAMetadata());
1407 }
1408 } else
1409 llvm_unreachable("unhandled MemIntrinsic");
1410
1411 MI->eraseFromParent();
1412 return true;
1413}
1414
1415// \p returns true if it is OK to change the address space of constant \p C with
1416// a ConstantExpr addrspacecast.
1417bool InferAddressSpacesImpl::isSafeToCastConstAddrSpace(Constant *C,
1418 unsigned NewAS) const {
1420
1421 unsigned SrcAS = C->getType()->getPointerAddressSpace();
1422 if (SrcAS == NewAS || isa<UndefValue>(C))
1423 return true;
1424
1425 // Prevent illegal casts between different non-flat address spaces.
1426 if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace)
1427 return false;
1428
1430 return true;
1431
1432 if (auto *Op = dyn_cast<Operator>(C)) {
1433 // If we already have a constant addrspacecast, it should be safe to cast it
1434 // off.
1435 if (Op->getOpcode() == Instruction::AddrSpaceCast)
1436 return isSafeToCastConstAddrSpace(cast<Constant>(Op->getOperand(0)),
1437 NewAS);
1438
1439 if (Op->getOpcode() == Instruction::IntToPtr &&
1440 Op->getType()->getPointerAddressSpace() == FlatAddrSpace)
1441 return true;
1442 }
1443
1444 return false;
1445}
1446
1449 User *CurUser = I->getUser();
1450 ++I;
1451
1452 while (I != End && I->getUser() == CurUser)
1453 ++I;
1454
1455 return I;
1456}
1457
1458void InferAddressSpacesImpl::performPointerReplacement(
1459 Value *V, Value *NewV, Use &U, ValueToValueMapTy &ValueWithNewAddrSpace,
1460 SmallVectorImpl<Instruction *> &DeadInstructions) const {
1461
1462 User *CurUser = U.getUser();
1463
1464 if (replaceIfSimplePointerUse(*TTI, CurUser, V, NewV))
1465 return;
1466
1467 // Skip if the current user is the new value itself.
1468 if (CurUser == NewV)
1469 return;
1470
1471 auto *CurUserI = dyn_cast<Instruction>(CurUser);
1472 if (!CurUserI || CurUserI->getFunction() != F)
1473 return;
1474
1475 // Handle more complex cases like intrinsic that need to be remangled.
1476 if (auto *MI = dyn_cast<MemIntrinsic>(CurUser)) {
1477 if (!MI->isVolatile() && handleMemIntrinsicPtrUse(MI, V, NewV))
1478 return;
1479 }
1480
1481 if (auto *II = dyn_cast<IntrinsicInst>(CurUser)) {
1482 if (rewriteIntrinsicOperands(II, V, NewV))
1483 return;
1484 }
1485
1486 if (ICmpInst *Cmp = dyn_cast<ICmpInst>(CurUserI)) {
1487 // If we can infer that both pointers are in the same addrspace,
1488 // transform e.g.
1489 // %cmp = icmp eq float* %p, %q
1490 // into
1491 // %cmp = icmp eq float addrspace(3)* %new_p, %new_q
1492
1493 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
1494 int SrcIdx = U.getOperandNo();
1495 int OtherIdx = (SrcIdx == 0) ? 1 : 0;
1496 Value *OtherSrc = Cmp->getOperand(OtherIdx);
1497
1498 if (Value *OtherNewV = ValueWithNewAddrSpace.lookup(OtherSrc)) {
1499 if (OtherNewV->getType()->getPointerAddressSpace() == NewAS) {
1500 Cmp->setOperand(OtherIdx, OtherNewV);
1501 Cmp->setOperand(SrcIdx, NewV);
1502 return;
1503 }
1504 }
1505
1506 // Even if the type mismatches, we can cast the constant.
1507 if (auto *KOtherSrc = dyn_cast<Constant>(OtherSrc)) {
1508 if (isSafeToCastConstAddrSpace(KOtherSrc, NewAS)) {
1509 Cmp->setOperand(SrcIdx, NewV);
1510 Cmp->setOperand(OtherIdx, ConstantExpr::getAddrSpaceCast(
1511 KOtherSrc, NewV->getType()));
1512 return;
1513 }
1514 }
1515 }
1516
1517 if (AddrSpaceCastInst *ASC = dyn_cast<AddrSpaceCastInst>(CurUserI)) {
1518 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
1519 if (ASC->getDestAddressSpace() == NewAS) {
1520 ASC->replaceAllUsesWith(NewV);
1521 DeadInstructions.push_back(ASC);
1522 return;
1523 }
1524 }
1525
1526 // Otherwise, replaces the use with flat(NewV).
1527 if (isa<Instruction>(V) || isa<Instruction>(NewV)) {
1528 // Don't create a copy of the original addrspacecast.
1529 if (U == V && isa<AddrSpaceCastInst>(V))
1530 return;
1531
1532 // Insert the addrspacecast after NewV.
1533 BasicBlock::iterator InsertPos;
1534 if (Instruction *NewVInst = dyn_cast<Instruction>(NewV))
1535 InsertPos = std::next(NewVInst->getIterator());
1536 else
1537 InsertPos = std::next(cast<Instruction>(V)->getIterator());
1538
1539 while (isa<PHINode>(InsertPos))
1540 ++InsertPos;
1541 // This instruction may contain multiple uses of V, update them all.
1542 CurUser->replaceUsesOfWith(
1543 V, new AddrSpaceCastInst(NewV, V->getType(), "", InsertPos));
1544 } else {
1545 CurUserI->replaceUsesOfWith(
1546 V, ConstantExpr::getAddrSpaceCast(cast<Constant>(NewV), V->getType()));
1547 }
1548}
1549
1550bool InferAddressSpacesImpl::rewriteWithNewAddressSpaces(
1551 ArrayRef<WeakTrackingVH> Postorder,
1552 const ValueToAddrSpaceMapTy &InferredAddrSpace,
1553 const PredicatedAddrSpaceMapTy &PredicatedAS) const {
1554 // For each address expression to be modified, creates a clone of it with its
1555 // pointer operands converted to the new address space. Since the pointer
1556 // operands are converted, the clone is naturally in the new address space by
1557 // construction.
1558 ValueToValueMapTy ValueWithNewAddrSpace;
1559 SmallVector<const Use *, 32> PoisonUsesToFix;
1560 for (Value *V : Postorder) {
1561 unsigned NewAddrSpace = InferredAddrSpace.lookup(V);
1562
1563 // In some degenerate cases (e.g. invalid IR in unreachable code), we may
1564 // not even infer the value to have its original address space.
1565 if (NewAddrSpace == UninitializedAddressSpace)
1566 continue;
1567
1568 if (V->getType()->getPointerAddressSpace() != NewAddrSpace) {
1569 Value *New =
1570 cloneValueWithNewAddressSpace(V, NewAddrSpace, ValueWithNewAddrSpace,
1571 PredicatedAS, &PoisonUsesToFix);
1572 if (New)
1573 ValueWithNewAddrSpace[V] = New;
1574 }
1575 }
1576
1577 if (ValueWithNewAddrSpace.empty())
1578 return false;
1579
1580 // Fixes all the poison uses generated by cloneInstructionWithNewAddressSpace.
1581 for (const Use *PoisonUse : PoisonUsesToFix) {
1582 User *V = PoisonUse->getUser();
1583 User *NewV = cast_or_null<User>(ValueWithNewAddrSpace.lookup(V));
1584 if (!NewV)
1585 continue;
1586
1587 unsigned OperandNo = PoisonUse->getOperandNo();
1588 assert(isa<PoisonValue>(NewV->getOperand(OperandNo)));
1589 unsigned NewAS =
1590 NewV->getOperand(OperandNo)->getType()->getPointerAddressSpace();
1592 *PoisonUse, NewAS, ValueWithNewAddrSpace, PredicatedAS, nullptr);
1593 NewV->setOperand(OperandNo, NewOp);
1594 }
1595
1596 SmallVector<Instruction *, 16> DeadInstructions;
1597 ValueToValueMapTy VMap;
1598 ValueMapper VMapper(VMap, RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
1599
1600 // Replaces the uses of the old address expressions with the new ones.
1601 for (const WeakTrackingVH &WVH : Postorder) {
1602 assert(WVH && "value was unexpectedly deleted");
1603 Value *V = WVH;
1604 Value *NewV = ValueWithNewAddrSpace.lookup(V);
1605 if (NewV == nullptr)
1606 continue;
1607
1608 LLVM_DEBUG(dbgs() << "Replacing the uses of " << *V << "\n with\n "
1609 << *NewV << '\n');
1610
1611 if (Constant *C = dyn_cast<Constant>(V)) {
1612 Constant *Replace =
1614 if (C != Replace) {
1615 LLVM_DEBUG(dbgs() << "Inserting replacement const cast: " << Replace
1616 << ": " << *Replace << '\n');
1617 SmallVector<User *, 16> WorkList;
1618 for (User *U : make_early_inc_range(C->users())) {
1619 if (auto *I = dyn_cast<Instruction>(U)) {
1620 if (I->getFunction() == F)
1621 I->replaceUsesOfWith(C, Replace);
1622 } else {
1623 WorkList.append(U->user_begin(), U->user_end());
1624 }
1625 }
1626 if (!WorkList.empty()) {
1627 VMap[C] = Replace;
1628 DenseSet<User *> Visited{WorkList.begin(), WorkList.end()};
1629 while (!WorkList.empty()) {
1630 User *U = WorkList.pop_back_val();
1631 if (auto *I = dyn_cast<Instruction>(U)) {
1632 if (I->getFunction() == F)
1633 VMapper.remapInstruction(*I);
1634 continue;
1635 }
1636 for (User *U2 : U->users())
1637 if (Visited.insert(U2).second)
1638 WorkList.push_back(U2);
1639 }
1640 }
1641 V = Replace;
1642 }
1643 }
1644
1645 Value::use_iterator I, E, Next;
1646 for (I = V->use_begin(), E = V->use_end(); I != E;) {
1647 Use &U = *I;
1648
1649 // Some users may see the same pointer operand in multiple operands. Skip
1650 // to the next instruction.
1651 I = skipToNextUser(I, E);
1652
1653 performPointerReplacement(V, NewV, U, ValueWithNewAddrSpace,
1654 DeadInstructions);
1655 }
1656
1657 if (V->use_empty()) {
1658 if (Instruction *I = dyn_cast<Instruction>(V))
1659 DeadInstructions.push_back(I);
1660 }
1661 }
1662
1663 // Deleting one instruction may recursively delete another queued
1664 // instruction. Create handles before the first deletion so overlapping
1665 // entries are nulled instead of leaving dangling pointers.
1666 auto DeadInstructionHandles =
1667 to_vector_of<WeakTrackingVH, 16>(DeadInstructions);
1668 RecursivelyDeleteTriviallyDeadInstructions(DeadInstructionHandles);
1669
1670 return true;
1671}
1672
1673bool InferAddressSpaces::runOnFunction(Function &F) {
1674 if (skipFunction(F))
1675 return false;
1676
1677 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
1678 DominatorTree *DT = DTWP ? &DTWP->getDomTree() : nullptr;
1679 return InferAddressSpacesImpl(
1680 getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F), DT,
1681 &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F),
1682 FlatAddrSpace, /*AssumeDefaultIsFlatAddressSpace=*/false)
1683 .run(F);
1684}
1685
1687 return new InferAddressSpaces(AddressSpace);
1688}
1689
1691 bool AssumeDefaultIsFlatAddressSpace)
1692 : FlatAddrSpace(UninitializedAddressSpace),
1693 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
1695 unsigned AddressSpace, bool AssumeDefaultIsFlatAddressSpace)
1696 : FlatAddrSpace(AddressSpace),
1697 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
1698
1701 bool Changed =
1702 InferAddressSpacesImpl(AM.getResult<AssumptionAnalysis>(F),
1704 &AM.getResult<TargetIRAnalysis>(F), FlatAddrSpace,
1705 AssumeDefaultIsFlatAddressSpace)
1706 .run(F);
1707 if (Changed) {
1710 return PA;
1711 }
1712 return PreservedAnalyses::all();
1713}
1714
1716 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
1717 static_cast<PassInfoMixin<InferAddressSpacesPass> *>(this)->printPipeline(
1718 OS, MapClassName2PassName);
1719 if (AssumeDefaultIsFlatAddressSpace)
1720 OS << "<assume-default-is-flat-addrspace>";
1721}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Rewrite undef for PHI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_UNLIKELY(EXPR)
Definition Compiler.h:348
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
static bool runOnFunction(Function &F, bool PostInlining)
#define DEBUG_TYPE
Hexagon Common GEP
IRTranslator LLVM IR MI
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
static bool replaceOperandIfSame(Instruction *Inst, unsigned OpIdx, Value *OldVal, Value *NewVal)
Replace operand OpIdx in Inst, if the value is the same as OldVal with NewVal.
static bool isNoopPtrIntCastPair(const Operator *I2P, const DataLayout &DL, const TargetTransformInfo *TTI)
static bool replaceIfSimplePointerUse(const TargetTransformInfo &TTI, User *Inst, Value *OldV, Value *NewV)
If OldV is used as the pointer operand of a compatible memory operation Inst, replaces the pointer op...
static Value * phiNodeOperandWithNewAddressSpace(AddrSpaceCastInst *NewI, Value *Operand)
static bool handleMemIntrinsicPtrUse(MemIntrinsic *MI, Value *OldV, Value *NewV)
Update memory intrinsic uses that require more complex processing than simple memory instructions.
static Value * operandWithNewAddressSpaceOrCreatePoison(const Use &OperandUse, unsigned NewAddrSpace, const ValueToValueMapTy &ValueWithNewAddrSpace, const PredicatedAddrSpaceMapTy &PredicatedAS, SmallVectorImpl< const Use * > *PoisonUsesToFix)
static Value::use_iterator skipToNextUser(Value::use_iterator I, Value::use_iterator End)
Infer address static false Type * getPtrOrVecOfPtrsWithNewAS(Type *Ty, unsigned NewAddrSpace)
static bool replaceSimplePointerUse(const TargetTransformInfo &TTI, InstrType *MemInstr, Value *OldV, Value *NewV)
static APInt computeMaxChangedPtrBits(const Operator *Op, const Value *Mask, const DataLayout &DL, AssumptionCache *AC, const DominatorTree *DT)
static const unsigned UninitializedAddressSpace
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
This pass exposes codegen information to IR-level passes.
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1261
This class represents a conversion between pointers from one address space to another.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition Pass.cpp:280
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
MutableArrayRef< ResultElem > assumptionsFor(const Value *V)
Access the list of assumptions which affect this value.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
Value * getArgOperand(unsigned i) const
static LLVM_ABI bool isNoopCast(Instruction::CastOps Opcode, Type *SrcTy, Type *DstTy, const DataLayout &DL)
A no-op cast is one that can be effected without changing any bits.
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:793
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:827
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:312
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setIsInBounds(bool b=true)
Set or clear the inbounds flag on this GEP instruction.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2909
LLVM_ABI InferAddressSpacesPass(bool AssumeDefaultIsFlatAddressSpace=false)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
This is the common base class for memset/memcpy/memmove.
This is a utility class that provides an abstraction for the common functionality between Instruction...
Definition Operator.h:33
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
Definition Operator.h:43
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static unsigned getOperandNumForIncomingValue(unsigned i)
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
value_type pop_back_val()
Definition SetVector.h:285
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Analysis pass providing the TargetTransformInfo.
Wrapper pass for TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
LLVM_ABI unsigned getAssumedAddrSpace(const Value *V) const
LLVM_ABI std::pair< KnownBits, KnownBits > computeKnownBitsAddrSpaceCast(unsigned ToAS, const Value &PtrOp) const
LLVM_ABI bool isNoopAddrSpaceCast(unsigned FromAS, unsigned ToAS) const
LLVM_ABI std::pair< const Value *, unsigned > getPredicatedAddrSpace(const Value *V) const
LLVM_ABI unsigned getAddressSpaceJoin(unsigned AS1, unsigned AS2) const
Return the most specific common address space containing AS1 and AS2.
LLVM_ABI bool collectFlatAddressOperands(SmallVectorImpl< int > &OpIndexes, Intrinsic::ID IID) const
Return any intrinsic address operand indexes which may be rewritten if they use a flat address space ...
LLVM_ABI Value * rewriteIntrinsicWithAddressSpace(IntrinsicInst *II, Value *OldV, Value *NewV) const
Rewrite intrinsic call II such that OldV will be replaced with NewV, which has a different address sp...
LLVM_ABI unsigned getFlatAddressSpace() const
Returns the address space ID for a target's 'flat' address space.
LLVM_ABI APInt getAddrSpaceCastPreservedPtrMask(unsigned SrcAS, unsigned DstAS) const
Returns a mask indicating which bits of a pointer remain unchanged when casting between address space...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:280
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Value * get() const
Definition Use.h:55
const Use & getOperandUse(unsigned i) const
Definition User.h:220
void setOperand(unsigned i, Value *Val)
Definition User.h:212
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
Definition User.cpp:25
Value * getOperand(unsigned i) const
Definition User.h:207
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition ValueMap.h:167
bool empty() const
Definition ValueMap.h:143
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI const Value * stripInBoundsOffsets(function_ref< void(const Value *)> Func=[](const Value *) {}) const
Strip off pointer casts and inbounds GEPs.
Definition Value.cpp:824
use_iterator_impl< Use > use_iterator
Definition Value.h:355
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:708
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
bool match(Val *V, const Pattern &P)
auto m_Value()
Match an arbitrary value and ignore it.
BinOpPred_match< LHS, RHS, is_bitwiselogic_op, true > m_c_BitwiseLogic(const LHS &L, const RHS &R)
Matches bitwise logic operations in either order.
CastOperator_match< OpTy, Instruction::PtrToInt > m_PtrToInt(const OpTy &Op)
Matches PtrToInt.
@ CE
Windows NT (Windows on ARM)
Definition MCAsmInfo.h:51
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
@ User
could "use" a pointer
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
Definition Local.cpp:520
@ Known
Known to have no common set bits.
LLVM_ABI void initializeInferAddressSpacesPass(PassRegistry &)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
constexpr from_range_t from_range
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
auto cast_or_null(const Y &Val)
Definition Casting.h:714
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CtxI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
Definition ValueMapper.h:98
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
Definition ValueMapper.h:80
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
TargetTransformInfo TTI
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
LLVM_ABI FunctionPass * createInferAddressSpacesPass(unsigned AddressSpace=~0u)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:267
SmallVector< Out, Size > to_vector_of(R &&Range)
unsigned getBitWidth() const
Get the bit width of this value.
Definition KnownBits.h:44
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
Definition KnownBits.h:310
static KnownBits sub(const KnownBits &LHS, const KnownBits &RHS, bool NSW=false, bool NUW=false)
Compute knownbits resulting from subtraction of LHS and RHS.
Definition KnownBits.h:376