Skip to content

Commit af9a7af

Browse files
authored
Make allocopt respect the GC verifier rules with non usual address spaces (#51520)
On AMDGPU, this was generating a `addrspace(10)` pointer to an `alloca` which is illegal and lead to other issues.
1 parent 5006db1 commit af9a7af

File tree

2 files changed

+7
-8
lines changed

2 files changed

+7
-8
lines changed

src/llvm-alloc-opt.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -642,8 +642,6 @@ void Optimizer::moveToStack(CallInst *orig_inst, size_t sz, bool has_ref)
642642
}
643643
insertLifetime(ptr, ConstantInt::get(Type::getInt64Ty(prolog_builder.getContext()), sz), orig_inst);
644644
Instruction *new_inst = cast<Instruction>(prolog_builder.CreateBitCast(ptr, JuliaType::get_pjlvalue_ty(prolog_builder.getContext(), buff->getType()->getPointerAddressSpace())));
645-
if (orig_inst->getModule()->getDataLayout().getAllocaAddrSpace() != 0)
646-
new_inst = cast<Instruction>(prolog_builder.CreateAddrSpaceCast(new_inst, JuliaType::get_pjlvalue_ty(prolog_builder.getContext(), orig_inst->getType()->getPointerAddressSpace())));
647645
new_inst->takeName(orig_inst);
648646

649647
auto simple_replace = [&] (Instruction *orig_i, Instruction *new_i) {
@@ -691,7 +689,7 @@ void Optimizer::moveToStack(CallInst *orig_inst, size_t sz, bool has_ref)
691689
else if (auto call = dyn_cast<CallInst>(user)) {
692690
auto callee = call->getCalledOperand();
693691
if (pass.pointer_from_objref_func == callee) {
694-
call->replaceAllUsesWith(new_i);
692+
call->replaceAllUsesWith(prolog_builder.CreateAddrSpaceCast(new_i, call->getCalledFunction()->getReturnType()));
695693
call->eraseFromParent();
696694
return;
697695
}

test/llvmpasses/alloc-opt-gcframe-addrspaces.ll

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@ declare {}* @julia.pointer_from_objref({} addrspace(11)*)
1717
; Test that non-0 addrspace allocas are properly emitted and handled
1818

1919
; CHECK-LABEL: @non_zero_addrspace
20-
; CHECK: %1 = alloca i32, align 8, addrspace(5)
20+
; TYPED: %1 = alloca i32, align 8, addrspace(5)
2121

2222
; TYPED: %2 = bitcast i32 addrspace(5)* %1 to i8 addrspace(5)*
23-
; TYPED: %3 = bitcast i8 addrspace(5)* %2 to {} addrspace(5)*
24-
; TYPED: %var1 = addrspacecast {} addrspace(5)* %3 to {} addrspace(10)*
23+
; TYPED: %var1 = bitcast i8 addrspace(5)* %2 to {} addrspace(5)*
24+
; TYPED: %3 = addrspacecast {} addrspace(5)* %var1 to {}*
2525
; TYPED: call void @llvm.lifetime.start.p5i8(i64 4, i8 addrspace(5)* %2)
2626

27-
; OPAQUE: %var1 = addrspacecast ptr addrspace(5) %1 to ptr addrspace(10)
28-
; OPAQUE: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) %1)
27+
; OPAQUE: %var1 = alloca i32, align 8, addrspace(5)
28+
; OPAQUE: %1 = addrspacecast ptr addrspace(5) %var1 to ptr
29+
; OPAQUE: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) %var1)
2930

3031
; CHECK: ret void
3132
define void @non_zero_addrspace() {

0 commit comments

Comments
 (0)