[llvm] [InferAddressSpaces] Extend undef pointer operand support to phi inst (PR #159548)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 18 03:56:43 PDT 2025
================
@@ -1002,70 +1002,48 @@ bool InferAddressSpacesImpl::updateAddressSpace(
// isAddressExpression should guarantee that V is an operator or an argument.
assert(isa<Operator>(V) || isa<Argument>(V));
- if (isa<Operator>(V) &&
- cast<Operator>(V).getOpcode() == Instruction::Select) {
- const Operator &Op = cast<Operator>(V);
- Value *Src0 = Op.getOperand(1);
- Value *Src1 = Op.getOperand(2);
-
- auto I = InferredAddrSpace.find(Src0);
- unsigned Src0AS = (I != InferredAddrSpace.end())
- ? I->second
- : Src0->getType()->getPointerAddressSpace();
-
- auto J = InferredAddrSpace.find(Src1);
- unsigned Src1AS = (J != InferredAddrSpace.end())
- ? J->second
- : Src1->getType()->getPointerAddressSpace();
-
- auto *C0 = dyn_cast<Constant>(Src0);
- auto *C1 = dyn_cast<Constant>(Src1);
-
- // If one of the inputs is a constant, we may be able to do a constant
- // addrspacecast of it. Defer inferring the address space until the input
- // address space is known.
- if ((C1 && Src0AS == UninitializedAddressSpace) ||
- (C0 && Src1AS == UninitializedAddressSpace))
- return false;
-
- if (C0 && isSafeToCastConstAddrSpace(C0, Src1AS))
- NewAS = Src1AS;
- else if (C1 && isSafeToCastConstAddrSpace(C1, Src0AS))
- NewAS = Src0AS;
- else
- NewAS = joinAddressSpaces(Src0AS, Src1AS);
+ unsigned AS = TTI->getAssumedAddrSpace(&V);
+ if (AS != UninitializedAddressSpace) {
+ // Use the assumed address space directly.
+ NewAS = AS;
} else {
- unsigned AS = TTI->getAssumedAddrSpace(&V);
- if (AS != UninitializedAddressSpace) {
- // Use the assumed address space directly.
- NewAS = AS;
- } else {
- // Otherwise, infer the address space from its pointer operands.
- for (Value *PtrOperand : getPointerOperands(V, *DL, TTI)) {
- auto I = InferredAddrSpace.find(PtrOperand);
- unsigned OperandAS;
- if (I == InferredAddrSpace.end()) {
- OperandAS = PtrOperand->getType()->getPointerAddressSpace();
- if (OperandAS == FlatAddrSpace) {
- // Check AC for assumption dominating V.
- unsigned AS = getPredicatedAddrSpace(*PtrOperand, &V);
- if (AS != UninitializedAddressSpace) {
- LLVM_DEBUG(dbgs()
- << " deduce operand AS from the predicate addrspace "
- << AS << '\n');
- OperandAS = AS;
- // Record this use with the predicated AS.
- PredicatedAS[std::make_pair(&V, PtrOperand)] = OperandAS;
- }
+ // Otherwise, infer the address space from its pointer operands.
+ SmallVector<Constant *, 2> ConstantPtrOps;
+ for (Value *PtrOperand : getPointerOperands(V, *DL, TTI)) {
+ auto I = InferredAddrSpace.find(PtrOperand);
+ unsigned OperandAS;
+ if (I == InferredAddrSpace.end()) {
+ OperandAS = PtrOperand->getType()->getPointerAddressSpace();
+ if (auto *C = dyn_cast<Constant>(PtrOperand);
+ C && OperandAS == FlatAddrSpace) {
+ ConstantPtrOps.push_back(C);
+ continue;
+ }
+ if (OperandAS == FlatAddrSpace) {
+ // Check AC for assumption dominating V.
+ unsigned AS = getPredicatedAddrSpace(*PtrOperand, &V);
+ if (AS != UninitializedAddressSpace) {
+ LLVM_DEBUG(dbgs()
+ << " deduce operand AS from the predicate addrspace "
+ << AS << '\n');
+ OperandAS = AS;
+ // Record this use with the predicated AS.
+ PredicatedAS[std::make_pair(&V, PtrOperand)] = OperandAS;
}
- } else
- OperandAS = I->second;
+ }
+ } else
+ OperandAS = I->second;
- // join(flat, *) = flat. So we can break if NewAS is already flat.
- NewAS = joinAddressSpaces(NewAS, OperandAS);
- if (NewAS == FlatAddrSpace)
- break;
- }
+ // join(flat, *) = flat. So we can break if NewAS is already flat.
+ NewAS = joinAddressSpaces(NewAS, OperandAS);
+ if (NewAS == FlatAddrSpace)
+ break;
+ }
+ if (NewAS != FlatAddrSpace && NewAS != UninitializedAddressSpace) {
+ if (any_of(ConstantPtrOps, [&](Constant *C) {
----------------
arsenm wrote:
Agree on not using reference capture
https://github.com/llvm/llvm-project/pull/159548
More information about the llvm-commits
mailing list