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 the generic 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 return true;
570 }
571 }
572}
573
574void InferAddressSpacesImpl::collectRewritableIntrinsicOperands(
575 IntrinsicInst *II, PostorderStackTy &PostorderStack,
576 DenseSet<Value *> &Visited) const {
577 auto IID = II->getIntrinsicID();
578 switch (IID) {
579 case Intrinsic::ptrmask:
580 case Intrinsic::objectsize:
581 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(0),
582 PostorderStack, Visited);
583 break;
584 case Intrinsic::is_constant: {
585 Value *Ptr = II->getArgOperand(0);
586 if (Ptr->getType()->isPtrOrPtrVectorTy()) {
587 appendsFlatAddressExpressionToPostorderStack(Ptr, PostorderStack,
588 Visited);
589 }
590
591 break;
592 }
593 case Intrinsic::masked_load:
594 case Intrinsic::masked_gather:
595 case Intrinsic::prefetch:
596 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(0),
597 PostorderStack, Visited);
598 break;
599 case Intrinsic::masked_store:
600 case Intrinsic::masked_scatter:
601 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(1),
602 PostorderStack, Visited);
603 break;
604 case Intrinsic::fake_use: {
605 for (Value *Op : II->operands()) {
606 if (Op->getType()->isPtrOrPtrVectorTy()) {
607 appendsFlatAddressExpressionToPostorderStack(Op, PostorderStack,
608 Visited);
609 }
610 }
611
612 break;
613 }
614 case Intrinsic::lifetime_start:
615 case Intrinsic::lifetime_end: {
616 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(0),
617 PostorderStack, Visited);
618 break;
619 }
620 default:
621 SmallVector<int, 2> OpIndexes;
622 if (TTI->collectFlatAddressOperands(OpIndexes, IID)) {
623 for (int Idx : OpIndexes) {
624 appendsFlatAddressExpressionToPostorderStack(II->getArgOperand(Idx),
625 PostorderStack, Visited);
626 }
627 }
628 break;
629 }
630}
631
632// Returns all flat address expressions in function F. The elements are
633// If V is an unvisited flat address expression, appends V to PostorderStack
634// and marks it as visited.
635void InferAddressSpacesImpl::appendsFlatAddressExpressionToPostorderStack(
636 Value *V, PostorderStackTy &PostorderStack,
637 DenseSet<Value *> &Visited) const {
638 assert(V->getType()->isPtrOrPtrVectorTy());
639
640 // Generic addressing expressions may be hidden in nested constant
641 // expressions.
642 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
643 // TODO: Look in non-address parts, like icmp operands.
644 if (isAddressExpression(*CE, *DL, TTI) && Visited.insert(CE).second)
645 PostorderStack.emplace_back(CE, false);
646
647 return;
648 }
649
650 if (V->getType()->getPointerAddressSpace() == FlatAddrSpace &&
651 isAddressExpression(*V, *DL, TTI)) {
652 if (Visited.insert(V).second) {
653 PostorderStack.emplace_back(V, false);
654
655 if (auto *Op = dyn_cast<Operator>(V))
656 for (auto &O : Op->operands())
657 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(O))
658 if (isAddressExpression(*CE, *DL, TTI) && Visited.insert(CE).second)
659 PostorderStack.emplace_back(CE, false);
660 }
661 }
662}
663
664// Returns all flat address expressions in function F. The elements are ordered
665// in postorder.
666std::vector<WeakTrackingVH>
667InferAddressSpacesImpl::collectFlatAddressExpressions(Function &F) const {
668 // This function implements a non-recursive postorder traversal of a partial
669 // use-def graph of function F.
670 PostorderStackTy PostorderStack;
671 // The set of visited expressions.
672 DenseSet<Value *> Visited;
673
674 auto PushPtrOperand = [&](Value *Ptr) {
675 appendsFlatAddressExpressionToPostorderStack(Ptr, PostorderStack, Visited);
676 };
677
678 // Look at operations that may be interesting accelerate by moving to a known
679 // address space. We aim at generating after loads and stores, but pure
680 // addressing calculations may also be faster.
681 for (Instruction &I : instructions(F)) {
682 if (auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {
683 PushPtrOperand(GEP->getPointerOperand());
684 } else if (auto *LI = dyn_cast<LoadInst>(&I))
685 PushPtrOperand(LI->getPointerOperand());
686 else if (auto *SI = dyn_cast<StoreInst>(&I))
687 PushPtrOperand(SI->getPointerOperand());
688 else if (auto *RMW = dyn_cast<AtomicRMWInst>(&I))
689 PushPtrOperand(RMW->getPointerOperand());
690 else if (auto *CmpX = dyn_cast<AtomicCmpXchgInst>(&I))
691 PushPtrOperand(CmpX->getPointerOperand());
692 else if (auto *MI = dyn_cast<MemIntrinsic>(&I)) {
693 // For memset/memcpy/memmove, any pointer operand can be replaced.
694 PushPtrOperand(MI->getRawDest());
695
696 // Handle 2nd operand for memcpy/memmove.
697 if (auto *MTI = dyn_cast<MemTransferInst>(MI))
698 PushPtrOperand(MTI->getRawSource());
699 } else if (auto *II = dyn_cast<IntrinsicInst>(&I))
700 collectRewritableIntrinsicOperands(II, PostorderStack, Visited);
701 else if (ICmpInst *Cmp = dyn_cast<ICmpInst>(&I)) {
702 if (Cmp->getOperand(0)->getType()->isPtrOrPtrVectorTy()) {
703 PushPtrOperand(Cmp->getOperand(0));
704 PushPtrOperand(Cmp->getOperand(1));
705 }
706 } else if (auto *ASC = dyn_cast<AddrSpaceCastInst>(&I)) {
707 PushPtrOperand(ASC->getPointerOperand());
708 } else if (auto *I2P = dyn_cast<IntToPtrInst>(&I)) {
710 PushPtrOperand(cast<Operator>(I2P->getOperand(0))->getOperand(0));
711 else if (isSafeToCastIntToPtrAddrSpace(cast<Operator>(I2P)))
712 PushPtrOperand(getIntToPtrPointerOperand(cast<Operator>(I2P)));
713 } else if (auto *RI = dyn_cast<ReturnInst>(&I)) {
714 if (auto *RV = RI->getReturnValue();
715 RV && RV->getType()->isPtrOrPtrVectorTy())
716 PushPtrOperand(RV);
717 }
718 }
719
720 std::vector<WeakTrackingVH> Postorder; // The resultant postorder.
721 while (!PostorderStack.empty()) {
722 Value *TopVal = PostorderStack.back().getPointer();
723 // If the operands of the expression on the top are already explored,
724 // adds that expression to the resultant postorder.
725 if (PostorderStack.back().getInt()) {
726 if (TopVal->getType()->getPointerAddressSpace() == FlatAddrSpace)
727 Postorder.push_back(TopVal);
728 PostorderStack.pop_back();
729 continue;
730 }
731 // Otherwise, adds its operands to the stack and explores them.
732 PostorderStack.back().setInt(true);
733 // Skip values with an assumed address space.
735 for (Value *PtrOperand : getPointerOperands(*TopVal, *DL, TTI)) {
736 appendsFlatAddressExpressionToPostorderStack(PtrOperand, PostorderStack,
737 Visited);
738 }
739 }
740 }
741 return Postorder;
742}
743
744// Inserts an addrspacecast for a phi node operand, handling the proper
745// insertion position based on the operand type.
747 Value *Operand) {
748 auto InsertBefore = [NewI](auto It) {
749 NewI->insertBefore(It);
750 NewI->setDebugLoc(It->getDebugLoc());
751 return NewI;
752 };
753
754 if (auto *Arg = dyn_cast<Argument>(Operand)) {
755 // For arguments, insert the cast at the beginning of entry block.
756 // Consider inserting at the dominating block for better placement.
757 Function *F = Arg->getParent();
758 auto InsertI = F->getEntryBlock().getFirstNonPHIIt();
759 return InsertBefore(InsertI);
760 }
761
762 // No check for Constant here, as constants are already handled.
763 assert(isa<Instruction>(Operand));
764
765 Instruction *OpInst = cast<Instruction>(Operand);
766 if (LLVM_UNLIKELY(OpInst->getOpcode() == Instruction::PHI)) {
767 // If the operand is defined by another PHI node, insert after the first
768 // non-PHI instruction at the corresponding basic block.
769 auto InsertI = OpInst->getParent()->getFirstNonPHIIt();
770 return InsertBefore(InsertI);
771 }
772
773 // Otherwise, insert immediately after the operand definition.
774 NewI->insertAfter(OpInst->getIterator());
775 NewI->setDebugLoc(OpInst->getDebugLoc());
776 return NewI;
777}
778
779// A helper function for cloneInstructionWithNewAddressSpace. Returns the clone
780// of OperandUse.get() in the new address space. If the clone is not ready yet,
781// returns poison in the new address space as a placeholder.
783 const Use &OperandUse, unsigned NewAddrSpace,
784 const ValueToValueMapTy &ValueWithNewAddrSpace,
785 const PredicatedAddrSpaceMapTy &PredicatedAS,
786 SmallVectorImpl<const Use *> *PoisonUsesToFix) {
787 Value *Operand = OperandUse.get();
788
789 Type *NewPtrTy = getPtrOrVecOfPtrsWithNewAS(Operand->getType(), NewAddrSpace);
790
791 if (Constant *C = dyn_cast<Constant>(Operand))
792 return ConstantExpr::getAddrSpaceCast(C, NewPtrTy);
793
794 if (Value *NewOperand = ValueWithNewAddrSpace.lookup(Operand))
795 return NewOperand;
796
797 Instruction *Inst = cast<Instruction>(OperandUse.getUser());
798 auto I = PredicatedAS.find(std::make_pair(Inst, Operand));
799 if (I != PredicatedAS.end()) {
800 // Insert an addrspacecast on that operand before the user.
801 unsigned NewAS = I->second;
802 Type *NewPtrTy = getPtrOrVecOfPtrsWithNewAS(Operand->getType(), NewAS);
803 auto *NewI = new AddrSpaceCastInst(Operand, NewPtrTy);
804
805 if (LLVM_UNLIKELY(Inst->getOpcode() == Instruction::PHI))
806 return phiNodeOperandWithNewAddressSpace(NewI, Operand);
807
808 NewI->insertBefore(Inst->getIterator());
809 NewI->setDebugLoc(Inst->getDebugLoc());
810 return NewI;
811 }
812
813 PoisonUsesToFix->push_back(&OperandUse);
814 return PoisonValue::get(NewPtrTy);
815}
816
817// A helper function for cloneInstructionWithNewAddressSpace. Handles the
818// conversion of a ptrmask intrinsic instruction.
819Value *InferAddressSpacesImpl::clonePtrMaskWithNewAddressSpace(
820 IntrinsicInst *I, unsigned NewAddrSpace,
821 const ValueToValueMapTy &ValueWithNewAddrSpace,
822 const PredicatedAddrSpaceMapTy &PredicatedAS,
823 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
824 const Use &PtrOpUse = I->getArgOperandUse(0);
825 unsigned OldAddrSpace = PtrOpUse->getType()->getPointerAddressSpace();
826 Value *MaskOp = I->getArgOperand(1);
827 Type *MaskTy = MaskOp->getType();
828
829 KnownBits OldPtrBits{DL->getPointerSizeInBits(OldAddrSpace)};
830 KnownBits NewPtrBits{DL->getPointerSizeInBits(NewAddrSpace)};
831 if (!TTI->isNoopAddrSpaceCast(OldAddrSpace, NewAddrSpace)) {
832 std::tie(OldPtrBits, NewPtrBits) =
833 TTI->computeKnownBitsAddrSpaceCast(NewAddrSpace, *PtrOpUse.get());
834 }
835
836 // If the pointers in both addrspaces have a bitwise representation and if the
837 // representation of the new pointer is smaller (fewer bits) than the old one,
838 // check if the mask is applicable to the ptr in the new addrspace. Any
839 // masking only clearing the low bits will also apply in the new addrspace
840 // Note: checking if the mask clears high bits is not sufficient as those
841 // might have already been 0 in the old ptr.
842 if (OldPtrBits.getBitWidth() > NewPtrBits.getBitWidth()) {
843 KnownBits MaskBits =
844 computeKnownBits(MaskOp, *DL, /*AssumptionCache=*/nullptr, I);
845 // Set all unknown bits of the old ptr to 1, so that we are conservative in
846 // checking which bits are cleared by the mask.
847 OldPtrBits.One |= ~OldPtrBits.Zero;
848 // Check which bits are cleared by the mask in the old ptr.
849 KnownBits ClearedBits = KnownBits::sub(OldPtrBits, OldPtrBits & MaskBits);
850
851 // If the mask isn't applicable to the new ptr, leave the ptrmask as-is and
852 // insert an addrspacecast after it.
853 if (ClearedBits.countMaxActiveBits() > NewPtrBits.countMaxActiveBits()) {
854 std::optional<BasicBlock::iterator> InsertPoint =
855 I->getInsertionPointAfterDef();
856 assert(InsertPoint && "insertion after ptrmask should be possible");
857 Type *NewPtrType = getPtrOrVecOfPtrsWithNewAS(I->getType(), NewAddrSpace);
858 Instruction *AddrSpaceCast =
859 new AddrSpaceCastInst(I, NewPtrType, "", *InsertPoint);
860 AddrSpaceCast->setDebugLoc(I->getDebugLoc());
861 return AddrSpaceCast;
862 }
863 }
864
865 IRBuilder<> B(I);
866 if (NewPtrBits.getBitWidth() < MaskTy->getScalarSizeInBits()) {
867 MaskTy = MaskTy->getWithNewBitWidth(NewPtrBits.getBitWidth());
868 MaskOp = B.CreateTrunc(MaskOp, MaskTy);
869 }
871 PtrOpUse, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS,
872 PoisonUsesToFix);
873 return B.CreateIntrinsic(Intrinsic::ptrmask, {NewPtr->getType(), MaskTy},
874 {NewPtr, MaskOp});
875}
876
877// Returns a clone of `I` with its operands converted to those specified in
878// ValueWithNewAddrSpace. Due to potential cycles in the data flow graph, an
879// operand whose address space needs to be modified might not exist in
880// ValueWithNewAddrSpace. In that case, uses poison as a placeholder operand and
881// adds that operand use to PoisonUsesToFix so that caller can fix them later.
882//
883// Note that we do not necessarily clone `I`, e.g., if it is an addrspacecast
884// from a pointer whose type already matches. Therefore, this function returns a
885// Value* instead of an Instruction*.
886Value *InferAddressSpacesImpl::cloneInstructionWithNewAddressSpace(
887 Instruction *I, unsigned NewAddrSpace,
888 const ValueToValueMapTy &ValueWithNewAddrSpace,
889 const PredicatedAddrSpaceMapTy &PredicatedAS,
890 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
891 Type *NewPtrType = getPtrOrVecOfPtrsWithNewAS(I->getType(), NewAddrSpace);
892
893 if (I->getOpcode() == Instruction::AddrSpaceCast) {
894 Value *Src = I->getOperand(0);
895 // Because `I` is flat, the source address space must be specific.
896 // Therefore, the inferred address space must be the source space, according
897 // to our algorithm.
898 assert(Src->getType()->getPointerAddressSpace() == NewAddrSpace);
899 return Src;
900 }
901
902 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
903 // Technically the intrinsic ID is a pointer typed argument, so specially
904 // handle calls early.
905 assert(II->getIntrinsicID() == Intrinsic::ptrmask);
906 return clonePtrMaskWithNewAddressSpace(
907 II, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS, PoisonUsesToFix);
908 }
909
910 unsigned AS = TTI->getAssumedAddrSpace(I);
911 if (AS != UninitializedAddressSpace) {
912 // For the assumed address space, insert an `addrspacecast` to make that
913 // explicit.
914 Type *NewPtrTy = getPtrOrVecOfPtrsWithNewAS(I->getType(), AS);
915 auto *NewI = new AddrSpaceCastInst(I, NewPtrTy);
916 NewI->insertAfter(I->getIterator());
917 NewI->setDebugLoc(I->getDebugLoc());
918 return NewI;
919 }
920
921 // Computes the converted pointer operands.
922 SmallVector<Value *, 4> NewPointerOperands;
923 for (const Use &OperandUse : I->operands()) {
924 if (!OperandUse.get()->getType()->isPtrOrPtrVectorTy())
925 NewPointerOperands.push_back(nullptr);
926 else
928 OperandUse, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS,
929 PoisonUsesToFix));
930 }
931
932 switch (I->getOpcode()) {
933 case Instruction::BitCast:
934 return new BitCastInst(NewPointerOperands[0], NewPtrType);
935 case Instruction::PHI: {
936 assert(I->getType()->isPtrOrPtrVectorTy());
937 PHINode *PHI = cast<PHINode>(I);
938 PHINode *NewPHI = PHINode::Create(NewPtrType, PHI->getNumIncomingValues());
939 for (unsigned Index = 0; Index < PHI->getNumIncomingValues(); ++Index) {
940 unsigned OperandNo = PHINode::getOperandNumForIncomingValue(Index);
941 NewPHI->addIncoming(NewPointerOperands[OperandNo],
942 PHI->getIncomingBlock(Index));
943 }
944 return NewPHI;
945 }
946 case Instruction::GetElementPtr: {
947 GetElementPtrInst *GEP = cast<GetElementPtrInst>(I);
948 GetElementPtrInst *NewGEP = GetElementPtrInst::Create(
949 GEP->getSourceElementType(), NewPointerOperands[0],
950 SmallVector<Value *, 4>(GEP->indices()));
951 NewGEP->setIsInBounds(GEP->isInBounds());
952 return NewGEP;
953 }
954 case Instruction::Select:
955 assert(I->getType()->isPtrOrPtrVectorTy());
956 return SelectInst::Create(I->getOperand(0), NewPointerOperands[1],
957 NewPointerOperands[2], "", nullptr, I);
958 case Instruction::IntToPtr: {
960 Value *Src = cast<Operator>(I->getOperand(0))->getOperand(0);
961 if (Src->getType() == NewPtrType)
962 return Src;
963
964 // If we had a no-op inttoptr/ptrtoint pair, we may still have inferred a
965 // source address space from a generic pointer source need to insert a
966 // cast back.
967 return new AddrSpaceCastInst(Src, NewPtrType);
968 }
969 assert(isSafeToCastIntToPtrAddrSpace(cast<Operator>(I)));
970 AddrSpaceCastInst *AsCast = new AddrSpaceCastInst(I, NewPtrType);
971 AsCast->insertAfter(I);
972 return AsCast;
973 }
974 default:
975 llvm_unreachable("Unexpected opcode");
976 }
977}
978
979// Similar to cloneInstructionWithNewAddressSpace, returns a clone of the
980// constant expression `CE` with its operands replaced as specified in
981// ValueWithNewAddrSpace.
982Value *InferAddressSpacesImpl::cloneConstantExprWithNewAddressSpace(
983 ConstantExpr *CE, unsigned NewAddrSpace,
984 const ValueToValueMapTy &ValueWithNewAddrSpace, const DataLayout *DL,
985 const TargetTransformInfo *TTI) const {
987 CE->getType()->isPtrOrPtrVectorTy()
988 ? getPtrOrVecOfPtrsWithNewAS(CE->getType(), NewAddrSpace)
989 : CE->getType();
990
991 if (CE->getOpcode() == Instruction::AddrSpaceCast) {
992 // Because CE is flat, the source address space must be specific.
993 // Therefore, the inferred address space must be the source space according
994 // to our algorithm.
995 assert(CE->getOperand(0)->getType()->getPointerAddressSpace() ==
996 NewAddrSpace);
997 return CE->getOperand(0);
998 }
999
1000 if (CE->getOpcode() == Instruction::BitCast) {
1001 if (Value *NewOperand = ValueWithNewAddrSpace.lookup(CE->getOperand(0)))
1002 return ConstantExpr::getBitCast(cast<Constant>(NewOperand), TargetType);
1003 return ConstantExpr::getAddrSpaceCast(CE, TargetType);
1004 }
1005
1006 if (CE->getOpcode() == Instruction::IntToPtr) {
1007 if (isNoopPtrIntCastPair(cast<Operator>(CE), *DL, TTI)) {
1008 Constant *Src = cast<ConstantExpr>(CE->getOperand(0))->getOperand(0);
1009 assert(Src->getType()->getPointerAddressSpace() == NewAddrSpace);
1010 return Src;
1011 }
1012 assert(isSafeToCastIntToPtrAddrSpace(cast<Operator>(CE)));
1013 return ConstantExpr::getAddrSpaceCast(CE, TargetType);
1014 }
1015
1016 // Computes the operands of the new constant expression.
1017 bool IsNew = false;
1018 SmallVector<Constant *, 4> NewOperands;
1019 for (unsigned Index = 0; Index < CE->getNumOperands(); ++Index) {
1020 Constant *Operand = CE->getOperand(Index);
1021 // If the address space of `Operand` needs to be modified, the new operand
1022 // with the new address space should already be in ValueWithNewAddrSpace
1023 // because (1) the constant expressions we consider (i.e. addrspacecast,
1024 // bitcast, and getelementptr) do not incur cycles in the data flow graph
1025 // and (2) this function is called on constant expressions in postorder.
1026 if (Value *NewOperand = ValueWithNewAddrSpace.lookup(Operand)) {
1027 IsNew = true;
1028 NewOperands.push_back(cast<Constant>(NewOperand));
1029 continue;
1030 }
1031 if (auto *CExpr = dyn_cast<ConstantExpr>(Operand))
1032 if (Value *NewOperand = cloneConstantExprWithNewAddressSpace(
1033 CExpr, NewAddrSpace, ValueWithNewAddrSpace, DL, TTI)) {
1034 IsNew = true;
1035 NewOperands.push_back(cast<Constant>(NewOperand));
1036 continue;
1037 }
1038 // Otherwise, reuses the old operand.
1039 NewOperands.push_back(Operand);
1040 }
1041
1042 // If !IsNew, we will replace the Value with itself. However, replaced values
1043 // are assumed to wrapped in an addrspacecast cast later so drop it now.
1044 if (!IsNew)
1045 return nullptr;
1046
1047 if (CE->getOpcode() == Instruction::GetElementPtr) {
1048 // Needs to specify the source type while constructing a getelementptr
1049 // constant expression.
1050 return CE->getWithOperands(NewOperands, TargetType, /*OnlyIfReduced=*/false,
1051 cast<GEPOperator>(CE)->getSourceElementType());
1052 }
1053
1054 return CE->getWithOperands(NewOperands, TargetType);
1055}
1056
1057// Returns a clone of the value `V`, with its operands replaced as specified in
1058// ValueWithNewAddrSpace. This function is called on every flat address
1059// expression whose address space needs to be modified, in postorder.
1060//
1061// See cloneInstructionWithNewAddressSpace for the meaning of PoisonUsesToFix.
1062Value *InferAddressSpacesImpl::cloneValueWithNewAddressSpace(
1063 Value *V, unsigned NewAddrSpace,
1064 const ValueToValueMapTy &ValueWithNewAddrSpace,
1065 const PredicatedAddrSpaceMapTy &PredicatedAS,
1066 SmallVectorImpl<const Use *> *PoisonUsesToFix) const {
1067 // All values in Postorder are flat address expressions.
1068 assert(V->getType()->getPointerAddressSpace() == FlatAddrSpace &&
1069 isAddressExpression(*V, *DL, TTI));
1070
1071 if (auto *Arg = dyn_cast<Argument>(V)) {
1072 // Arguments are address space casted in the function body, as we do not
1073 // want to change the function signature.
1074 Function *F = Arg->getParent();
1075 BasicBlock::iterator Insert = F->getEntryBlock().getFirstNonPHIIt();
1076
1077 Type *NewPtrTy = PointerType::get(Arg->getContext(), NewAddrSpace);
1078 auto *NewI = new AddrSpaceCastInst(Arg, NewPtrTy);
1079 NewI->insertBefore(Insert);
1080 return NewI;
1081 }
1082
1083 if (Instruction *I = dyn_cast<Instruction>(V)) {
1084 Value *NewV = cloneInstructionWithNewAddressSpace(
1085 I, NewAddrSpace, ValueWithNewAddrSpace, PredicatedAS, PoisonUsesToFix);
1086 if (Instruction *NewI = dyn_cast_or_null<Instruction>(NewV)) {
1087 if (NewI->getParent() == nullptr) {
1088 NewI->insertBefore(I->getIterator());
1089 NewI->takeName(I);
1090 NewI->setDebugLoc(I->getDebugLoc());
1091 }
1092 }
1093 return NewV;
1094 }
1095
1096 return cloneConstantExprWithNewAddressSpace(
1097 cast<ConstantExpr>(V), NewAddrSpace, ValueWithNewAddrSpace, DL, TTI);
1098}
1099
1100// Defines the join operation on the address space lattice (see the file header
1101// comments).
1102unsigned InferAddressSpacesImpl::joinAddressSpaces(unsigned AS1,
1103 unsigned AS2) const {
1104 if (AS1 == FlatAddrSpace || AS2 == FlatAddrSpace)
1105 return FlatAddrSpace;
1106
1107 if (AS1 == UninitializedAddressSpace)
1108 return AS2;
1109 if (AS2 == UninitializedAddressSpace)
1110 return AS1;
1111
1112 // The join of two different specific address spaces is flat.
1113 return (AS1 == AS2) ? AS1 : FlatAddrSpace;
1114}
1115
1116bool InferAddressSpacesImpl::run(Function &CurFn) {
1117 F = &CurFn;
1118 DL = &F->getDataLayout();
1119 PtrIntCastPairs.clear();
1120
1121 if (AssumeDefaultIsFlatAddressSpace)
1122 FlatAddrSpace = 0;
1123
1124 if (FlatAddrSpace == UninitializedAddressSpace) {
1126 if (FlatAddrSpace == UninitializedAddressSpace)
1127 return false;
1128 }
1129
1130 collectIntToPtrPointerOperand();
1131 // Collects all flat address expressions in postorder.
1132 std::vector<WeakTrackingVH> Postorder = collectFlatAddressExpressions(*F);
1133
1134 // Runs a data-flow analysis to refine the address spaces of every expression
1135 // in Postorder.
1136 ValueToAddrSpaceMapTy InferredAddrSpace;
1137 PredicatedAddrSpaceMapTy PredicatedAS;
1138 inferAddressSpaces(Postorder, InferredAddrSpace, PredicatedAS);
1139
1140 // Changes the address spaces of the flat address expressions who are inferred
1141 // to point to a specific address space.
1142 return rewriteWithNewAddressSpaces(Postorder, InferredAddrSpace,
1143 PredicatedAS);
1144}
1145
1146void InferAddressSpacesImpl::enqueueUsers(
1147 Value &V, const ValueToAddrSpaceMapTy &InferredAddrSpace,
1148 SetVector<Value *> &Worklist) const {
1149 for (Value *User : V.users()) {
1150 // Skip if User is already in the worklist.
1151 if (Worklist.count(User))
1152 continue;
1153
1154 ValueToAddrSpaceMapTy::const_iterator Pos = InferredAddrSpace.find(User);
1155 // Our algorithm only updates the address spaces of flat address
1156 // expressions, which are those in InferredAddrSpace.
1157 if (Pos == InferredAddrSpace.end())
1158 continue;
1159
1160 // Function updateAddressSpace moves the address space down a lattice path.
1161 // Therefore, nothing to do if User is already inferred as flat (the bottom
1162 // element in the lattice).
1163 if (Pos->second == FlatAddrSpace)
1164 continue;
1165
1166 Worklist.insert(User);
1167 }
1168}
1169
1170void InferAddressSpacesImpl::runToFixPoint(
1171 SetVector<Value *> &Worklist, ValueToAddrSpaceMapTy &InferredAddrSpace,
1172 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1173 while (!Worklist.empty()) {
1174 Value *V = Worklist.pop_back_val();
1175
1176 // Try to update the address space of the stack top according to the
1177 // address spaces of its operands.
1178 if (!updateAddressSpace(*V, InferredAddrSpace, PredicatedAS))
1179 continue;
1180
1181 enqueueUsers(*V, InferredAddrSpace, Worklist);
1182 }
1183}
1184
1185// Constants need to be tracked through RAUW to handle cases with nested
1186// constant expressions, so wrap values in WeakTrackingVH.
1187void InferAddressSpacesImpl::inferAddressSpaces(
1188 ArrayRef<WeakTrackingVH> Postorder,
1189 ValueToAddrSpaceMapTy &InferredAddrSpace,
1190 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1191 SetVector<Value *> Worklist(llvm::from_range, Postorder);
1192 // Initially, all expressions are in the uninitialized address space.
1193 for (Value *V : Postorder)
1194 InferredAddrSpace[V] = UninitializedAddressSpace;
1195
1196 runToFixPoint(Worklist, InferredAddrSpace, PredicatedAS);
1197
1198 // A value still uninitialized here is stuck in a cycle of uninitialized
1199 // values and carries no address space information. Lower it to flat so its
1200 // users join to flat, instead of being rewritten to reference an operand
1201 // that rewriteWithNewAddressSpaces() never converts.
1202 SmallVector<Value *, 4> Lowered;
1203 for (Value *V : Postorder) {
1204 ValueToAddrSpaceMapTy::iterator I = InferredAddrSpace.find(V);
1205 if (I->second == UninitializedAddressSpace) {
1206 I->second = FlatAddrSpace;
1207 Lowered.push_back(V);
1208 }
1209 }
1210
1211 for (Value *V : Lowered)
1212 enqueueUsers(*V, InferredAddrSpace, Worklist);
1213
1214 runToFixPoint(Worklist, InferredAddrSpace, PredicatedAS);
1215}
1216
1217unsigned
1218InferAddressSpacesImpl::getPredicatedAddrSpace(const Value &Ptr,
1219 const Value *UserCtx) const {
1220 const Instruction *UserCtxI = dyn_cast<Instruction>(UserCtx);
1221 if (!UserCtxI)
1223
1224 const Value *StrippedPtr = Ptr.stripInBoundsOffsets();
1225 for (auto &AssumeVH : AC.assumptionsFor(StrippedPtr)) {
1226 if (!AssumeVH)
1227 continue;
1228 CallInst *CI = cast<CallInst>(AssumeVH);
1229 if (!isValidAssumeForContext(CI, UserCtxI, DT))
1230 continue;
1231
1232 const Value *Ptr;
1233 unsigned AS;
1234 std::tie(Ptr, AS) = TTI->getPredicatedAddrSpace(CI->getArgOperand(0));
1235 if (Ptr)
1236 return AS;
1237 }
1238
1240}
1241
1242bool InferAddressSpacesImpl::updateAddressSpace(
1243 const Value &V, ValueToAddrSpaceMapTy &InferredAddrSpace,
1244 PredicatedAddrSpaceMapTy &PredicatedAS) const {
1245 assert(InferredAddrSpace.count(&V));
1246
1247 LLVM_DEBUG(dbgs() << "Updating the address space of\n " << V << '\n');
1248
1249 // The new inferred address space equals the join of the address spaces
1250 // of all its pointer operands.
1251 unsigned NewAS = UninitializedAddressSpace;
1252
1253 // isAddressExpression should guarantee that V is an operator or an argument.
1255
1256 unsigned AS = TTI->getAssumedAddrSpace(&V);
1257 if (AS != UninitializedAddressSpace) {
1258 // Use the assumed address space directly.
1259 NewAS = AS;
1260 } else {
1261 // Otherwise, infer the address space from its pointer operands.
1262 SmallVector<Constant *, 2> ConstantPtrOps;
1263 SmallVector<Value *, 2> PtrOps = getPointerOperands(V, *DL, TTI);
1264 for (Value *PtrOperand : PtrOps) {
1265 auto I = InferredAddrSpace.find(PtrOperand);
1266 unsigned OperandAS;
1267 if (I == InferredAddrSpace.end()) {
1268 OperandAS = PtrOperand->getType()->getPointerAddressSpace();
1269 if (auto *C = dyn_cast<Constant>(PtrOperand);
1270 C && OperandAS == FlatAddrSpace) {
1271 // Defer joining the address space of constant pointer operands.
1272 ConstantPtrOps.push_back(C);
1273 continue;
1274 }
1275 if (OperandAS == FlatAddrSpace) {
1276 // Check AC for assumption dominating V.
1277 unsigned AS = getPredicatedAddrSpace(*PtrOperand, &V);
1278 if (AS != UninitializedAddressSpace) {
1280 << " deduce operand AS from the predicate addrspace "
1281 << AS << '\n');
1282 OperandAS = AS;
1283 // Record this use with the predicated AS.
1284 PredicatedAS[std::make_pair(&V, PtrOperand)] = OperandAS;
1285 }
1286 }
1287 } else
1288 OperandAS = I->second;
1289
1290 // join(flat, *) = flat. So we can break if NewAS is already flat.
1291 NewAS = joinAddressSpaces(NewAS, OperandAS);
1292 if (NewAS == FlatAddrSpace)
1293 break;
1294 }
1295
1296 if (NewAS != FlatAddrSpace && NewAS != UninitializedAddressSpace) {
1297 if (any_of(ConstantPtrOps, [=](Constant *C) {
1298 return !isSafeToCastConstAddrSpace(C, NewAS);
1299 }))
1300 NewAS = FlatAddrSpace;
1301 }
1302
1303 // operator(flat const, flat const, ...) -> flat
1304 if (NewAS == UninitializedAddressSpace &&
1305 PtrOps.size() == ConstantPtrOps.size())
1306 NewAS = FlatAddrSpace;
1307 }
1308
1309 unsigned OldAS = InferredAddrSpace.lookup(&V);
1310 assert(OldAS != FlatAddrSpace);
1311 if (OldAS == NewAS)
1312 return false;
1313
1314 // If any updates are made, grabs its users to the worklist because
1315 // their address spaces can also be possibly updated.
1316 LLVM_DEBUG(dbgs() << " to " << NewAS << '\n');
1317 InferredAddrSpace[&V] = NewAS;
1318 return true;
1319}
1320
1321/// Replace operand \p OpIdx in \p Inst, if the value is the same as \p OldVal
1322/// with \p NewVal.
1323static bool replaceOperandIfSame(Instruction *Inst, unsigned OpIdx,
1324 Value *OldVal, Value *NewVal) {
1325 Use &U = Inst->getOperandUse(OpIdx);
1326 if (U.get() == OldVal) {
1327 U.set(NewVal);
1328 return true;
1329 }
1330
1331 return false;
1332}
1333
1334template <typename InstrType>
1336 InstrType *MemInstr, unsigned AddrSpace,
1337 Value *OldV, Value *NewV) {
1338 if (!MemInstr->isVolatile() || TTI.hasVolatileVariant(MemInstr, AddrSpace)) {
1339 return replaceOperandIfSame(MemInstr, InstrType::getPointerOperandIndex(),
1340 OldV, NewV);
1341 }
1342
1343 return false;
1344}
1345
1346/// If \p OldV is used as the pointer operand of a compatible memory operation
1347/// \p Inst, replaces the pointer operand with NewV.
1348///
1349/// This covers memory instructions with a single pointer operand that can have
1350/// its address space changed by simply mutating the use to a new value.
1351///
1352/// \p returns true the user replacement was made.
1354 User *Inst, unsigned AddrSpace,
1355 Value *OldV, Value *NewV) {
1356 if (auto *LI = dyn_cast<LoadInst>(Inst))
1357 return replaceSimplePointerUse(TTI, LI, AddrSpace, OldV, NewV);
1358
1359 if (auto *SI = dyn_cast<StoreInst>(Inst))
1360 return replaceSimplePointerUse(TTI, SI, AddrSpace, OldV, NewV);
1361
1362 if (auto *RMW = dyn_cast<AtomicRMWInst>(Inst))
1363 return replaceSimplePointerUse(TTI, RMW, AddrSpace, OldV, NewV);
1364
1365 if (auto *CmpX = dyn_cast<AtomicCmpXchgInst>(Inst))
1366 return replaceSimplePointerUse(TTI, CmpX, AddrSpace, OldV, NewV);
1367
1368 return false;
1369}
1370
1371/// Update memory intrinsic uses that require more complex processing than
1372/// simple memory instructions. These require re-mangling and may have multiple
1373/// pointer operands.
1375 Value *NewV) {
1376 IRBuilder<> B(MI);
1377 if (auto *MSI = dyn_cast<MemSetInst>(MI)) {
1378 B.CreateMemSet(NewV, MSI->getValue(), MSI->getLength(), MSI->getDestAlign(),
1379 false, // isVolatile
1380 MI->getAAMetadata());
1381 } else if (auto *MTI = dyn_cast<MemTransferInst>(MI)) {
1382 Value *Src = MTI->getRawSource();
1383 Value *Dest = MTI->getRawDest();
1384
1385 // Be careful in case this is a self-to-self copy.
1386 if (Src == OldV)
1387 Src = NewV;
1388
1389 if (Dest == OldV)
1390 Dest = NewV;
1391
1392 if (auto *MCI = dyn_cast<MemCpyInst>(MTI)) {
1393 if (MCI->isForceInlined())
1394 B.CreateMemCpyInline(Dest, MTI->getDestAlign(), Src,
1395 MTI->getSourceAlign(), MTI->getLength(),
1396 false, // isVolatile
1397 MI->getAAMetadata());
1398 else
1399 B.CreateMemCpy(Dest, MTI->getDestAlign(), Src, MTI->getSourceAlign(),
1400 MTI->getLength(),
1401 false, // isVolatile
1402 MI->getAAMetadata());
1403 } else {
1405 B.CreateMemMove(Dest, MTI->getDestAlign(), Src, MTI->getSourceAlign(),
1406 MTI->getLength(),
1407 false, // isVolatile
1408 MI->getAAMetadata());
1409 }
1410 } else
1411 llvm_unreachable("unhandled MemIntrinsic");
1412
1413 MI->eraseFromParent();
1414 return true;
1415}
1416
1417// \p returns true if it is OK to change the address space of constant \p C with
1418// a ConstantExpr addrspacecast.
1419bool InferAddressSpacesImpl::isSafeToCastConstAddrSpace(Constant *C,
1420 unsigned NewAS) const {
1422
1423 unsigned SrcAS = C->getType()->getPointerAddressSpace();
1424 if (SrcAS == NewAS || isa<UndefValue>(C))
1425 return true;
1426
1427 // Prevent illegal casts between different non-flat address spaces.
1428 if (SrcAS != FlatAddrSpace && NewAS != FlatAddrSpace)
1429 return false;
1430
1432 return true;
1433
1434 if (auto *Op = dyn_cast<Operator>(C)) {
1435 // If we already have a constant addrspacecast, it should be safe to cast it
1436 // off.
1437 if (Op->getOpcode() == Instruction::AddrSpaceCast)
1438 return isSafeToCastConstAddrSpace(cast<Constant>(Op->getOperand(0)),
1439 NewAS);
1440
1441 if (Op->getOpcode() == Instruction::IntToPtr &&
1442 Op->getType()->getPointerAddressSpace() == FlatAddrSpace)
1443 return true;
1444 }
1445
1446 return false;
1447}
1448
1450 Value::use_iterator End) {
1451 User *CurUser = I->getUser();
1452 ++I;
1453
1454 while (I != End && I->getUser() == CurUser)
1455 ++I;
1456
1457 return I;
1458}
1459
1460void InferAddressSpacesImpl::performPointerReplacement(
1461 Value *V, Value *NewV, Use &U, ValueToValueMapTy &ValueWithNewAddrSpace,
1462 SmallVectorImpl<Instruction *> &DeadInstructions) const {
1463
1464 User *CurUser = U.getUser();
1465
1466 unsigned AddrSpace = V->getType()->getPointerAddressSpace();
1467 if (replaceIfSimplePointerUse(*TTI, CurUser, AddrSpace, V, NewV))
1468 return;
1469
1470 // Skip if the current user is the new value itself.
1471 if (CurUser == NewV)
1472 return;
1473
1474 auto *CurUserI = dyn_cast<Instruction>(CurUser);
1475 if (!CurUserI || CurUserI->getFunction() != F)
1476 return;
1477
1478 // Handle more complex cases like intrinsic that need to be remangled.
1479 if (auto *MI = dyn_cast<MemIntrinsic>(CurUser)) {
1480 if (!MI->isVolatile() && handleMemIntrinsicPtrUse(MI, V, NewV))
1481 return;
1482 }
1483
1484 if (auto *II = dyn_cast<IntrinsicInst>(CurUser)) {
1485 if (rewriteIntrinsicOperands(II, V, NewV))
1486 return;
1487 }
1488
1489 if (ICmpInst *Cmp = dyn_cast<ICmpInst>(CurUserI)) {
1490 // If we can infer that both pointers are in the same addrspace,
1491 // transform e.g.
1492 // %cmp = icmp eq float* %p, %q
1493 // into
1494 // %cmp = icmp eq float addrspace(3)* %new_p, %new_q
1495
1496 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
1497 int SrcIdx = U.getOperandNo();
1498 int OtherIdx = (SrcIdx == 0) ? 1 : 0;
1499 Value *OtherSrc = Cmp->getOperand(OtherIdx);
1500
1501 if (Value *OtherNewV = ValueWithNewAddrSpace.lookup(OtherSrc)) {
1502 if (OtherNewV->getType()->getPointerAddressSpace() == NewAS) {
1503 Cmp->setOperand(OtherIdx, OtherNewV);
1504 Cmp->setOperand(SrcIdx, NewV);
1505 return;
1506 }
1507 }
1508
1509 // Even if the type mismatches, we can cast the constant.
1510 if (auto *KOtherSrc = dyn_cast<Constant>(OtherSrc)) {
1511 if (isSafeToCastConstAddrSpace(KOtherSrc, NewAS)) {
1512 Cmp->setOperand(SrcIdx, NewV);
1513 Cmp->setOperand(OtherIdx, ConstantExpr::getAddrSpaceCast(
1514 KOtherSrc, NewV->getType()));
1515 return;
1516 }
1517 }
1518 }
1519
1520 if (AddrSpaceCastInst *ASC = dyn_cast<AddrSpaceCastInst>(CurUserI)) {
1521 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
1522 if (ASC->getDestAddressSpace() == NewAS) {
1523 ASC->replaceAllUsesWith(NewV);
1524 DeadInstructions.push_back(ASC);
1525 return;
1526 }
1527 }
1528
1529 // Otherwise, replaces the use with flat(NewV).
1530 if (isa<Instruction>(V) || isa<Instruction>(NewV)) {
1531 // Don't create a copy of the original addrspacecast.
1532 if (U == V && isa<AddrSpaceCastInst>(V))
1533 return;
1534
1535 // Insert the addrspacecast after NewV.
1536 BasicBlock::iterator InsertPos;
1537 if (Instruction *NewVInst = dyn_cast<Instruction>(NewV))
1538 InsertPos = std::next(NewVInst->getIterator());
1539 else
1540 InsertPos = std::next(cast<Instruction>(V)->getIterator());
1541
1542 while (isa<PHINode>(InsertPos))
1543 ++InsertPos;
1544 // This instruction may contain multiple uses of V, update them all.
1545 CurUser->replaceUsesOfWith(
1546 V, new AddrSpaceCastInst(NewV, V->getType(), "", InsertPos));
1547 } else {
1548 CurUserI->replaceUsesOfWith(
1549 V, ConstantExpr::getAddrSpaceCast(cast<Constant>(NewV), V->getType()));
1550 }
1551}
1552
1553bool InferAddressSpacesImpl::rewriteWithNewAddressSpaces(
1554 ArrayRef<WeakTrackingVH> Postorder,
1555 const ValueToAddrSpaceMapTy &InferredAddrSpace,
1556 const PredicatedAddrSpaceMapTy &PredicatedAS) const {
1557 // For each address expression to be modified, creates a clone of it with its
1558 // pointer operands converted to the new address space. Since the pointer
1559 // operands are converted, the clone is naturally in the new address space by
1560 // construction.
1561 ValueToValueMapTy ValueWithNewAddrSpace;
1562 SmallVector<const Use *, 32> PoisonUsesToFix;
1563 for (Value *V : Postorder) {
1564 unsigned NewAddrSpace = InferredAddrSpace.lookup(V);
1565
1566 // In some degenerate cases (e.g. invalid IR in unreachable code), we may
1567 // not even infer the value to have its original address space.
1568 if (NewAddrSpace == UninitializedAddressSpace)
1569 continue;
1570
1571 if (V->getType()->getPointerAddressSpace() != NewAddrSpace) {
1572 Value *New =
1573 cloneValueWithNewAddressSpace(V, NewAddrSpace, ValueWithNewAddrSpace,
1574 PredicatedAS, &PoisonUsesToFix);
1575 if (New)
1576 ValueWithNewAddrSpace[V] = New;
1577 }
1578 }
1579
1580 if (ValueWithNewAddrSpace.empty())
1581 return false;
1582
1583 // Fixes all the poison uses generated by cloneInstructionWithNewAddressSpace.
1584 for (const Use *PoisonUse : PoisonUsesToFix) {
1585 User *V = PoisonUse->getUser();
1586 User *NewV = cast_or_null<User>(ValueWithNewAddrSpace.lookup(V));
1587 if (!NewV)
1588 continue;
1589
1590 unsigned OperandNo = PoisonUse->getOperandNo();
1591 assert(isa<PoisonValue>(NewV->getOperand(OperandNo)));
1592 WeakTrackingVH NewOp = ValueWithNewAddrSpace.lookup(PoisonUse->get());
1593 assert(NewOp &&
1594 "poison replacements in ValueWithNewAddrSpace shouldn't be null");
1595 NewV->setOperand(OperandNo, NewOp);
1596 }
1597
1598 SmallVector<Instruction *, 16> DeadInstructions;
1599 ValueToValueMapTy VMap;
1600 ValueMapper VMapper(VMap, RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
1601
1602 // Replaces the uses of the old address expressions with the new ones.
1603 for (const WeakTrackingVH &WVH : Postorder) {
1604 assert(WVH && "value was unexpectedly deleted");
1605 Value *V = WVH;
1606 Value *NewV = ValueWithNewAddrSpace.lookup(V);
1607 if (NewV == nullptr)
1608 continue;
1609
1610 LLVM_DEBUG(dbgs() << "Replacing the uses of " << *V << "\n with\n "
1611 << *NewV << '\n');
1612
1613 if (Constant *C = dyn_cast<Constant>(V)) {
1614 Constant *Replace =
1616 if (C != Replace) {
1617 LLVM_DEBUG(dbgs() << "Inserting replacement const cast: " << Replace
1618 << ": " << *Replace << '\n');
1619 SmallVector<User *, 16> WorkList;
1620 for (User *U : make_early_inc_range(C->users())) {
1621 if (auto *I = dyn_cast<Instruction>(U)) {
1622 if (I->getFunction() == F)
1623 I->replaceUsesOfWith(C, Replace);
1624 } else {
1625 WorkList.append(U->user_begin(), U->user_end());
1626 }
1627 }
1628 if (!WorkList.empty()) {
1629 VMap[C] = Replace;
1630 DenseSet<User *> Visited{WorkList.begin(), WorkList.end()};
1631 while (!WorkList.empty()) {
1632 User *U = WorkList.pop_back_val();
1633 if (auto *I = dyn_cast<Instruction>(U)) {
1634 if (I->getFunction() == F)
1635 VMapper.remapInstruction(*I);
1636 continue;
1637 }
1638 for (User *U2 : U->users())
1639 if (Visited.insert(U2).second)
1640 WorkList.push_back(U2);
1641 }
1642 }
1643 V = Replace;
1644 }
1645 }
1646
1647 Value::use_iterator I, E, Next;
1648 for (I = V->use_begin(), E = V->use_end(); I != E;) {
1649 Use &U = *I;
1650
1651 // Some users may see the same pointer operand in multiple operands. Skip
1652 // to the next instruction.
1653 I = skipToNextUser(I, E);
1654
1655 performPointerReplacement(V, NewV, U, ValueWithNewAddrSpace,
1656 DeadInstructions);
1657 }
1658
1659 if (V->use_empty()) {
1660 if (Instruction *I = dyn_cast<Instruction>(V))
1661 DeadInstructions.push_back(I);
1662 }
1663 }
1664
1665 // Deleting one instruction may recursively delete another queued
1666 // instruction. Create handles before the first deletion so overlapping
1667 // entries are nulled instead of leaving dangling pointers.
1668 auto DeadInstructionHandles =
1669 to_vector_of<WeakTrackingVH, 16>(DeadInstructions);
1670 RecursivelyDeleteTriviallyDeadInstructions(DeadInstructionHandles);
1671
1672 return true;
1673}
1674
1675bool InferAddressSpaces::runOnFunction(Function &F) {
1676 if (skipFunction(F))
1677 return false;
1678
1679 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
1680 DominatorTree *DT = DTWP ? &DTWP->getDomTree() : nullptr;
1681 return InferAddressSpacesImpl(
1682 getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F), DT,
1683 &getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F),
1684 FlatAddrSpace, /*AssumeDefaultIsFlatAddressSpace=*/false)
1685 .run(F);
1686}
1687
1689 return new InferAddressSpaces(AddressSpace);
1690}
1691
1693 bool AssumeDefaultIsFlatAddressSpace)
1694 : FlatAddrSpace(UninitializedAddressSpace),
1695 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
1697 unsigned AddressSpace, bool AssumeDefaultIsFlatAddressSpace)
1698 : FlatAddrSpace(AddressSpace),
1699 AssumeDefaultIsFlatAddressSpace(AssumeDefaultIsFlatAddressSpace) {}
1700
1703 bool Changed =
1704 InferAddressSpacesImpl(AM.getResult<AssumptionAnalysis>(F),
1706 &AM.getResult<TargetIRAnalysis>(F), FlatAddrSpace,
1707 AssumeDefaultIsFlatAddressSpace)
1708 .run(F);
1709 if (Changed) {
1712 return PA;
1713 }
1714 return PreservedAnalyses::all();
1715}
1716
1718 raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) {
1719 static_cast<PassInfoMixin<InferAddressSpacesPass> *>(this)->printPipeline(
1720 OS, MapClassName2PassName);
1721 if (AssumeDefaultIsFlatAddressSpace)
1722 OS << "<assume-default-is-flat-addrspace>";
1723}
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:344
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 replaceIfSimplePointerUse(const TargetTransformInfo &TTI, User *Inst, unsigned AddrSpace, Value *OldV, Value *NewV)
If OldV is used as the pointer operand of a compatible memory operation Inst, replaces the pointer op...
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 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 APInt computeMaxChangedPtrBits(const Operator *Op, const Value *Mask, const DataLayout &DL, AssumptionCache *AC, const DominatorTree *DT)
static bool replaceSimplePointerUse(const TargetTransformInfo &TTI, InstrType *MemInstr, unsigned AddrSpace, Value *OldV, Value *NewV)
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:231
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:377
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1509
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1262
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:278
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:312
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:2908
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 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:713
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 isValidAssumeForContext(const Instruction *I, const Instruction *CxtI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
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:522
@ 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
auto cast_or_null(const Y &Val)
Definition Casting.h:714
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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 void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=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...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
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
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
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.
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