Skip to content

Commit 074ea2a

Browse files
authored
Use getPointerAddressSpace instead of cast<PointerType>.getAddressSpace. (#54113)
The former also handles vectors of pointers, which can occur after vectorization: ``` #5 0x00007f5bfe94de5e in llvm::cast<llvm::PointerType, llvm::Type> (Val=<optimized out>) at llvm/Support/Casting.h:578 578 assert(isa<To>(Val) && "cast<Ty>() argument of incompatible type!"); (rr) up #6 GCInvariantVerifier::visitAddrSpaceCastInst (this=this@entry=0x7ffd022fbf56, I=...) at julia/src/llvm-gc-invariant-verifier.cpp:66 66 unsigned ToAS = cast<PointerType>(I.getDestTy())->getAddressSpace(); (rr) call I.dump() %23 = addrspacecast <4 x ptr addrspace(10)> %wide.load to <4 x ptr addrspace(11)>, !dbg !43 ``` Fixes aborts seen in #53070
1 parent 3364aa5 commit 074ea2a

5 files changed

+36
-21
lines changed

src/cgutils.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ static Value *maybe_decay_untracked(jl_codectx_t &ctx, Value *V)
5757
static Value *decay_derived(jl_codectx_t &ctx, Value *V)
5858
{
5959
Type *T = V->getType();
60-
if (cast<PointerType>(T)->getAddressSpace() == AddressSpace::Derived)
60+
if (T->getPointerAddressSpace() == AddressSpace::Derived)
6161
return V;
6262
// Once llvm deletes pointer element types, we won't need it here any more either.
6363
Type *NewT = PointerType::getWithSamePointeeType(cast<PointerType>(T), AddressSpace::Derived);
@@ -68,7 +68,7 @@ static Value *decay_derived(jl_codectx_t &ctx, Value *V)
6868
static Value *maybe_decay_tracked(jl_codectx_t &ctx, Value *V)
6969
{
7070
Type *T = V->getType();
71-
if (cast<PointerType>(T)->getAddressSpace() != AddressSpace::Tracked)
71+
if (T->getPointerAddressSpace() != AddressSpace::Tracked)
7272
return V;
7373
Type *NewT = PointerType::getWithSamePointeeType(cast<PointerType>(T), AddressSpace::Derived);
7474
return ctx.builder.CreateAddrSpaceCast(V, NewT);
@@ -295,7 +295,7 @@ void jl_debugcache_t::initialize(Module *m) {
295295

296296
static Value *emit_pointer_from_objref(jl_codectx_t &ctx, Value *V)
297297
{
298-
unsigned AS = cast<PointerType>(V->getType())->getAddressSpace();
298+
unsigned AS = V->getType()->getPointerAddressSpace();
299299
if (AS != AddressSpace::Tracked && AS != AddressSpace::Derived)
300300
return V;
301301
V = decay_derived(ctx, V);

src/llvm-alloc-opt.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1067,10 +1067,11 @@ void Optimizer::splitOnStack(CallInst *orig_inst)
10671067
store_ty = T_pjlvalue;
10681068
}
10691069
else {
1070-
store_ty = PointerType::getWithSamePointeeType(T_pjlvalue, cast<PointerType>(store_ty)->getAddressSpace());
1070+
store_ty = PointerType::getWithSamePointeeType(
1071+
T_pjlvalue, store_ty->getPointerAddressSpace());
10711072
store_val = builder.CreateBitCast(store_val, store_ty);
10721073
}
1073-
if (cast<PointerType>(store_ty)->getAddressSpace() != AddressSpace::Tracked)
1074+
if (store_ty->getPointerAddressSpace() != AddressSpace::Tracked)
10741075
store_val = builder.CreateAddrSpaceCast(store_val, pass.T_prjlvalue);
10751076
newstore = builder.CreateStore(store_val, slot.slot);
10761077
}

src/llvm-gc-invariant-verifier.cpp

+15-14
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ struct GCInvariantVerifier : public InstVisitor<GCInvariantVerifier> {
6262
};
6363

6464
void GCInvariantVerifier::visitAddrSpaceCastInst(AddrSpaceCastInst &I) {
65-
unsigned FromAS = cast<PointerType>(I.getSrcTy())->getAddressSpace();
66-
unsigned ToAS = cast<PointerType>(I.getDestTy())->getAddressSpace();
65+
unsigned FromAS = I.getSrcTy()->getPointerAddressSpace();
66+
unsigned ToAS = I.getDestTy()->getPointerAddressSpace();
6767
if (FromAS == 0)
6868
return;
6969
Check(ToAS != AddressSpace::Loaded && FromAS != AddressSpace::Loaded,
@@ -78,10 +78,10 @@ void GCInvariantVerifier::visitAddrSpaceCastInst(AddrSpaceCastInst &I) {
7878
}
7979

8080
void GCInvariantVerifier::checkStoreInst(Type *VTy, unsigned AS, Value &SI) {
81-
if (VTy->isPointerTy()) {
81+
if (VTy->isPtrOrPtrVectorTy()) {
8282
/* We currently don't obey this for arguments. That's ok - they're
8383
externally rooted. */
84-
unsigned AS = cast<PointerType>(VTy)->getAddressSpace();
84+
unsigned AS = VTy->getPointerAddressSpace();
8585
Check(AS != AddressSpace::CalleeRooted &&
8686
AS != AddressSpace::Derived,
8787
"Illegal store of decayed value", &SI);
@@ -107,15 +107,15 @@ void GCInvariantVerifier::visitAtomicCmpXchgInst(AtomicCmpXchgInst &SI) {
107107

108108
void GCInvariantVerifier::visitLoadInst(LoadInst &LI) {
109109
Type *Ty = LI.getType();
110-
if (Ty->isPointerTy()) {
111-
unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
110+
if (Ty->isPtrOrPtrVectorTy()) {
111+
unsigned AS = Ty->getPointerAddressSpace();
112112
Check(AS != AddressSpace::CalleeRooted &&
113113
AS != AddressSpace::Derived,
114114
"Illegal load of gc relevant value", &LI);
115115
}
116116
Ty = LI.getPointerOperand()->getType();
117-
if (Ty->isPointerTy()) {
118-
unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
117+
if (Ty->isPtrOrPtrVectorTy()) {
118+
unsigned AS = Ty->getPointerAddressSpace();
119119
Check(AS != AddressSpace::CalleeRooted,
120120
"Illegal load of callee rooted value", &LI);
121121
}
@@ -129,18 +129,18 @@ void GCInvariantVerifier::visitReturnInst(ReturnInst &RI) {
129129
if (!RI.getReturnValue())
130130
return;
131131
Type *RTy = RI.getReturnValue()->getType();
132-
if (!RTy->isPointerTy())
132+
if (!RTy->isPtrOrPtrVectorTy())
133133
return;
134-
unsigned AS = cast<PointerType>(RTy)->getAddressSpace();
134+
unsigned AS = RTy->getPointerAddressSpace();
135135
Check(!isSpecialAS(AS) || AS == AddressSpace::Tracked,
136136
"Only gc tracked values may be directly returned", &RI);
137137
}
138138

139139
void GCInvariantVerifier::visitGetElementPtrInst(GetElementPtrInst &GEP) {
140140
Type *Ty = GEP.getType();
141-
if (!Ty->isPointerTy())
141+
if (!Ty->isPtrOrPtrVectorTy())
142142
return;
143-
unsigned AS = cast<PointerType>(Ty)->getAddressSpace();
143+
unsigned AS = Ty->getPointerAddressSpace();
144144
if (!isSpecialAS(AS))
145145
return;
146146
/* We're actually ok with GEPs here, as long as they don't feed into any
@@ -170,8 +170,9 @@ void GCInvariantVerifier::visitCallInst(CallInst &CI) {
170170
continue;
171171
}
172172
Type *Ty = Arg->getType();
173-
Check(Ty->isPointerTy() && cast<PointerType>(Ty)->getAddressSpace() == AddressSpace::Tracked,
174-
"Invalid derived pointer in jlcall", &CI);
173+
Check(Ty->isPtrOrPtrVectorTy() &&
174+
Ty->getPointerAddressSpace() == AddressSpace::Tracked,
175+
"Invalid derived pointer in jlcall", &CI);
175176
}
176177
}
177178
}

src/llvm-propagate-addrspaces.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct PropagateJuliaAddrspacesVisitor : public InstVisitor<PropagateJuliaAddrsp
6060
};
6161

6262
static unsigned getValueAddrSpace(Value *V) {
63-
return cast<PointerType>(V->getType())->getAddressSpace();
63+
return V->getType()->getPointerAddressSpace();
6464
}
6565

6666
static bool isSpecialAS(unsigned AS) {
@@ -139,7 +139,7 @@ Value *PropagateJuliaAddrspacesVisitor::LiftPointer(Module *M, Value *V, Instruc
139139
break;
140140
} else {
141141
// Ok, we've reached a leaf - check if it is eligible for lifting
142-
if (!CurrentV->getType()->isPointerTy() ||
142+
if (!CurrentV->getType()->isPtrOrPtrVectorTy() ||
143143
isSpecialAS(getValueAddrSpace(CurrentV))) {
144144
// If not, poison all (recursive) users of this value, to prevent
145145
// looking at them again in future iterations.
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
; This file is a part of Julia. License is MIT: https://julialang.org/license
2+
3+
; RUN: opt -enable-new-pm=1 --opaque-pointers=1 --load-pass-plugin=libjulia-codegen%shlibext -passes='function(GCInvariantVerifier)' -S %s | FileCheck %s
4+
5+
; CHECK-LABEL: @vectorized_addrspacecast
6+
define ptr addrspace(10) @vectorized_addrspacecast() {
7+
top:
8+
ret ptr addrspace(10) null
9+
10+
vector.ph:
11+
%0 = addrspacecast <4 x ptr addrspace(10)> zeroinitializer to <4 x ptr addrspace(11)>
12+
unreachable
13+
}

0 commit comments

Comments
 (0)