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 if (CE->getOpcode() == Instruction::AddrSpaceCast) {
999 // Because CE is flat, the source address space must be specific.
1000 // Therefore, the inferred address space must be the source space according
1001 // to our algorithm.
1002 assert(CE->getOperand(0)->getType()->getPointerAddressSpace() ==
1003 NewAddrSpace);
1004 return CE->getOperand(0);
1005 }
1006
1007 if (CE->getOpcode() == 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
1013 if (CE->getOpcode() == Instruction::IntToPtr) {
1014 if (isNoopPtrIntCastPair(cast<Operator>(CE), *DL, TTI)) {
1015 Constant *Src = cast<ConstantExpr>(CE->getOperand(0))->getOperand(0);
1016 assert(Src->getType()->getPointerAddressSpace() == NewAddrSpace);
1017 return Src;
1018 }
1019 assert(isSafeToCastIntToPtrAddrSpace(cast<Operator>(CE)));
1020 return ConstantExpr::getAddrSpaceCast(CE, TargetType);
1021 }
1022
1023 // Computes the operands of the new constant expression.
1024 bool IsNew = false;
1025 SmallVector<Constant *, 4> NewOperands;
1026 for (unsigned Index = 0; Index < CE->getNumOperands(); ++Index) {
1027 Constant *Operand = CE->getOperand(Index);
1028 // If the address space of `Operand` needs to be modified, the new operand
1029 // with the new address space should already be in ValueWithNewAddrSpace
1030 // because (1) the constant expressions we consider (i.e. addrspacecast,
1031 // bitcast, and getelementptr) do not incur cycles in the data flow graph
1032 // and (2) this function is called on constant expressions in postorder.
1033 if (Value *NewOperand = ValueWithNewAddrSpace.lookup(Operand)) {
1034 IsNew = true;
1035 NewOperands.push_back(cast<Constant>(NewOperand));
1036 continue;
1037 }
1038 if (auto *CExpr = dyn_cast<ConstantExpr>(Operand))
1039 if (Value *NewOperand = cloneConstantExprWithNewAddressSpace(
1040 CExpr, NewAddrSpace, ValueWithNewAddrSpace, DL, TTI)) {
1041 IsNew = true;
1042 NewOperands.push_back(cast<Constant>(NewOperand));
1043 continue;
1044 }
1045 // Otherwise, reuses the old operand.
1046 NewOperands.push_back(Operand);
1047 }
1048
1049 // If !IsNew, we will replace the Value with itself. However, replaced values
1050 // are assumed to wrapped in an addrspacecast cast later so drop it now.
1051 if (!IsNew)
1052 return nullptr;
1053
1054 if (CE->getOpcode() == Instruction::GetElementPtr) {
1055 // Needs to specify the source type while constructing a getelementptr
1056 // constant expression.
1057 return CE->getWithOperands(NewOperands, TargetType, /*OnlyIfReduced=*/false,
1058 cast<GEPOperator>(CE)->getSourceElementType());
1059 }
1060
1061 return CE->getWithOperands(NewOperands, TargetType);
1062}
1063
1064// Returns a clone of the value `V`, with its operands replaced as specified in
1065// ValueWithNewAddrSpace. This function is called on every flat address
1066// expression whose address space needs to be modified, in postorder.
1067//
1068// See cloneInstructionWithNewAddressSpace for the meaning of PoisonUsesToFix.
1069Value *InferAddressSpacesImpl::cloneValueWithNewAddressSpace(
1070 Value *V, unsigned NewAddrSpace,
1071 const ValueToValueMapTy &ValueWithNewAddrSpace,
1072 const PredicatedAddrSpaceMapTy &PredicatedAS,
1073 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
1074 // All values in Postorder are flat address expressions.
1075 assert(V->getType()->getPointerAddressSpace() == FlatAddrSpace &&
1076 isAddressExpression(*V, *DL, TTI));
1077
1078 if (auto *Arg = dyn_cast<Argument>(V)) {
1079 // Arguments are address space casted in the function body, as we do not
1080 // want to change the function signature.
1081 Function *F = Arg->getParent();
1082 BasicBlock::iterator Insert = F->getEntryBlock().getFirstNonPHIIt();
1083
1084 Type *NewPtrTy = PointerType::get(Arg->getContext(), NewAddrSpace);
1085 auto *NewI = new AddrSpaceCastInst(Arg, NewPtrTy);
1086 NewI->insertBefore(Insert);
1087 return NewI;
1088 }
1089
1090 if (Instruction *I = dyn_cast<Instruction>(V)) {
1091 Value *NewV = cloneInstructionWithNewAddressSpace(
1092 I, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS, PoisonUsesToFix);
1093 if (Instruction *NewI = dyn_cast_or_null<Instruction>(NewV)) {
1094 if (NewI->getParent() == nullptr) {
1095 NewI->insertBefore(I->getIterator());
1096 NewI->takeName(I);
1097 NewI->setDebugLoc(I->getDebugLoc());
1098 }
1099 }
1100 return NewV;
1101 }
1102
1103 return cloneConstantExprWithNewAddressSpace(
1104 cast<ConstantExpr>(V), NewAddrSpace, ValueWithNewAddrSpace, DL, TTI);
1105}
1106
1107// Defines the join operation on the address space lattice (see the file header
1108// comments).
1109unsigned InferAddressSpacesImpl::joinAddressSpaces(unsigned AS1,
1110 unsigned AS2) const {
1111 if (AS1 == AS2)
1112 return AS1;
1113
1114 if (AS1 == FlatAddrSpace || AS2 == FlatAddrSpace)
1115 return FlatAddrSpace;
1116
1117 if (AS1 == UninitializedAddressSpace)
1118 return AS2;
1119 if (AS2 == UninitializedAddressSpace)
1120 return AS1;
1121
1122 return TTI->getAddressSpaceJoin(AS1, AS2);
1123}
1124
1125bool InferAddressSpacesImpl::run(Function &CurFn) {
1126 F = &CurFn;
1127 DL = &F->getDataLayout();
1128 PtrIntCastPairs.clear();
1129
1130 if (AssumeDefaultIsFlatAddressSpace)
1131 FlatAddrSpace = 0;
1132
1133 if (FlatAddrSpace == UninitializedAddressSpace) {
1135 if (FlatAddrSpace == UninitializedAddressSpace)
1136 return false;
1137 }
1138
1139 collectIntToPtrPointerOperand();
1140 // Collects all flat address expressions in postorder.
1141 std::vector<WeakTrackingVH> Postorder = collectFlatAddressExpressions(*F);
1142
1143 // Runs a data-flow analysis to refine the address spaces of every expression
1144 // in Postorder.
1145 ValueToAddrSpaceMapTy InferredAddrSpace;
1146 PredicatedAddrSpaceMapTy PredicatedAS;
1147 inferAddressSpaces(Postorder, InferredAddrSpace, PredicatedAS);
1148
1149 // Changes the address spaces of the flat address expressions who are inferred
1150 // to point to a specific address space.
1151 return rewriteWithNewAddressSpaces(Postorder, InferredAddrSpace,
1152 PredicatedAS);
1153}
1154
1155void InferAddressSpacesImpl::enqueueUsers(
1156 Value &V, const ValueToAddrSpaceMapTy &InferredAddrSpace,
1157 SetVector<Value *> &Worklist) const {
1158 for (Value *User : V.users()) {
1159 // Skip if User is already in the worklist.
1160 if (Worklist.count(User))
1161 continue;
1162
1163 ValueToAddrSpaceMapTy::const_iterator Pos = InferredAddrSpace.find(User);
1164 // Our algorithm only updates the address spaces of flat address
1165 // expressions, which are those in InferredAddrSpace.
1166 if (Pos == InferredAddrSpace.end())
1167 continue;
1168
1169 // Function updateAddressSpace moves the address space down a lattice path.
1170 // Therefore, nothing to do if User is already inferred as flat (the bottom
1171 // element in the lattice).
1172 if (Pos->second == FlatAddrSpace)
1173 continue;
1174
1175 Worklist.insert(User);
1176 }
1177}
1178
1179void InferAddressSpacesImpl::runToFixPoint(
1180 SetVector<Value *> &Worklist, ValueToAddrSpaceMapTy &InferredAddrSpace,
1181 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1182 while (!Worklist.empty()) {
1183 Value *V = Worklist.pop_back_val();
1184
1185 // Try to update the address space of the stack top according to the
1186 // address spaces of its operands.
1187 if (!updateAddressSpace(*V, InferredAddrSpace, PredicatedAS))
1188 continue;
1189
1190 enqueueUsers(*V, InferredAddrSpace, Worklist);
1191 }
1192}
1193
1194// Constants need to be tracked through RAUW to handle cases with nested
1195// constant expressions, so wrap values in WeakTrackingVH.
1196void InferAddressSpacesImpl::inferAddressSpaces(
1197 ArrayRef<WeakTrackingVH> Postorder,
1198 ValueToAddrSpaceMapTy &InferredAddrSpace,
1199 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1200 SetVector<Value *> Worklist(llvm::from_range, Postorder);
1201 // Initially, all expressions are in the uninitialized address space.
1202 for (Value *V : Postorder)
1203 InferredAddrSpace[V] = UninitializedAddressSpace;
1204
1205 runToFixPoint(Worklist, InferredAddrSpace, PredicatedAS);
1206
1207 // A value still uninitialized here is stuck in a cycle of uninitialized
1208 // values and carries no address space information. Lower it to flat so its
1209 // users join to flat, instead of being rewritten to reference an operand
1210 // that rewriteWithNewAddressSpaces() never converts.
1211 SmallVector<Value *, 4> Lowered;
1212 for (Value *V : Postorder) {
1213 ValueToAddrSpaceMapTy::iterator I = InferredAddrSpace.find(V);
1214 if (I->second == UninitializedAddressSpace) {
1215 I->second = FlatAddrSpace;
1216 Lowered.push_back(V);
1217 }
1218 }
1219
1220 for (Value *V : Lowered)
1221 enqueueUsers(*V, InferredAddrSpace, Worklist);
1222
1223 runToFixPoint(Worklist, InferredAddrSpace, PredicatedAS);
1224}
1225
1226unsigned
1227InferAddressSpacesImpl::getPredicatedAddrSpace(const Value &Ptr,
1228 const Value *UserCtx) const {
1229 const Instruction *UserCtxI = dyn_cast<Instruction>(UserCtx);
1230 if (!UserCtxI)
1232
1233 const Value *StrippedPtr = Ptr.stripInBoundsOffsets();
1234 for (auto &AssumeVH : AC.assumptionsFor(StrippedPtr)) {
1235 if (!AssumeVH)
1236 continue;
1237 CallInst *CI = cast<CallInst>(AssumeVH);
1238 if (!isValidAssumeForContext(CI, UserCtxI, DT))
1239 continue;
1240
1241 const Value *Ptr;
1242 unsigned AS;
1243 std::tie(Ptr, AS) = TTI->getPredicatedAddrSpace(CI->getArgOperand(0));
1244 if (Ptr)
1245 return AS;
1246 }
1247
1249}
1250
1251bool InferAddressSpacesImpl::updateAddressSpace(
1252 const Value &V, ValueToAddrSpaceMapTy &InferredAddrSpace,
1253 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1254 assert(InferredAddrSpace.count(&V));
1255
1256 LLVM_DEBUG(dbgs() << "Updating the address space of\n " << V << '\n');
1257
1258 // The new inferred address space equals the join of the address spaces
1259 // of all its pointer operands.
1260 unsigned NewAS = UninitializedAddressSpace;
1261
1262 // isAddressExpression should guarantee that V is an operator or an argument.
1264
1265 unsigned AS = TTI->getAssumedAddrSpace(&V);
1266 if (AS != UninitializedAddressSpace) {
1267 // Use the assumed address space directly.
1268 NewAS = AS;
1269 } else {
1270 // Otherwise, infer the address space from its pointer operands.
1271 SmallVector<Constant *, 2> ConstantPtrOps;
1272 SmallVector<Value *, 2> PtrOps = getPointerOperands(V, *DL, TTI);
1273 for (Value *PtrOperand : PtrOps) {
1274 auto I = InferredAddrSpace.find(PtrOperand);
1275 unsigned OperandAS;
1276 if (I == InferredAddrSpace.end()) {
1277 OperandAS = PtrOperand->getType()->getPointerAddressSpace();
1278 if (auto *C = dyn_cast<Constant>(PtrOperand);
1279 C && OperandAS == FlatAddrSpace) {
1280 // Defer joining the address space of constant pointer operands.
1281 ConstantPtrOps.push_back(C);
1282 continue;
1283 }
1284 if (OperandAS == FlatAddrSpace) {
1285 // Check AC for assumption dominating V.
1286 unsigned AS = getPredicatedAddrSpace(*PtrOperand, &V);
1287 if (AS != UninitializedAddressSpace) {
1289 << " deduce operand AS from the predicate addrspace "
1290 << AS << '\n');
1291 OperandAS = AS;
1292 // Record this use with the predicated AS.
1293 PredicatedAS[std::make_pair(&V, PtrOperand)] = OperandAS;
1294 }
1295 }
1296 } else
1297 OperandAS = I->second;
1298
1299 // join(flat, *) = flat. So we can break if NewAS is already flat.
1300 NewAS = joinAddressSpaces(NewAS, OperandAS);
1301 if (NewAS == FlatAddrSpace)
1302 break;
1303 }
1304
1305 if (NewAS != FlatAddrSpace && NewAS != UninitializedAddressSpace) {
1306 if (any_of(ConstantPtrOps, [=](Constant *C) {
1307 return !isSafeToCastConstAddrSpace(C, NewAS);
1308 }))
1309 NewAS = FlatAddrSpace;
1310 }
1311
1312 // operator(flat const, flat const, ...) -> flat
1313 if (NewAS == UninitializedAddressSpace &&
1314 PtrOps.size() == ConstantPtrOps.size())
1315 NewAS = FlatAddrSpace;
1316 }
1317
1318 unsigned OldAS = InferredAddrSpace.lookup(&V);
1319 assert(OldAS != FlatAddrSpace);
1320 if (OldAS == NewAS)
1321 return false;
1322
1323 // If any updates are made, grabs its users to the worklist because
1324 // their address spaces can also be possibly updated.
1325 LLVM_DEBUG(dbgs() << " to " << NewAS << '\n');
1326 InferredAddrSpace[&V] = NewAS;
1327 return true;
1328}
1329
1330/// Replace operand \p OpIdx in \p Inst, if the value is the same as \p OldVal
1331/// with \p NewVal.
1332static bool replaceOperandIfSame(Instruction *Inst, unsigned OpIdx,
1333 Value *OldVal, Value *NewVal) {
1334 Use &U = Inst->getOperandUse(OpIdx);
1335 if (U.get() == OldVal) {
1336 U.set(NewVal);
1337 return true;
1338 }
1339
1340 return false;
1341}
1342
1343template <typename InstrType>
1345 InstrType *MemInstr, Value *OldV,
1346 Value *NewV) {
1347 unsigned AddrSpace = NewV->getType()->getPointerAddressSpace();
1348 if (!MemInstr->isVolatile() || TTI.hasVolatileVariant(MemInstr, AddrSpace)) {
1349 return replaceOperandIfSame(MemInstr, InstrType::getPointerOperandIndex(),
1350 OldV, NewV);
1351 }
1352
1353 return false;
1354}
1355
1356/// If \p OldV is used as the pointer operand of a compatible memory operation
1357/// \p Inst, replaces the pointer operand with NewV.
1358///
1359/// This covers memory instructions with a single pointer operand that can have
1360/// its address space changed by simply mutating the use to a new value.
1361///
1362/// \p returns true the user replacement was made.
1364 User *Inst, Value *OldV, Value *NewV) {
1365 if (auto *LI = dyn_cast<LoadInst>(Inst))
1366 return replaceSimplePointerUse(TTI, LI, OldV, NewV);
1367
1368 if (auto *SI = dyn_cast<StoreInst>(Inst))
1369 return replaceSimplePointerUse(TTI, SI, OldV, NewV);
1370
1371 if (auto *RMW = dyn_cast<AtomicRMWInst>(Inst))
1372 return replaceSimplePointerUse(TTI, RMW, OldV, NewV);
1373
1374 if (auto *CmpX = dyn_cast<AtomicCmpXchgInst>(Inst))
1375 return replaceSimplePointerUse(TTI, CmpX, OldV, NewV);
1376
1377 return false;
1378}
1379
1380/// Update memory intrinsic uses that require more complex processing than
1381/// simple memory instructions. These require re-mangling and may have multiple
1382/// pointer operands.
1384 Value *NewV) {
1385 IRBuilder<> B(MI);
1386 if (auto *MSI = dyn_cast<MemSetInst>(MI)) {
1387 B.CreateMemSet(NewV, MSI->getValue(), MSI->getLength(), MSI->getDestAlign(),
1388 false, // isVolatile
1389 MI->getAAMetadata());
1390 } else if (auto *MTI = dyn_cast<MemTransferInst>(MI)) {
1391 Value *Src = MTI->getRawSource();
1392 Value *Dest = MTI->getRawDest();
1393
1394 // Be careful in case this is a self-to-self copy.
1395 if (Src == OldV)
1396 Src = NewV;
1397
1398 if (Dest == OldV)
1399 Dest = NewV;
1400
1401 if (auto *MCI = dyn_cast<MemCpyInst>(MTI)) {
1402 if (MCI->isForceInlined())
1403 B.CreateMemCpyInline(Dest, MTI->getDestAlign(), Src,
1404 MTI->getSourceAlign(), MTI->getLength(),
1405 false, // isVolatile
1406 MI->getAAMetadata());
1407 else
1408 B.CreateMemCpy(Dest, MTI->getDestAlign(), Src, MTI->getSourceAlign(),
1409 MTI->getLength(),
1410 false, // isVolatile
1411 MI->getAAMetadata());
1412 } else {
1414 B.CreateMemMove(Dest, MTI->getDestAlign(), Src, MTI->getSourceAlign(),
1415 MTI->getLength(),
1416 false, // isVolatile
1417 MI->getAAMetadata());
1418 }
1419 } else
1420 llvm_unreachable("unhandled MemIntrinsic");
1421
1422 MI->eraseFromParent();
1423 return true;
1424}
1425
1426// \p returns true if it is OK to change the address space of constant \p C with
1427// a ConstantExpr addrspacecast.
1428bool InferAddressSpacesImpl::isSafeToCastConstAddrSpace(Constant *C,
1429 unsigned NewAS) const {
1431
1432 unsigned SrcAS = C->getType()->getPointerAddressSpace();
1433 if (SrcAS == NewAS || isa<UndefValue>(C))
1434 return true;
1435
1436 // Prevent illegal casts between different non-flat address spaces.
1437 if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace)
1438 return false;
1439
1441 return true;
1442
1443 if (auto *Op = dyn_cast<Operator>(C)) {
1444 // If we already have a constant addrspacecast, it should be safe to cast it
1445 // off.
1446 if (Op->getOpcode() == Instruction::AddrSpaceCast)
1447 return isSafeToCastConstAddrSpace(cast<Constant>(Op->getOperand(0)),
1448 NewAS);
1449
1450 if (Op->getOpcode() == Instruction::IntToPtr &&
1451 Op->getType()->getPointerAddressSpace() == FlatAddrSpace)
1452 return true;
1453 }
1454
1455 return false;
1456}
1457
1460 User *CurUser = I->getUser();
1461 ++I;
1462
1463 while (I != End && I->getUser() == CurUser)
1464 ++I;
1465
1466 return I;
1467}
1468
1469void InferAddressSpacesImpl::performPointerReplacement(
1470 Value *V, Value *NewV, Use &U, ValueToValueMapTy &ValueWithNewAddrSpace,
1471 SmallVectorImpl<Instruction *> &DeadInstructions) const {
1472
1473 User *CurUser = U.getUser();
1474
1475 if (replaceIfSimplePointerUse(*TTI, CurUser, V, NewV))
1476 return;
1477
1478 // Skip if the current user is the new value itself.
1479 if (CurUser == NewV)
1480 return;
1481
1482 auto *CurUserI = dyn_cast<Instruction>(CurUser);
1483 if (!CurUserI || CurUserI->getFunction() != F)
1484 return;
1485
1486 // Handle more complex cases like intrinsic that need to be remangled.
1487 if (auto *MI = dyn_cast<MemIntrinsic>(CurUser)) {
1488 if (!MI->isVolatile() && handleMemIntrinsicPtrUse(MI, V, NewV))
1489 return;
1490 }
1491
1492 if (auto *II = dyn_cast<IntrinsicInst>(CurUser)) {
1493 if (rewriteIntrinsicOperands(II, V, NewV))
1494 return;
1495 }
1496
1497 if (ICmpInst *Cmp = dyn_cast<ICmpInst>(CurUserI)) {
1498 // If we can infer that both pointers are in the same addrspace,
1499 // transform e.g.
1500 // %cmp = icmp eq float* %p, %q
1501 // into
1502 // %cmp = icmp eq float addrspace(3)* %new_p, %new_q
1503
1504 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
1505 int SrcIdx = U.getOperandNo();
1506 int OtherIdx = (SrcIdx == 0) ? 1 : 0;
1507 Value *OtherSrc = Cmp->getOperand(OtherIdx);
1508
1509 if (Value *OtherNewV = ValueWithNewAddrSpace.lookup(OtherSrc)) {
1510 if (OtherNewV->getType()->getPointerAddressSpace() == NewAS) {
1511 Cmp->setOperand(OtherIdx, OtherNewV);
1512 Cmp->setOperand(SrcIdx, NewV);
1513 return;
1514 }
1515 }
1516
1517 // Even if the type mismatches, we can cast the constant.
1518 if (auto *KOtherSrc = dyn_cast<Constant>(OtherSrc)) {
1519 if (isSafeToCastConstAddrSpace(KOtherSrc, NewAS)) {
1520 Cmp->setOperand(SrcIdx, NewV);
1521 Cmp->setOperand(OtherIdx, ConstantExpr::getAddrSpaceCast(
1522 KOtherSrc, NewV->getType()));
1523 return;
1524 }
1525 }
1526 }
1527
1528 if (AddrSpaceCastInst *ASC = dyn_cast<AddrSpaceCastInst>(CurUserI)) {
1529 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
1530 if (ASC->getDestAddressSpace() == NewAS) {
1531 ASC->replaceAllUsesWith(NewV);
1532 DeadInstructions.push_back(ASC);
1533 return;
1534 }
1535 }
1536
1537 // Otherwise, replaces the use with flat(NewV).
1538 if (isa<Instruction>(V) || isa<Instruction>(NewV)) {
1539 // Don't create a copy of the original addrspacecast.
1540 if (U == V && isa<AddrSpaceCastInst>(V))
1541 return;
1542
1543 // Insert the addrspacecast after NewV.
1544 BasicBlock::iterator InsertPos;
1545 if (Instruction *NewVInst = dyn_cast<Instruction>(NewV))
1546 InsertPos = std::next(NewVInst->getIterator());
1547 else
1548 InsertPos = std::next(cast<Instruction>(V)->getIterator());
1549
1550 while (isa<PHINode>(InsertPos))
1551 ++InsertPos;
1552 // This instruction may contain multiple uses of V, update them all.
1553 CurUser->replaceUsesOfWith(
1554 V, new AddrSpaceCastInst(NewV, V->getType(), "", InsertPos));
1555 } else {
1556 CurUserI->replaceUsesOfWith(
1557 V, ConstantExpr::getAddrSpaceCast(cast<Constant>(NewV), V->getType()));
1558 }
1559}
1560
1561bool InferAddressSpacesImpl::rewriteWithNewAddressSpaces(
1562 ArrayRef<WeakTrackingVH> Postorder,
1563 const ValueToAddrSpaceMapTy &InferredAddrSpace,
1564 const PredicatedAddrSpaceMapTy &PredicatedAS) const {
1565 // For each address expression to be modified, creates a clone of it with its
1566 // pointer operands converted to the new address space. Since the pointer
1567 // operands are converted, the clone is naturally in the new address space by
1568 // construction.
1569 ValueToValueMapTy ValueWithNewAddrSpace;
1570 SmallVector<const Use *, 32> PoisonUsesToFix;
1571 for (Value *V : Postorder) {
1572 unsigned NewAddrSpace = InferredAddrSpace.lookup(V);
1573
1574 // In some degenerate cases (e.g. invalid IR in unreachable code), we may
1575 // not even infer the value to have its original address space.
1576 if (NewAddrSpace == UninitializedAddressSpace)
1577 continue;
1578
1579 if (V->getType()->getPointerAddressSpace() != NewAddrSpace) {
1580 Value *New =
1581 cloneValueWithNewAddressSpace(V, NewAddrSpace, ValueWithNewAddrSpace,
1582 PredicatedAS, &PoisonUsesToFix);
1583 if (New)
1584 ValueWithNewAddrSpace[V] = New;
1585 }
1586 }
1587
1588 if (ValueWithNewAddrSpace.empty())
1589 return false;
1590
1591 // Fixes all the poison uses generated by cloneInstructionWithNewAddressSpace.
1592 for (const Use *PoisonUse : PoisonUsesToFix) {
1593 User *V = PoisonUse->getUser();
1594 User *NewV = cast_or_null<User>(ValueWithNewAddrSpace.lookup(V));
1595 if (!NewV)
1596 continue;
1597
1598 unsigned OperandNo = PoisonUse->getOperandNo();
1599 assert(isa<PoisonValue>(NewV->getOperand(OperandNo)));
1600 unsigned NewAS =
1601 NewV->getOperand(OperandNo)->getType()->getPointerAddressSpace();
1603 *PoisonUse, NewAS, ValueWithNewAddrSpace, PredicatedAS, nullptr);
1604 NewV->setOperand(OperandNo, NewOp);
1605 }
1606
1607 SmallVector<Instruction *, 16> DeadInstructions;
1608 ValueToValueMapTy VMap;
1609 ValueMapper VMapper(VMap, RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
1610
1611 // Replaces the uses of the old address expressions with the new ones.
1612 for (const WeakTrackingVH &WVH : Postorder) {
1613 assert(WVH && "value was unexpectedly deleted");
1614 Value *V = WVH;
1615 Value *NewV = ValueWithNewAddrSpace.lookup(V);
1616 if (NewV == nullptr)
1617 continue;
1618
1619 LLVM_DEBUG(dbgs() << "Replacing the uses of " << *V << "\n with\n "
1620 << *NewV << '\n');
1621
1622 if (Constant *C = dyn_cast<Constant>(V)) {
1623 Constant *Replace =
1625 if (C != Replace) {
1626 LLVM_DEBUG(dbgs() << "Inserting replacement const cast: " << Replace
1627 << ": " << *Replace << '\n');
1628 SmallVector<User *, 16> WorkList;
1629 for (User *U : make_early_inc_range(C->users())) {
1630 if (auto *I = dyn_cast<Instruction>(U)) {
1631 if (I->getFunction() == F)
1632 I->replaceUsesOfWith(C, Replace);
1633 } else {
1634 WorkList.append(U->user_begin(), U->user_end());
1635 }
1636 }
1637 if (!WorkList.empty()) {
1638 VMap[C] = Replace;
1639 DenseSet<User *> Visited{WorkList.begin(), WorkList.end()};
1640 while (!WorkList.empty()) {
1641 User *U = WorkList.pop_back_val();
1642 if (auto *I = dyn_cast<Instruction>(U)) {
1643 if (I->getFunction() == F)
1644 VMapper.remapInstruction(*I);
1645 continue;
1646 }
1647 for (User *U2 : U->users())
1648 if (Visited.insert(U2).second)
1649 WorkList.push_back(U2);
1650 }
1651 }
1652 V = Replace;
1653 }
1654 }
1655
1656 Value::use_iterator I, E, Next;
1657 for (I = V->use_begin(), E = V->use_end(); I != E;) {
1658 Use &U = *I;
1659
1660 // Some users may see the same pointer operand in multiple operands. Skip
1661 // to the next instruction.
1662 I = skipToNextUser(I, E);
1663
1664 performPointerReplacement(V, NewV, U, ValueWithNewAddrSpace,
1665 DeadInstructions);
1666 }
1667
1668 if (V->use_empty()) {
1669 if (Instruction *I = dyn_cast<Instruction>(V))
1670 DeadInstructions.push_back(I);
1671 }
1672 }
1673
1674 // Deleting one instruction may recursively delete another queued
1675 // instruction. Create handles before the first deletion so overlapping
1676 // entries are nulled instead of leaving dangling pointers.
1677 auto DeadInstructionHandles =
1678 to_vector_of<WeakTrackingVH, 16>(DeadInstructions);
1679 RecursivelyDeleteTriviallyDeadInstructions(DeadInstructionHandles);
1680
1681 return true;
1682}
1683
1684bool InferAddressSpaces::runOnFunction(Function &F) {
1685 if (skipFunction(F))
1686 return false;
1687
1688 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
1689 DominatorTree *DT = DTWP ? &DTWP->getDomTree() : nullptr;
1690 return InferAddressSpacesImpl(
1691 getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F), DT,
1692 &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F),
1693 FlatAddrSpace, /*AssumeDefaultIsFlatAddressSpace=*/false)
1694 .run(F);
1695}
1696
1698 return new InferAddressSpaces(AddressSpace);
1699}
1700
1702 bool AssumeDefaultIsFlatAddressSpace)
1703 : FlatAddrSpace(UninitializedAddressSpace),
1704 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
1706 unsigned AddressSpace, bool AssumeDefaultIsFlatAddressSpace)
1707 : FlatAddrSpace(AddressSpace),
1708 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
1709
1712 bool Changed =
1713 InferAddressSpacesImpl(AM.getResult<AssumptionAnalysis>(F),
1715 &AM.getResult<TargetIRAnalysis>(F), FlatAddrSpace,
1716 AssumeDefaultIsFlatAddressSpace)
1717 .run(F);
1718 if (Changed) {
1721 return PA;
1722 }
1723 return PreservedAnalyses::all();
1724}
1725
1727 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
1728 static_cast<PassInfoMixin<InferAddressSpacesPass> *>(this)->printPipeline(
1729 OS, MapClassName2PassName);
1730 if (AssumeDefaultIsFlatAddressSpace)
1731 OS << "<assume-default-is-flat-addrspace>";
1732}
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:352
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
if(PassOpts->AAPipeline)
#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:278
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:794
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:828
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:314
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:2918
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:828
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:712
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