From 3b4e670261df7a154e9372774552374503687c3e Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 18 Sep 2025 12:20:57 +0200 Subject: [PATCH 1/5] [InferAddressSpaces] Extend undef pointer operand support to phi inst Previously undef pointer operand is only supported for select inst, where undef in generic AS behaves like `take the other side`. This PR extends the support to other instructions, e.g. phi inst. Defer joining and inferring constant pointer operand until all other operand AS states considered. --- .../Transforms/Scalar/InferAddressSpaces.cpp | 100 +++++++----------- .../InferAddressSpaces/AMDGPU/phi-undef.ll | 36 +++++++ 2 files changed, 75 insertions(+), 61 deletions(-) create mode 100644 llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp index a097d338a42ca..fffed5c7ce9aa 100644 --- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -1002,70 +1002,48 @@ bool InferAddressSpacesImpl::updateAddressSpace( // isAddressExpression should guarantee that V is an operator or an argument. assert(isa(V) || isa(V)); - if (isa(V) && - cast(V).getOpcode() == Instruction::Select) { - const Operator &Op = cast(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(Src0); - auto *C1 = dyn_cast(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 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(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) { + return !isSafeToCastConstAddrSpace(C, NewAS); + })) + NewAS = FlatAddrSpace; } } diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll new file mode 100644 index 0000000000000..c1fd05ceb8a4e --- /dev/null +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll @@ -0,0 +1,36 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -S -passes=infer-address-spaces %s | FileCheck %s + +define void @phi_undef(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { +; CHECK-LABEL: @phi_undef( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() +; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] +; CHECK: leader: +; CHECK-NEXT: br label [[MERGE]] +; CHECK: merge: +; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ undef, [[ENTRY:%.*]] ] +; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ undef, [[ENTRY]] ] +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> +; CHECK-NEXT: [[J:%.*]] = load i8, ptr addrspace(1) [[I]], align 1 +; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer +; CHECK-NEXT: ret void +; +entry: + %0 = call i1 @is_leader() + br i1 %0, label %leader, label %merge + +leader: + %cast = addrspacecast ptr addrspace(1) %arg to ptr + %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> + br label %merge + +merge: + %i = phi ptr [%cast, %leader], [undef, %entry] + %i1 = phi <2 x ptr> [%cast1, %leader], [undef, %entry] + %j = load i8, ptr %i, align 1 + %j1 = icmp eq <2 x ptr> %i1, zeroinitializer + ret void +} + +declare i1 @is_leader() From 5f0423687005e918aeb132fb415e3ec531e6d2c3 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 18 Sep 2025 12:47:20 +0200 Subject: [PATCH 2/5] test poison --- .../InferAddressSpaces/AMDGPU/phi-poison.ll | 36 +++++++++++++++++++ .../InferAddressSpaces/AMDGPU/phi-undef.ll | 4 +-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll new file mode 100644 index 0000000000000..7e72b2a64715e --- /dev/null +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll @@ -0,0 +1,36 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -S -passes=infer-address-spaces %s | FileCheck %s + +define void @phi_poison(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { +; CHECK-LABEL: @phi_poison( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() +; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] +; CHECK: leader: +; CHECK-NEXT: br label [[MERGE]] +; CHECK: merge: +; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ poison, [[ENTRY:%.*]] ] +; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ poison, [[ENTRY]] ] +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> +; CHECK-NEXT: [[J:%.*]] = load i8, ptr addrspace(1) [[I]], align 1 +; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer +; CHECK-NEXT: ret void +; +entry: + %is.leader = call i1 @is_leader() + br i1 %is.leader, label %leader, label %merge + +leader: + %cast = addrspacecast ptr addrspace(1) %arg to ptr + %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> + br label %merge + +merge: + %i = phi ptr [%cast, %leader], [poison, %entry] + %i1 = phi <2 x ptr> [%cast1, %leader], [poison, %entry] + %j = load i8, ptr %i, align 1 + %j1 = icmp eq <2 x ptr> %i1, zeroinitializer + ret void +} + +declare i1 @is_leader() diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll index c1fd05ceb8a4e..bab897b1e2465 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll @@ -17,8 +17,8 @@ define void @phi_undef(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { ; CHECK-NEXT: ret void ; entry: - %0 = call i1 @is_leader() - br i1 %0, label %leader, label %merge + %is.leader = call i1 @is_leader() + br i1 %is.leader, label %leader, label %merge leader: %cast = addrspacecast ptr addrspace(1) %arg to ptr From ecc548d03d76d0b68d16ca5b204ccc75a0fd1449 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 18 Sep 2025 13:37:47 +0200 Subject: [PATCH 3/5] merge test, add a comment, update capture --- .../Transforms/Scalar/InferAddressSpaces.cpp | 1 + .../InferAddressSpaces/AMDGPU/phi-poison.ll | 36 ---------- .../AMDGPU/phi-undef-poison.ll | 68 +++++++++++++++++++ .../InferAddressSpaces/AMDGPU/phi-undef.ll | 36 ---------- 4 files changed, 69 insertions(+), 72 deletions(-) delete mode 100644 llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll create mode 100644 llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll delete mode 100644 llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp index fffed5c7ce9aa..0e83cf973cb56 100644 --- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -1016,6 +1016,7 @@ bool InferAddressSpacesImpl::updateAddressSpace( OperandAS = PtrOperand->getType()->getPointerAddressSpace(); if (auto *C = dyn_cast(PtrOperand); C && OperandAS == FlatAddrSpace) { + // Defer joining the address space of constant pointer operands. ConstantPtrOps.push_back(C); continue; } diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll deleted file mode 100644 index 7e72b2a64715e..0000000000000 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll +++ /dev/null @@ -1,36 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -S -passes=infer-address-spaces %s | FileCheck %s - -define void @phi_poison(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { -; CHECK-LABEL: @phi_poison( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() -; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] -; CHECK: leader: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ poison, [[ENTRY:%.*]] ] -; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ poison, [[ENTRY]] ] -; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> -; CHECK-NEXT: [[J:%.*]] = load i8, ptr addrspace(1) [[I]], align 1 -; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer -; CHECK-NEXT: ret void -; -entry: - %is.leader = call i1 @is_leader() - br i1 %is.leader, label %leader, label %merge - -leader: - %cast = addrspacecast ptr addrspace(1) %arg to ptr - %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> - br label %merge - -merge: - %i = phi ptr [%cast, %leader], [poison, %entry] - %i1 = phi <2 x ptr> [%cast1, %leader], [poison, %entry] - %j = load i8, ptr %i, align 1 - %j1 = icmp eq <2 x ptr> %i1, zeroinitializer - ret void -} - -declare i1 @is_leader() diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll new file mode 100644 index 0000000000000..3fb640edec8ff --- /dev/null +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll @@ -0,0 +1,68 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -S -passes=infer-address-spaces %s | FileCheck %s + +define void @phi_undef(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { +; CHECK-LABEL: @phi_undef( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() +; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] +; CHECK: leader: +; CHECK-NEXT: br label [[MERGE]] +; CHECK: merge: +; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ undef, [[ENTRY:%.*]] ] +; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ undef, [[ENTRY]] ] +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> +; CHECK-NEXT: [[J:%.*]] = icmp eq ptr addrspace(1) [[I]], addrspacecast (ptr null to ptr addrspace(1)) +; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer +; CHECK-NEXT: ret void +; +entry: + %is = call i1 @is_leader() + br i1 %is, label %leader, label %merge + +leader: + %cast = addrspacecast ptr addrspace(1) %arg to ptr + %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> + br label %merge + +merge: + %i = phi ptr [%cast, %leader], [undef, %entry] + %i1 = phi <2 x ptr> [%cast1, %leader], [undef, %entry] + %j = icmp eq ptr %i, null + %j1 = icmp eq <2 x ptr> %i1, zeroinitializer + ret void +} + +define void @phi_poison(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { +; CHECK-LABEL: @phi_poison( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() +; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] +; CHECK: leader: +; CHECK-NEXT: br label [[MERGE]] +; CHECK: merge: +; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ poison, [[ENTRY:%.*]] ] +; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ poison, [[ENTRY]] ] +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> +; CHECK-NEXT: [[J:%.*]] = icmp eq ptr addrspace(1) [[I]], addrspacecast (ptr null to ptr addrspace(1)) +; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer +; CHECK-NEXT: ret void +; +entry: + %is = call i1 @is_leader() + br i1 %is, label %leader, label %merge + +leader: + %cast = addrspacecast ptr addrspace(1) %arg to ptr + %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> + br label %merge + +merge: + %i = phi ptr [%cast, %leader], [poison, %entry] + %i1 = phi <2 x ptr> [%cast1, %leader], [poison, %entry] + %j = icmp eq ptr %i, null + %j1 = icmp eq <2 x ptr> %i1, zeroinitializer + ret void +} + +declare i1 @is_leader() diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll deleted file mode 100644 index bab897b1e2465..0000000000000 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef.ll +++ /dev/null @@ -1,36 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -S -passes=infer-address-spaces %s | FileCheck %s - -define void @phi_undef(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { -; CHECK-LABEL: @phi_undef( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() -; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] -; CHECK: leader: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ undef, [[ENTRY:%.*]] ] -; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ undef, [[ENTRY]] ] -; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> -; CHECK-NEXT: [[J:%.*]] = load i8, ptr addrspace(1) [[I]], align 1 -; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer -; CHECK-NEXT: ret void -; -entry: - %is.leader = call i1 @is_leader() - br i1 %is.leader, label %leader, label %merge - -leader: - %cast = addrspacecast ptr addrspace(1) %arg to ptr - %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> - br label %merge - -merge: - %i = phi ptr [%cast, %leader], [undef, %entry] - %i1 = phi <2 x ptr> [%cast1, %leader], [undef, %entry] - %j = load i8, ptr %i, align 1 - %j1 = icmp eq <2 x ptr> %i1, zeroinitializer - ret void -} - -declare i1 @is_leader() From 9c0780f054fcbca7a8982032c2be125ac5287c91 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Fri, 19 Sep 2025 02:23:37 +0200 Subject: [PATCH 4/5] remove undef test according to pre-commit undef deprecator fail --- .../{phi-undef-poison.ll => phi-poison.ll} | 32 ------------------- 1 file changed, 32 deletions(-) rename llvm/test/Transforms/InferAddressSpaces/AMDGPU/{phi-undef-poison.ll => phi-poison.ll} (53%) diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll similarity index 53% rename from llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll rename to llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll index 3fb640edec8ff..6c60d9748ebc7 100644 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-undef-poison.ll +++ b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/phi-poison.ll @@ -1,38 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -S -passes=infer-address-spaces %s | FileCheck %s -define void @phi_undef(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { -; CHECK-LABEL: @phi_undef( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = call i1 @is_leader() -; CHECK-NEXT: br i1 [[TMP0]], label [[LEADER:%.*]], label [[MERGE:%.*]] -; CHECK: leader: -; CHECK-NEXT: br label [[MERGE]] -; CHECK: merge: -; CHECK-NEXT: [[I:%.*]] = phi ptr addrspace(1) [ [[ARG:%.*]], [[LEADER]] ], [ undef, [[ENTRY:%.*]] ] -; CHECK-NEXT: [[I2:%.*]] = phi <2 x ptr addrspace(1)> [ [[ARG1:%.*]], [[LEADER]] ], [ undef, [[ENTRY]] ] -; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast <2 x ptr addrspace(1)> [[I2]] to <2 x ptr> -; CHECK-NEXT: [[J:%.*]] = icmp eq ptr addrspace(1) [[I]], addrspacecast (ptr null to ptr addrspace(1)) -; CHECK-NEXT: [[J1:%.*]] = icmp eq <2 x ptr> [[TMP1]], zeroinitializer -; CHECK-NEXT: ret void -; -entry: - %is = call i1 @is_leader() - br i1 %is, label %leader, label %merge - -leader: - %cast = addrspacecast ptr addrspace(1) %arg to ptr - %cast1 = addrspacecast <2 x ptr addrspace(1)> %arg1 to <2 x ptr> - br label %merge - -merge: - %i = phi ptr [%cast, %leader], [undef, %entry] - %i1 = phi <2 x ptr> [%cast1, %leader], [undef, %entry] - %j = icmp eq ptr %i, null - %j1 = icmp eq <2 x ptr> %i1, zeroinitializer - ret void -} - define void @phi_poison(ptr addrspace(1) %arg, <2 x ptr addrspace(1)> %arg1) { ; CHECK-LABEL: @phi_poison( ; CHECK-NEXT: entry: From 8bb4680dadbac2dfa6d98d1115bb1f2fd949cb30 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Fri, 19 Sep 2025 08:27:10 +0800 Subject: [PATCH 5/5] Update llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp Co-authored-by: Matt Arsenault --- llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp index 0e83cf973cb56..7363ec38a4e3a 100644 --- a/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp +++ b/llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp @@ -1041,7 +1041,7 @@ bool InferAddressSpacesImpl::updateAddressSpace( break; } if (NewAS != FlatAddrSpace && NewAS != UninitializedAddressSpace) { - if (any_of(ConstantPtrOps, [&](Constant *C) { + if (any_of(ConstantPtrOps, [=](Constant *C) { return !isSafeToCastConstAddrSpace(C, NewAS); })) NewAS = FlatAddrSpace;